【问题标题】:OpenCL - Same code, Correct on Apple + Xcode incorrect on Win XP + MSVS 2008 + Nvidia CUDA 5OpenCL - 相同的代码,在 Apple 上正确 + Xcode 在 Win XP + MSVS 2008 + Nvidia CUDA 5 上不正确
【发布时间】:2013-01-25 15:16:57
【问题描述】:

我在配备 Nvidia GTX580 的 MacPro 上运行相同的 OpenCL 代码,运行以下任一设备:

  • OS X 10.8.2 和 Xcode 4.6
  • Windows XP 32 位,带有 Visual C++ 2008 企业版和 Nvidia CUDA 工具包 5.0

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

【问题讨论】:

  • GPGPU 技术并不完全是一种稳定性模型。如果您真的找不到问题,假设 OpenCL 运行时错误也不会太牵强,您是否尝试过不同的运行时版本?
  • 我还没有尝试其他运行时,我将尝试使用 CUDA 4 驱动程序。
  • 我已经尝试在 win XP 32 位上使用 CUDA 4.1 工具包,在 windows 7 64 位上使用 CUDA 5 工具包,我也遇到了同样的问题。

标签: opencl nvidia


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多