Эй, я пытаюсь написать ядро, чтобы по существу сделать следующее в C
float sum = 0.0;
for(int i = 0; i < N; i++){
sum += valueArray[i]*valueArray[i];
}
sum += sum / N;
В данный момент у меня это внутри моего ядра, но оно не дает правильных значений.
int i0 = blockIdx.x * blockDim.x + threadIdx.x;
for(int i=i0; i<N; i += blockDim.x*gridDim.x){
*d_sum += d_valueArray[i]*d_valueArray[i];
}
*d_sum= __fdividef(*d_sum, N);
Код, используемый для вызова ядра:
kernelName<<<64,128>>>(N, d_valueArray, d_sum);
cudaMemcpy(&sum, d_sum, sizeof(float) , cudaMemcpyDeviceToHost);
Я думаю, что каждое ядро вычисляет частичную сумму, но окончательный оператор деления не учитывает накопленное значение из каждого потока. Каждое ядро производит свое собственное окончательное значение для d_sum?
Кто-нибудь знает, как я могу сделать это эффективным способом? Может быть, использование общей памяти между потоками? Я очень новичок в программировании на GPU. Приветствия