Java 如何并行化矩阵转置?

Java 如何并行化矩阵转置?,java,multithreading,Java,Multithreading,如何并行化矩阵转置 我知道,要转换矩阵,我必须应用以下内容: 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; } } for(int i=0;

如何并行化矩阵转置

我知道,要转换矩阵,我必须应用以下内容:

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;
    }
}
for(int i=0;i
但是如何并行化这个操作,我不知道


我需要创建N个线程来转换矩阵4n x 4n。

因为这听起来像一个家庭作业问题,我不会直接给你答案,但我会为你指出正确的方向

假设您正在转置一个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

请注意,生成的四个子矩阵都是您开始使用的四个子矩阵的转置(右上角和左下角矩阵交换)。你怎么能利用这个呢?:)

我发现,通常最好只携带一个“转置”标志(bool、bit等),然后用它来反转索引计算。这似乎是布拉斯、拉帕克等人的做法


无论如何,由于缓存争用,在这里很难获得多大的并行加速。

如果您想要一个简单的并行解决方案来解决您的问题,类似的方法可能会奏效

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的模和行数为您提供了应分配的转置矩阵列。

为此,一定要使用优化良好的库-我希望这些库甚至可以使用本机软件包和高CPU优化。真正优化矩阵乘法是一条漫长的路。请看,它指的是JBlas。+1转置不是CPU限制的操作,所以我不希望使用多个线程来提供帮助。转置是一种内存带宽受限的操作,即从内存中的不同点复制大量副本。换句话说,你可以做到,但我希望它会慢一些,而不是快一些。是的,这是一项家庭任务)我理解你的想法,但我不理解最后两句话:[比较转置前后矩阵左上角的四分之一。这两个部分之间有何关联?它们因我需要的列的行而不同。谢谢。我今天将尝试编写它。