この質問に似た質問が複数あることは承知していますが、何かを間違ってインデックス付けしている可能性があることを除けば、それらから非常に役立つものをまとめることができませんでした。
入力ベクトル 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);
私が読んだ特定されていない起動エラーは、セグメンテーション違反に似ています。私は nvidia リダクションのドキュメントを綿密にたどり、カーネルを numElements の範囲内に収めようとしましたが、コードがいかに単純であるかを考えると、何か重要なものが欠けているようです。