0

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

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

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

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

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

我还尝试了 -1 + 1<<32 并且它适用于 ATI 但不适用于 NVIDIA。

是什么赋予了?我只是错过了什么吗?

当我谈到 OpenCL 编译器差异的话题时,有没有人知道列出 AMD 和 NVIDIA 之间编译器差异的好资源?

4

2 回答 2

2

OpenCL 已经很方便地为您提供了这些。您可以在内核代码中使用预定义的 UINT_MAX,并且实现将保证它具有正确的值。

但是,您使用的方法也没有错。该规范保证 uint 是 32 位,ulong 是 64 位,int 是二进制补码,并且所有未明确提及的内容都完全按照 C99 规范中的规定工作。

即使这样也应该有效并为您提供正确的结果: uint uintmaxx = -1;

似乎 NVidia 只是有一个损坏的编译器,如果不是,我真的希望我能在这个问题上得到纠正。真正奇怪的是,第 32 位到底是 1?左移 32 位将原始位移动到第 33 位。那么到底是什么让位居第 32 位呢?我唯一想到的是他们根本不尊重运算符排序并将公式转换为 (ulong)1 << (32-1) 或类似的东西。

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

于 2013-11-07T09:57:03.473 回答
0

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

__constant uint uintmaxx = -1;

就像Sharpneli所说,使用 UINT_MAX 宏,这是更安全的方法。

于 2013-11-07T10:01:19.333 回答