OpenCL与GPU和CPU的算法相同,但OpenCl对这两个设备的工作方式不同

时间:2017-01-06 22:53:35

标签: multithreading opencl gpu cpu

我有两个程序由我从头开始编写,一个是积分和第二个矩阵 - 矩阵乘法。当我用GPU卡执行这两个程序时,我将全局大小设置为1024,我希望内核代码执行1024次,这是正确的,它执行的次数与我在全局大小上设置的次数相同,并且更改了本地大小编码结果和输出无关紧要。 我尝试用CPU执行相同的代码,当我看到内核函数执行的次数与设置的全局大小相同时,我感到很震惊。以下是积分的示例: 全局大小= 2048,本地大小= 1, 我期待2048次执行内核函数,是的,它是2048, 但是当我们有全局大小= 2048和本地大小= 16时,它执行256次... 这是正常的吗?为什么使用CPU在openCl中与使用GPU不同?我认为对于用户端我们使用哪个设备并不重要,相同的代码应该在不同的设备上工作相同。我错了吗?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

将原子操作用于连续工作(或至少不容易还原)。要计算参与的线程数,请不要使用a[0]+=1;

atomic_add(&a[0],1);

应该工作甚至更好

atomic_inc(a)

其中a是整数,无符号有符号无关紧要。

答案 1 :(得分:0)

我发现了问题的根源。这是因为float的精度很差,当我将变量改为double时,它运行正常。我在某处看到CPU和GPU在浮点运算方面,在精度方面略有不同。