我在 GTX550ti 显卡上使用 Nvidia 的 OpenCL 开发软件,遇到了一个奇怪的问题。(我是 OpenCL 的新生)。
我的内核代码是这样的:
__kernel void kernel_name(...)
{
size_t d = get_local_id(0);
char abc[8];
...
}
实际上,char abc[8]
对于我的情况来说,这是无用的(死代码)。但是,如果我的char abc[8]
内核代码中有 ,结果将完全混乱,内核的运行时间会更长(2095712 ns)。如果我将 注释掉char abc[8]
,结果就会正确,内核的运行时间会变短(697856 ns)。内核的编译器不会清除死代码吗?
以上只是一个明确的例子,我可以重复。我还遇到过更奇怪的情况,即一个程序在完全相同的环境中在不同时间运行时会得到不同的结果。
这与内存分配有关还是..?任何人都可以就如何找到问题给我一些建议?
对了,oclDeviceQuery输出信息如下:Platform Version = OpenCL 1.1
CUDA 4.2.1,
SDK Revision = 7027912
我的操作系统是 Windows XP。
今天是2012-07-17,我想我已经解决了这个问题。
不要在内核源文件中使用#include。
不要在内核源文件中使用超长行(例如,您编写程序为内核源文件生成一些行数据)。