__kernel void cl_test(__global int* Number)
{
int id = get_global_id(0);
if (id%5==0)
{
Number[0]++;
}
if (id%10==0)
{
Number[1]++;
}
}
Как видите, это очень простой тестовый код ядра OpenCL, и мне нужно собрать число, делимое на 5 и 10 в диапазоне.
Так вот в чем проблема:
так как расчет каждого рабочего элемента не является чисто параллельным, числа [0] или [1] в разных элементах связаны между собой.
Я не могу получить правильный результат, читая число [0] или число [1].
Есть ли какое-либо решение, подобное «глобальной переменной» в C ++?
Спасибо!
Вам нужно использовать атомарные операции.
__kernel void cl_test(__global int* Number)
{
int id = get_global_id(0);
if (id%5==0)
{
atomic_inc(Number);
}
if (id%10==0)
{
atomic_inc(&Number[1]);
}
}
Вам следует избегать их использования в максимально возможной степени, поскольку атомарные операции имеют тенденцию быть довольно медленными именно потому, что они обеспечивают правильную работу всех потоков.
Атомная сложность решит проблему суммирования
__kernel void cl_test(__global int* Number)
{
int id = get_global_id(0);
if (id%5==0)
{
atomic_add( Number, 1 );
}
if (id%10==0)
{
atomic_add( Number +1, 1 );
}
}