0

我在 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,我想我已经解决了这个问题。

  1. 不要在内核源文件中使用#include。

  2. 不要在内核源文件中使用超长行(例如,您编写程序为内核源文件生成一些行数据)。

4

1 回答 1

1

你是对的,这应该不会影响任何事情。

不过,这不是您的真实代码,而且我怀疑考虑到这些运行时间,您的内核并不是一件简单的事情。可能您将本地人推到某个限制之上,这意味着变量必须存储在一些较慢的内存中,这会延长您的运行时间。

如果您在某处有未初始化的变量错误,类似的事情也可能导致行为改变。在快速商店中,它碰巧得到了一个有效的值。在慢商店里,它得到了别的东西。

要检查这个理论,我会尝试删除一些其他本地数据结构,看看它是否具有相同的效果。任何其他 8 字节或更大的字节都应该具有相同的效果。


...当然,您可能在 OpenCL 实现中发现了一个错误,但这很容易检查。只需为不同的 OpenCL 设备编译内核,例如 CPU。无论如何这都是值得的,因为不同的编译器会处理不同的问题。

除此之外,我认为您又回到了标准调试技术。


顺便说一句:在您的问题中,您有时会调用数组abs[8]而不是abc[8]. 我认为这是一个错字,但如果不是,那可能是你的问题,因为名称会与函数abs发生冲突。abs()这可能会使愚蠢的编译器感到困惑。

于 2012-05-31T11:09:39.117 回答