CUDA Array Сокращение

Я знаю, что есть несколько вопросов, похожих на этот, на который уже дан ответ, но я не смог собрать что-то очень полезное из них, кроме того, что я, вероятно, неправильно что-то проиндексировал.

Я пытаюсь преобразовать последовательное уменьшение адресации на входном векторе A в выходной вектор B.

Полный код доступен здесьhttp://pastebin.com/7UGadgjX, но это ядро:

__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];
  }
}

и это операторы запуска ядра:

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

Я получаю неопределенную ошибку запуска, которую я прочитал, похож на segfault. Я внимательно следил за документацией по сокращению nvidia и пытался держать свое ядро в рамках numElements, но мне кажется, что мне не хватает чего-то ключевого, учитывая, насколько простой код.

Ответы на вопрос(1)

Ваш ответ на вопрос