Я начинаю изучать OpenCl и как одну из задач, которые я должен написать, я программирую, который суммирует все элементы массива.
Программа должна быть простой, и я не знаю, что со мной не так сегодня, но она не работает. Ну, это так, но иногда это показывает неправильные результаты (иногда нет).
Чем больше элементов у нас есть, тем больше шансов получить неправильный результат (особенно после 16536)
Количество элементов всегда равно степени двух.
Может кто-нибудь сказать мне, что здесь не так?
Ядро:
__kernel void Reduction_InterleavedAddressing(__global uint* array, uint stride)
{
unsigned int i = get_global_id (0);
unsigned int size = get_global_size(0);
if ((i % stride*2) == 0 && (i + stride)<size){
array[i] += array[i+stride];
}
}
Вызов ядра:
unsigned int stride = 1;
clErr = clSetKernelArg(m_InterleavedAddressingKernel, 0, sizeof(cl_mem), (void*)&m_dPingArray);
for (; stride <= m_N / 2 ; stride*=2){
clErr = clSetKernelArg(m_InterleavedAddressingKernel, 1, sizeof(cl_int), (void*)&stride);
clErr = clEnqueueNDRangeKernel(CommandQueue, m_InterleavedAddressingKernel, 1, NULL, &globalWorkSize, LocalWorkSize, 0, NULL, NULL);
V_RETURN_CL(clErr, "Error executing kernel");
}
Спасибо за ваши советы заранее
Я проверяю это. Вы должны установить stride * 2
к (stride * 2
)! Для моего решения это сработало хорошо.
if ((i % (stride*2)) == 0 && (i + stride) < size) {
array[i] += array[i+stride];
}