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, но мне кажется, что мне не хватает чего-то ключевого, учитывая, насколько простой код.