OpenCL数据同步
问题描述:
我将一行矩阵与该行的对角线元素的逆矩阵相乘。我用一维并行代码实现了它。所有线程运行这段代码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的任何障碍?
我不想使用空循环,因为可能会出现最坏情况,当它可以得到 失败。
答
一种方法是添加barrier(CLK_CL_LOCAL_MEM_FENCE)
。
另一种方式是在两个内核中进行工作,但可以将从step1的内核计算得到的cl_mem
直接传递给step3的内核。这不会导致CPU/GPU IO。
对角线矩阵乘以一个稠密矩阵是一组点积,可以通过使用reduce来完成。这会让你的功能更快。
工作范围只有障碍。如果你的代码只有一个工作组,那么它是可能的,但如果你想在GPU上运行你的代码,它是非常不受欢迎的。 – Jovasa
我正在使用GPU,所有这些线程都是通过一次调用enqueueNDRangeKernel产生的,所以我猜他们是在同一个全局工作组中。 –
不,调用产生K Workitems(全局大小),它们构成每个都有N个工作项(本地大小)的工作区 – Jovasa