1

我在配备 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 库中的积极优化?

4

1 回答 1

0

在 Apple OpenCL 库中,对于数字数据类型,全局只写内存初始化为 0,在 Windows Nvidia 库中,全局只写内存未初始化。

因此,当全局内存中的计数器增加时,起始值未定义。当怀疑这是在内核开始处放置了一个快速而愚蠢的初始化循环时,这当然会导致稍后执行的工作组将结果归零 之前执行的工作组给出观察到的结果减少与每个执行的内核数量成比例计算单元。

于 2013-02-17T21:34:01.653 回答