我在配备 Nvidia GTX580 的 MacPro 上运行相同的 OpenCL 代码,运行以下任一:
- 带有 Xcode 4.6 的 OS X 10.8.2
- 带有 Visual C++ 2008 企业版和 Nvidia CUDA 工具包 5.0 的 Windows XP 32 位
但是我在 Win XP 中得到了错误的结果。
要定义使用的工作项数,我指定工作组大小 (192)、工作组数 (256) 并将使用的工作项的全局数设置为工作组大小 x 工作组 (192 x 256 = 49152)。
当我在 Apple 平台上运行它时,我的所有结果都是正确的,但是当我在 Win XP 平台上运行它时,我得到的结果是 1/8 倍。
做一些检查,我让 GPU 存储它认为的全局大小,并将预期数字报告为 49152 但是如果我改为让每个工作组的第一个工作项以原子方式将本地大小添加到计数器,我只会得到 6144,正好是全球规模的 1/8。
这个问题似乎是工作项设置数量的函数,如果我将工作组大小设置为 32 或 64,我将得到正确答案(当工作组大小保持在 192 时)。但是,对于任何其他值,我都会遇到此问题,并且我的结果可能会偏离 1/8、1/4 或 1/2,具体取决于使用的工作项的数量。
是否有任何原因会发生这种情况,例如 32 位寻址限制或 NVidia 库中的积极优化?