У меня есть простое ядро, как это:Запись на индекс массива работает только для последней задачи в очереди
__kernel void cycle(__global int * grid, int idx) {
grid[idx] = idx;
}
и я бегу clEnqueueTask()
внутри цикла следующим образом:
for (int i = 0; i < size; i++) {
int arg = i;
clSetKernelArg(kernel_id, 1, &arg);
clEnqueueTask(command_queue, kernel_id, 0, NULL, NULL);
}
Ожидаемый результат массив [0 ...size - 1]
, но он устанавливает только последний индекс с соответствующим значением. Остальные остаются по умолчанию (в моем случае 0).
Я попытался накапливая значение параметра idx
в первой ячейке массива (grid[0] += idx
), и он дал мне ожидаемую сумму целых чисел от 1
до size - 1
, поэтому параметр получает правильно принят и задачи выполнены правильно.
Любая помощь приветствуется!
Я закончил использование 'clEnqueueNDRangeKernel', который хорошо работает. Все еще не уверен, почему параллелизм задач не работает в этом случае. 'clEnqueueTask' отмечен как устаревший на OpenCL, реализованный Intel, но я не уверен, что имеет какое-либо отношение к проблеме – Lev