OpenCL-相同的代码,在Apple+;Win XP上的Xcode不正确+;MSVS2008+;英伟达CUDA 5

OpenCL-相同的代码,在Apple+;Win XP上的Xcode不正确+;MSVS2008+;英伟达CUDA 5,opencl,nvidia,Opencl,Nvidia,我在配备Nvidia GTX580的MacPro上运行相同的OpenCL代码,运行以下任一操作: 带Xcode 4.6的OS X 10.8.2 WindowsXP 32位采用Visual C++ 2008企业和NVIDIA CUDA工具包5 但是我在WinXP中得到了错误的结果 要定义使用的工作项数量,我指定工作组大小(192)、工作组数量(256)并设置用作工作组大小x工作组(192 x 256=49152)的工作项的全局数量 当我在苹果平台上运行时,我的所有结果都是正确的,但是当我在W

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

  • 带Xcode 4.6的OS X 10.8.2
  • WindowsXP 32位采用Visual C++ 2008企业和NVIDIA CUDA工具包5
但是我在WinXP中得到了错误的结果

要定义使用的工作项数量,我指定工作组大小(192)、工作组数量(256)并设置用作工作组大小x工作组(192 x 256=49152)的工作项的全局数量

当我在苹果平台上运行时,我的所有结果都是正确的,但是当我在Win XP平台上运行时,我得到的结果是1/8

做了一些检查后,我让GPU存储它认为是全局大小的东西,它报告的预期数字为49152。但是,如果我让每个工作组的第一个工作项以原子方式将本地大小添加到计数器中,我只得到6144,正好是全局大小的1/8

这个问题似乎与设置的工作项数量有关,如果我将工作组大小设置为32或64,我将得到正确的答案(当工作组大小保持不变为192时)。但是,对于任何其他值,我都有这个问题,我的结果可能会被1/8、1/4或1/2的系数所抵消,这取决于所使用的工作项的数量


是否有任何原因,如在英伟达图书馆的32位寻址限制或积极优化?在苹果OpenCL库中< /P> < P>,对于数字数据类型,全局只读存储器被初始化为0,在Windows Nvidia库中,全局写内存没有初始化。


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

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