Redukcja macierzy CUDA

Zdaję sobie sprawę, że istnieje wiele pytań podobnych do tego, na które już udzielono odpowiedzi, ale nie byłem w stanie zebrać niczego bardzo pomocnego, poza tym, że prawdopodobnie coś nieprawidłowo indeksuję.

Usiłuję preformować redukcję adresowania sekwencyjnego wektora wejściowego A do wektora wyjściowego B.

Pełny kod jest dostępny tutajhttp://pastebin.com/7UGadgjX, ale to jest jądro:

__global__ void vectorSum(int *A, int *B, int numElements) {
  extern __shared__ int S[];
  // Each thread loads one element from global to shared memory
  int tid = threadIdx.x;
  int i = blockDim.x * blockIdx.x + threadIdx.x;
  if (i < numElements) {
    S[tid] = A[i];
    __syncthreads();
    // Reduce in shared memory
    for (int t = blockDim.x/2; t > 0; t>>=1) {
      if (tid < t) {
        S[tid] += S[tid + t];
      }
      __syncthreads();
    }
    if (tid == 0) B[blockIdx.x] = S[0];
  }
}

a są to instrukcje uruchamiania jądra:

// Launch the Vector Summation CUDA Kernel
  int threadsPerBlock = 256;
  int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
  vectorSum<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, numElements);

Dostaję nieokreślony błąd uruchamiania, który przeczytałem jest podobny do segfaultu. Dokładnie śledziłem dokumentację redukcji nvidii i próbowałem utrzymać jądro w granicach numElements, ale wydaje mi się, że brakuje mi jakiegoś klucza, biorąc pod uwagę, jak prosty jest ten kod.

questionAnswers(1)

yourAnswerToTheQuestion