Как я могу использовать ядро ​​OpenCL для создания аккумулятора?

    __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 ++?

Спасибо!

0

Решение

Вам нужно использовать атомарные операции.

__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]);
}
}

Вам следует избегать их использования в максимально возможной степени, поскольку атомарные операции имеют тенденцию быть довольно медленными именно потому, что они обеспечивают правильную работу всех потоков.

4

Другие решения

Атомная сложность решит проблему суммирования

 __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 );
}
}
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector