如何并行化矩阵转置?
我知道要转置矩阵,我必须应用一些关于这一点的东西:
for (int i = 0; i < matrix.length - 1; i++) {
for (int j = i + 1; j < matrix[i].length; j++) {
tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
但是如何并行化这个操作,我不知道。
我需要创建N个线程来转置矩阵4Nx4N.
发布于 2013-05-31 12:53:13
因为这听起来像是家庭作业问题,所以我不会直接给你答案,但我会给你指明正确的方向。
假设您正在转置一个4x4矩阵:
A B C D A E I M
E F G H -> B F J N
I J K L C G K O
M N O P D H L P
如果我们把它分解成四个子矩阵:
A B | C D A E | I M
E F | G H B F | J N
----+---- -> ----+----
I J | K L C G | K O
M N | O P D H | L P
请注意,生成的四个子矩阵都是您开始使用的四个子矩阵的转置(右上和左下角的矩阵被交换)。你怎么能利用这个?)
发布于 2013-05-31 12:54:24
我发现,通常情况下,最好只是带一个"transposed“标志(bool,bit,随便什么),然后使用它来逆转索引计算。这似乎是BLAS,LAPACK等的方式。
由于缓存争用,在这里很难获得很多并行加速比。
发布于 2018-06-21 02:51:15
如果您想要一个简单的并行解决方案来解决您的问题,这样的方法可能会奏效。
double[][] matrix=new double[numberOfRows][numberOfColumns];
double[][] transpose = new double[numberOfColumns][numberOfRows];
IntStream.range(0, numberOfColumns * numberOfRows).parallel().forEach(i ->
{
int m = i / numberOfRows;
int n = i % numberOfRows;
transpose[m][n] = matrix[n][m];
});
这使用了一个并行的IntStream,您可以把它看作是一个并行化的for -循环,它运行于矩阵中的元素数。注意,我分配了两个变量来获得实际的行和列,我需要将其作为换位的目标。
将索引i除以流当前所在的行数,就会得到转置矩阵中目标行的索引。索引i的模数和行数给出了应该分配的转置矩阵的列。
https://stackoverflow.com/questions/16865730
复制相似问题