Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并行矩阵乘法_Java_Multithreading_Matrix_Matrix Multiplication_Java Threads - Fatal编程技术网

Java 并行矩阵乘法

Java 并行矩阵乘法,java,multithreading,matrix,matrix-multiplication,java-threads,Java,Multithreading,Matrix,Matrix Multiplication,Java Threads,我试图将两个矩阵A,B的乘法并行化 不幸的是,串行实现仍然比并行实现快,或者加速比太低。矩阵维数为512时,加速比为1.3。也许有些事情根本上是错的。外面有人能给我小费吗 双[][]矩阵2最终双[][]矩阵, 最终双[][]矩阵B, 最终布尔并行{ int行=matrixA.length; int columnsA=矩阵[0]。长度; int columnsB=matrixB[0]。长度; 可运行任务; 列表池=新的ArrayList; double[]returnMatrix=新的双[行][c

我试图将两个矩阵A,B的乘法并行化

不幸的是,串行实现仍然比并行实现快,或者加速比太低。矩阵维数为512时,加速比为1.3。也许有些事情根本上是错的。外面有人能给我小费吗

双[][]矩阵2最终双[][]矩阵, 最终双[][]矩阵B, 最终布尔并行{ int行=matrixA.length; int columnsA=矩阵[0]。长度; int columnsB=matrixB[0]。长度; 可运行任务; 列表池=新的ArrayList; double[]returnMatrix=新的双[行][columnsB]; 对于int i=0;i{ 对于int j=0;j根本没有什么错

与少量乘法相比,创建线程意味着巨大的开销。目前,对于512*512矩阵,可以创建512个线程。您的CPU肯定少于512个内核,因此只有8个或16个内核可以在不同的内核上并行运行,但其他约500个内核也会在不增加并行执行的情况下消耗创建开销


尝试将线程数量限制在接近CPU核心数量的范围内,可以使用您自己的逻辑,也可以使用框架,例如java.util.concurrent包。

根本没有问题

与少量乘法相比,创建线程意味着巨大的开销。目前,对于512*512矩阵,可以创建512个线程。您的CPU肯定少于512个内核,因此只有8个或16个内核可以在不同的内核上并行运行,但其他约500个内核也会在不增加并行执行的情况下消耗创建开销

尝试将线程数量限制在接近CPU核心数量的范围内,可以使用您自己的逻辑,也可以使用框架,例如java.util.concurrent包。

您可以使用一个流来减少计算时间,可能是两倍或更多。不要使用嵌套并行,因为这会产生相反的效果

/** *并行矩阵乘法 * *@param“a”矩阵的m行 *@param n“a”矩阵的列 *和“b”矩阵的行 *@param p“b”矩阵的列 *@param a第一个矩阵'm×n' *@param b第二矩阵'n×p' *@返回结果矩阵'm×p' */ 静态双[][]并行矩阵乘法 int m,int n,int p,double[]a,double[]b{ 返回IntStream.range0,m .parallel//注释此行以检查顺序流 .mapToObji->IntStream.range 0,p .mapToDoublej->IntStream.range 0,n .mapToDoublek->a[i][k]*b[k][j] 总和 .托雷 .ToArrayDuble[]]::新的; } //试验 公共静态无效字符串[]args{ //尺寸 int m=512; int n=1024; int p=512; //矩阵 双[][]a=随机矩阵xm,n; 双[]b=随机矩阵xn,p; 长时间=System.currentTimeMillis; //倍增 double[]c=并行矩阵乘法m,n,p,a,b; System.out.printlnSystem.currentTimeMillis-时间; //与。平行时间为-1495 //没有平行线,时间是-5823 } 静态双[]随机矩阵d1,int d2{ 返回IntStream.range0,d1 .mapToObji->IntStream.range0,d2 .mapToDoublej->Math.random*10 .托雷 .ToArrayDuble[]]::新的; } 您可以使用一个流来减少计算时间,可能是两倍或更多。不要使用嵌套并行,因为这会产生相反的效果

/** *并行矩阵乘法 * *@param“a”矩阵的m行 *@param n“a”矩阵的列 *和“b”矩阵的行 *@param p“b”矩阵的列 *@param a第一个矩阵'm×n' *@param b第二矩阵'n×p' *@返回结果矩阵'm×p' */ 静态双[][]并行矩阵乘法 int m,int n,int p,double[]a,double[]b{ 返回IntStream.range0,m .parallel//注释此行以检查顺序流 .mapToObji->IntStream.range 0,p .mapToDoublej->IntStream.range 0 N .mapToDoublek->a[i][k]*b[k][j] 总和 .托雷 .ToArrayDuble[]]::新的; } //试验 公共静态无效字符串[]args{ //尺寸 int m=512; int n=1024; int p=512; //矩阵 双[][]a=随机矩阵xm,n; 双[]b=随机矩阵xn,p; 长时间=System.currentTimeMillis; //倍增 double[]c=并行矩阵乘法m,n,p,a,b; System.out.printlnSystem.currentTimeMillis-时间; //与。平行时间为-1495 //没有平行线,时间是-5823 } 静态双[]随机矩阵d1,int d2{ 返回IntStream.range0,d1 .mapToObji->IntStream.range0,d2 .mapToDoublej->Math.random*10 .托雷 .ToArrayDuble[]]::新的; }