OpenCL увеличивает число после каждого выполнения ядра - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть ядро, которое мне нужно выполнить несколько раз (используя clEnqueueNDRangeEnqueue), и одним из его аргументов является целое число, которое нужно увеличивать после каждого выполнения.

Вместо того, чтобы хост назначал увеличивающееся значение (используя clSetKernelArg) перед постановкой в ​​очередь каждого выполнения ядра, существует ли способ достижения "чисто на стороне устройства", например само ядро ​​увеличивает глобальное целое число после выполнения последнего рабочего элемента? (Я все еще новичок в OpenCL, так что, возможно, здесь лает не то дерево).

1 Ответ

0 голосов
/ 08 ноября 2018

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

kernel void my_kernel(__global int* counter, __global int* other_data, ...)
{
    // some operations on other_data, etc.

    // make sure that only one work item increments the counter to avoid race condition
    // the assumption is that kernel uses one dimension only
    if(get_local_id(0) == 0) 
        atomic_inc(counter); // need to use atomic function as kernels may run in parallel
}

Таким образом, чтобы подвести итог, а не добавить ответвление, заставив работать только один рабочий элемент и циклы растраты остальных, я бы продолжил использовать clSetKernelArg и счетчик приращений на стороне хоста. Есть операции, которые лучше подходят для графического процессора, и увеличение счетчика, скорее всего, не входит в их число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...