我有一個簡單的內核是這樣的:寫作數組索引只適用於最後一個任務隊列
__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)。
我試圖積累在陣列(grid[0] += idx
)的第一個單元格的idx
參數的值,它給了我整數的預期總和從1
到size - 1
,因此參數被正確地傳遞和任務正確執行。
任何幫助表示讚賞!
我結束了使用'clEnqueueNDRangeKernel',它運作良好。仍然不確定爲什麼任務並行性在這種情況下不起作用。 'clEnqueueTask'在英特爾實施的OpenCL上被標記爲不推薦使用,但我不確定這與問題有任何關係 – Lev