【问题标题】:OpenCl global work-item operation priorityOpenCl 全局工作项操作优先级
【发布时间】:2017-12-07 23:30:32
【问题描述】:

我想知道下面代码sn-ps(简单的二维矩阵乘法例程)的索引计数的优先级。

kernel void mmul(
   const int N,
   global float* A,
   global float* B,
   global float* C)
 {
     int k;
     int i = get_global_id(0);
     int j = get_global_id(1);
     float tmp;
     if ((i < N) && (j < N))
     {
         tmp = 0.0f;
         for (k = 0; k < N; k++)
             tmp += A[i*N+k] * B[k*N+j];
         C[i*N+j] = tmp;
     }
}

如果您使用“k”计数器查看 for 循环内部,您可以看到全局工作项“i”和“j”放置在同一行中。我想知道它们中的哪些在计算“i”和“j”的索引(例如 1、2、3、4、...、n)方面具有优先权。我不明白这将如何工作,因为我是 OpenCl 的新手,如果我只是使用普通的 C 或 Python,我会使用嵌套的 for 循环来进行这种类型的操作。

有人能解释一下全局工作项是如何工作的吗?

谢谢。

【问题讨论】:

  • 它不会暴露给用户。但是我在amd gpu中看到过这样的事情:很多工作组连续,几个工作组混合,然后又连续很多工作组,他们又混合了一些。如果由于未知原因卡在某个地方,第一个工作项可能会最后完成,但是正在进行的工作项的数量是有限的,所以如果有足够的工作项被卡住,工作可能永远不会结束并且电脑崩溃。在 OpenCL2.0 中,工作项可以产生工作组,因此您最好控制顺序。
  • 所以...您是说用户必须理所当然地认为他们是如何工作的?这是矩阵乘法的一种不好的编码方式吗?
  • 如果您通过“优先级”表示“维度表示”,get_global_id(0) 为 X,get_global_id(1) 为 Y,如果您已给出大小为 (10k/3k) 的内核启动,则为 X扫描到 10k,Y 扫描到 3k。

标签: opencl


【解决方案1】:

您应该更多地关注内存读/写优先级,而不是工作项发布顺序。要对内存操作强制执行优先级/顺序,请使用 mem_fence(in-workitem) 、 barrier(in-workgroup) 甚至内核(所有工作项同步点)。使用故意的空 for 循环或原子函数不能保证内存写入/读取优先级。只有内存栅栏/屏障/内核可以。

任何工作项(开始/结束运行)都没有优先级,但它们被分组并在有许多线程来运行它们的计算单元上执行。不能保证工作项 i,j 将在 i+1,j+1 之前执行,但可以保证如果它们在同一个工作组中(大小为 16),它们将在同一个计算单元(内核共享 L1 缓存)中执行,16 例如)在使用 Nvidia 和 Amd gpus 时。

在同一计算单元中执行会增加同时发布的机会,这当然不是优先事项,但共享 L1 缓存等资源意味着高性能。

即使在同一个工作组中,也不能保证本地工作项是否在其他工作项之前发布,但如果它们在同一个 SIMD 单元上(例如 Amd gpu 中的 16 宽部分),它们更有可能同时发生.

【讨论】:

  • 感谢您的回复。那么即使它们没有任何优先级,结果是否相同,就像我期望的有序索引 (0,1,2,3, ... , N)?
  • 如果任何工作项写入与另一个工作项相同的地址,这是一个竞争条件,应该通过任何方式解决,例如添加栅栏和内核。只要他们写入唯一的地址,它就应该始终以相同的方式工作(除非您在没有围栏的同一个工作项中进行多次写入)。即使使用原子也不能强制执行内存访问的顺序,但栅栏可以。栅栏/障碍物的重点是这个。对于并行算法,执行顺序并不重要。
  • 对不起,你说的栅栏是什么意思?你能给我一个简单的例子吗?谢谢。
  • mem_fence(CLK_GLOBAL_MEM_FENCE) 在它之前和之后分离全局内存操作,因此它们不会被编译器或 GPU 重新排序。 barrier(CLK_GLOBAL_MEM_FENCE) 做同样的事情,但它也适用于整个工作组(例如 256 个工作项),因此它们都同时做同样的事情。如果你将一些写入分开到另一个内核,它可以确保所有工作项写入都是分开的,而不仅仅是一个工作组。
  • 非常感谢。你会推荐任何关于 OpenCl 的书籍或文献吗?特别是处理数值分析。我无法搜索资源,尤其是示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多