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.