Sdk AMD和NVIDIA卡的OpenCL代码行为不同

Sdk AMD和NVIDIA卡的OpenCL代码行为不同,sdk,opencl,nvidia,amd-processor,ati,Sdk,Opencl,Nvidia,Amd Processor,Ati,我的代码顶部有一个常量 __constant uint uintmaxx = (uint)( (((ulong)1)<<32) - 1 ); \uuu常量uint uintmaxx=(uint)((ulong)1)OpenCL已经方便地为您提供了这一点。您可以在内核代码中使用预定义的uint\u MAX,实现将保证它保持正确的值 不过,您使用的方法也没有任何错误。规范保证uint为32位,ulong为64位,int为两位补码,所有未明确提及的内容都与C99规范中的内容完全相同

我的代码顶部有一个常量

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

\uuu常量uint uintmaxx=(uint)((ulong)1)OpenCL已经方便地为您提供了这一点。您可以在内核代码中使用预定义的uint\u MAX,实现将保证它保持正确的值

不过,您使用的方法也没有任何错误。规范保证uint为32位,ulong为64位,int为两位补码,所有未明确提及的内容都与C99规范中的内容完全相同

即使是这样,也应该可以为您提供正确的结果: uint uintmaxx=-1


似乎NVidia只是有一个坏的编译器,如果不是的话,我真的希望我能在这个问题上得到纠正。真正奇怪的是,第32位到底是怎么一个?向左移动32位会将原始位移动到第33位。那么,到底是什么把位放在第32位呢?我唯一想到的是,他们不尊重运算符我完全同意@sharpneli的回答,但请尝试以下方法:

__constant uint uintmaxx = -1;

正如夏普内利所说,使用UINT_MAX宏,这是更安全的方法。

谢谢。我应该使用define,或-1。我没有想到,它最终咬了我。