2012-03-14 87 views
1

我在使用C++绑定编写OpenCL,试图制作一个小型库。OpenCL enqueTask vs enqueNDRangeKernel

NDRange offset(0); 
NDRange global_size(numWorkItems); 
NDRange local_size(1); 

//this call fails with error code -56 
err = queue.enqueueNDRangeKernel(kernelReduction, offset, global_size, local_size); 
//this call works: 
err = queue.enqueueTask(kernelReduction); 

现在,错误代码-56是CL_INVALID_GLOBAL_OFFSET。我不知道为什么第一个电话会失败。有什么建议么?

+0

您使用的是什么尺寸?根据OpenCL文档偏移量需要是一个整数偏移量数组,每个偏移量都对应一个特定的维度,但您的代码并不是说它使用了多少维度。 – Thomas 2012-03-14 21:30:40

+0

就我所了解的C++绑定而言,它是由NDRange初始化器给出的。假设有1个整数,它会假定1维,假设2它假定为2. – 2012-03-14 22:12:08

回答

1

global_work_offset必须为NULL。这里的任何值都应该产生CL_INVALID_GLOBAL_OFFSET。

检查出来:clEnqueueNDRangeKernel

+0

您正在查看OpenCL 1.0文档,其中全局偏移量确实未实现,必须为空。对于OpenCL 1.1和1.2(全局偏移量正在工作)这不是事实。 – Thomas 2012-03-15 06:30:19

+1

该问题没有指定版本,所以这是我最好的猜测。 – mfa 2012-03-15 13:55:23

2

如果您正在使用的OpenCL 1.0,你不能AFAIK使用全局偏移(你需要使用一个常量内存计数器或东西来解决)。尝试更新绑定到OpenCL 1.1,如果他们不自动适应并确保您更新您的驱动程序以及。