【发布时间】: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