0

我将一行矩阵与该行的对角线元素的逆矩阵相乘。我用一维并行代码实现了它。所有线程运行这段代码OpenCL数据同步

1.read the principle diagonal element 
2.calculate the inverse of that element 
3.multiply inverse with the element indexed at the thread id 

问题出现时,第i在第i行线程执行步骤3其他线程之前执行步骤1,它改变了原则对角线元素的值之前,其他人可以阅读。

OpenCL是否有像所有线程执行步骤1之后只允许线程执行步骤3的任何障碍?

我不想使用空循环,因为可能会出现最坏情况,当它可以得到 失败。

+0

工作范围只有障碍。如果你的代码只有一个工作组,那么它是可能的,但如果你想在GPU上运行你的代码,它是非常不受欢迎的。 – Jovasa

+0

我正在使用GPU,所有这些线程都是通过一次调用enqueueNDRangeKernel产生的,所以我猜他们是在同一个全局工作组中。 –

+0

不,调用产生K Workitems(全局大小),它们构成每个都有N个工作项(本地大小)的工作区 – Jovasa

回答

0

一种方法是添加barrier(CLK_CL_LOCAL_MEM_FENCE)

另一种方式是在两个内核中进行工作,但可以将从step1的内核计算得到的cl_mem 直接传递给step3的内核。这不会导致CPU/GPU IO。

对角线矩阵乘以一个稠密矩阵是一组点积,可以通过使用reduce来完成。这会让你的功能更快。