AMD与NVIDIA显卡的OpenCL代码行为不同

时间:2013-11-07 06:47:48

标签: sdk opencl nvidia amd-processor ati

我的代码顶部有一个常量......

__constant uint uintmaxx =  (uint)(  (((ulong)1)<<32) - 1 );

它在AMD和NVIDIA OpenCL编译器上编译好......然后执行。

(正确)在ATI卡上,返回... 4294967295或(所有32位= 1)

(错误)在NVIDIA显卡上,返回... 2147483648或(仅32位= 1)

我也试过-1 + 1&lt;&lt; 32并且它适用于ATI而不是NVIDIA。

是什么给出的?我只是错过了一些东西吗?

虽然我是关于OpenCL编译器差异的话题,但有没有人知道列出AMD和NVIDIA之间编译器差异的好资源?

2 个答案:

答案 0 :(得分:2)

OpenCL方便地为您提供。您可以在内核代码中使用预定义的UINT_MAX,实现将保证它保持正确的值。

但是,您使用的方法也没有错。规范保证uint是32位和ulong 64位,int是两个补码,未明确提到的所有内容都与C99规范中的完全相同。

即使只是这应该工作并给你正确的结果:     uint uintmaxx = -1;

似乎NVidia只是有一个破碎的编译器,如果不是我真的希望我会在这个问题上得到纠正。真正奇怪的部分是第32位是怎么样的?向左移动32将原始位移动到第33位。那么到底有什么位置在第32位呢?我唯一想到的是他们根本不尊重操作员排序并将公式转换为(ulong)1&lt;&lt; (32-1)或类似的东西。

您可能应该提交错误报告。但坦率地说,他们讨厌OpenCL,就像微软讨厌OpenGL一样,如果不是更多,我也不会真的期待快速的响应时间。

答案 1 :(得分:0)

我完全同意@sharpneli的回答。但试试这个:

__constant uint uintmaxx = -1;

和sharpneli说的那样,使用UINT_MAX宏,这是更安全的方式。