CUDA-Array-Reduzierung

Ich bin mir bewusst, dass es mehrere ähnliche Fragen gibt, die bereits beantwortet wurden, aber ich konnte nichts sehr Nützliches daraus zusammenstellen, außer dass ich wahrscheinlich etwas falsch indiziert habe.

Ich versuche, eine sequentielle Adressierungsreduktion von Eingangsvektor A in Ausgangsvektor B durchzuführen.

Den vollständigen Code finden Sie hierhttp://pastebin.com/7UGadgjX, aber das ist der Kernel:

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

Und dies sind die Kernel-Startanweisungen:

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

Ich erhalte einen nicht angegebenen Startfehler, der einem Segfault ähnelt. Ich habe die nvidia-Reduktionsdokumentation genau verfolgt und versucht, meinen Kernel innerhalb der Grenzen von numElements zu halten, aber es scheint mir etwas Wichtiges zu fehlen, wenn man bedenkt, wie einfach der Code ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage