【发布时间】:2015-05-07 03:32:00
【问题描述】:
所以我能够编译和执行我的内核,问题是只使用了两个工作项。我基本上是在尝试用 {0,1,2,3,4,5,6,7} 填充浮点数组 [8]。所以这是一个非常简单的 hello world 应用程序。 Bellow 是我的内核。
// 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的初始化没有显示。 -
尝试使用
CL_MEM_READ_WRITE标志而不是CL_MEM_READ_ONLY创建src_d。 -
@Christian:谢谢,应该是 res[idx] = idx;
-
@sgarizvi: CL_MEM_READ_WRITE 不适合我
标签: c++ linux opencl gpgpu nvidia