所以我能夠編譯和執行我的內核,問題是隻有兩個工作項正在使用。我基本上試圖用{0,1,2,3,4,5,6,7}填充浮點數組[8]。所以這是一個非常簡單的Hello World應用程序。貝婁是我的核心。並非所有正在使用的工作項opencl
// Highly simplified to demonstrate
__kernel void rnd_float32_matrix (
__global float * res
) {
uint idx = get_global_id(0);
res[idx] = idx;
}
然後我創建並用下面的代碼執行內核...
// Some more code
cl::Program program(context, sources, &err);
program.build(devices, NULL, NULL, NULL);
cl::Kernel kernel(program, "rnd_float32_matrix", &err);
kernel.setArg(0, src_d);
cl::CommandQueue queue(context, devices[0], 0, &err);
cl::Event event;
err = queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(8),
// I've tried cl::NDRange(8) as well
cl::NDRange(1),
NULL,
&event
);
event.wait();
err = queue.enqueueReadBuffer(
// This is:
// cl::Buffer src_d(
// context,
// CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
// mem_size,
// src_h,
// &err);
src_d,
CL_TRUE,
0,
8,
// This is float * src_h = new float[8];
src_h);
for(int i = 0; i < 8; i ++) {
std::cout << src_h[i] << std::endl;
}
在代碼中我可能不會表現出來,但我也做選擇GPU設備和使用context.getInfo (..)它顯示我正在使用我的NVidia GTX 770M卡,其中顯示1024,1024,64工作項目在維度0,1和2可用。當這個數組打印我不斷... 0,1,0, 0,0,0,0,0。我也嘗試設置res [idx] = 5,我得到... 5,5,0,0,0,0,0,0。因此,似乎只有兩個給工作項目實際上正在使用。我究竟做錯了什麼?
我想,你太簡化了你的程序。 'res [idx] = inSeed'不清楚,因爲'inSeed'的初始化沒有顯示。 – Christian
嘗試用'CL_MEM_READ_WRITE'標誌而不是'CL_MEM_READ_ONLY'創建'src_d'。 – sgarizvi
@Christian:感謝它應該是res [idx] = idx; –