【发布时间】:2014-07-31 18:06:27
【问题描述】:
我正在开发一个 OpenCL 项目以生成非常大的厄米特(对称)矩阵,并且我正在尝试确定生成工作 ID 的最佳方式。
厄米矩阵沿对角线对称,因此 M(i,j) = M*(j,i)。
以蛮力的方式,for循环看起来像:
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
complex<float> result = doSomeCalculation();
M(i,j) = result;
}
}
但是,利用厄米特属性,只需计算矩阵的上三角部分并将结果复制到下三角部分,就可以使循环效率提高一倍:
for(int i = 0; i < N; i++)
{
for(int j = i; j < N; j++)
{
complex<float> result = doSomeCalculation();
M(i,j) = result;
M(j,i) = conj(result);
}
}
在这两个循环中,doSomeCalculation() 都是一项昂贵的操作,并且矩阵中的每个条目都与其他条目完全不相关(即问题是愚蠢地并行)。
我的问题是这样的:
如何使用 doSomeCalculation 作为 OpenCL 内核来实现第二个循环,以便最有效地使用线程 ID(即线程计算 M(i,j) 和 M(j,i) 而无需必须调用 doSomeCalculation() 两次)?
【问题讨论】:
-
i==j 的对角线使用什么公式?是 conj(结果)吗?
-
在我的例子中,对于 i == j 它是一个特殊的缩放身份(即一个标量)。然而,由于恒等对角线在厄米矩阵中是纯实数,所以它是它自己的复共轭。