【发布时间】:2021-06-29 21:54:04
【问题描述】:
我必须使用 Java 进行蒙特卡罗模拟。我的情况如下:
for (int w = 0; w < n; w++) {
for (int t = 0; t < 25; t++) {
for (int a = 0; a < 20; a++) {
// ...calculations...
}
}
}
n 往往非常大(数百万)。此外,t 和a 循环(以及内部的计算)独立于w 循环(我使用w 循环重复矩阵计算n 次)。这意味着,我真的不在乎哪个 w 在之前或之后运行。
是否有一种(可能并不复杂,因为我从未使用过并行编程)分割外部 for 循环并使用不同线程同步执行的方法(例如,如果我有四核处理器来运行所有线程,而不仅仅是一)?
在@tevemadar 解决方案之后编辑。
据我了解,我可以这样做:
public class MyMonteCarloClass {
private static double[][] monteCarloSums = new double[20][25];
Random generator = new Random();
private void incrementSum() {
for (int t = 0; t < 25; t++) {
for (int a =0; a < 20; a++) {
monteCarloSums[a][t] += generator.nextGaussian();
}
}
}
public double[][] getValue(int numberOfSim) {
IntStream.range(0, numberOfSim).parallel().forEach(I -> incrementSum());
return this.monteCarloSums
}
}
相对于三个嵌套循环,这样的事情会加快速度吗?
【问题讨论】:
-
你试过用线程吗?
-
这些有帮助吗? stackoverflow.com/questions/29998976/… 和 stackoverflow.com/questions/26838242/… 和 stackoverflow.com/questions/48754107/… 尝试在 Internet 上搜索 java parallel intstream
-
谢谢大家!! @abra 的建议似乎真的很有用!
标签: java multithreading parallel-processing