java - 并行矩阵乘法
问题描述
我正在尝试并行化两个矩阵的乘法A
,B
.
不幸的是,串行实现仍然比并行实现快,或者加速太低。(矩阵维度 = 512 的加速就像1.3
)。可能有些事情根本上是错误的。有人可以给我小费吗?
double[][] matParallel2(final double[][] matrixA,
final double[][] matrixB,
final boolean parallel) {
int rows = matrixA.length;
int columnsA = matrixA[0].length;
int columnsB = matrixB[0].length;
Runnable task;
List<Thread> pool = new ArrayList<>();
double[][] returnMatrix = new double[rows][columnsB];
for (int i = 0; i < rows; i++) {
int finalI = i;
task = () -> {
for (int j = 0; j < columnsB; j++) {
// returnMatrix[finalI][j] = 0;
for (int k = 0; k < columnsA; k++) {
returnMatrix[finalI][j] +=
matrixA[finalI][k] * matrixB[k][j];
}
}
};
pool.add(new Thread(task));
}
if (parallel) {
for (Thread trd : pool) {
trd.start();
}
} else {
for (Thread trd : pool) {
trd.run();
}
}
try {
for (Thread trd : pool) {
trd.join();
}
} catch (
Exception e) {
e.printStackTrace();
}
return returnMatrix;
}
解决方案
根本没有什么问题。
与几次乘法相比,创建线程意味着巨大的开销。目前,对于 512*512 矩阵,您创建 512 个线程。您的 CPU 肯定少于 512 个内核,因此只有 8 或 16 个内核会真正在不同的内核上并行运行,但另外约 500 个内核也消耗了创建开销,而不会增加并行执行。
尝试使用您自己的逻辑或使用框架(例如 java.util.concurrent 包)将线程数限制为更接近 CPU 内核数。
推荐阅读
- linux - 当另一个库具有相同的符号时,gdb 不显示来自共享库的符号
- c# - 如何提示 C# 8.0 可空引用系统使用反射初始化属性
- python - 如何删除与 Scipy 稀疏矩阵数量不同的元素?
- javascript - 如何传递带有空格的参数来表示?
- django - 如果使用 django-rest-framework 指定,有没有办法只显示一个字段?
- android - 尝试使用 MultiViews 的水平 Firebase RecyclerView
- ios - 旋转时 UITextView 中的文本被截断
- javascript - 在 JavaScript 中过滤子项的子项
- ffmpeg - FFMPEG 将录制添加到此命令
- ansible - ansible_default_ipv4.address 获取活动网卡名称