我在配备运行以下任一项的Nvidia GTX580的MacPro上运行相同的OpenCL代码:
但是我在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。
是否有任何理由在NVidia库中出现32位寻址限制或积极优化?
答案 0 :(得分:0)
在Apple OpenCL库中,对于数值数据类型,全局只写内存初始化为0,在Windows中,Nvidia库全局只写内存未初始化。
因此,当全局内存中的计数器递增时,起始值未定义。当怀疑这是一个快速而愚蠢的初始化循环放在内核的开始时,这当然导致后来执行的工作组将前面执行的结果工作组清零,从而使得观察到的结果与每个执行的内核数量成比例地减少计算单位。