【问题标题】:How do I parallellise a for loop, and save the results of each repetition in a matrix?如何并行化 for 循环,并将每次重复的结果保存在矩阵中?
【发布时间】:2019-02-25 14:44:47
【问题描述】:

我正在运行多次重复的模拟,我正在尝试查看是否可以并行化这些重复以缩短计算时间。

目前我只是在一个for循环中运行了几次模拟,但理想情况下,这些可以同时运行,然后将每次重复的结果保存到一个数组中进行处理。

目前我的代码类似于

public static void getAllTheData(){

   int nReps = 10;
   double[][] allResults = new double[nReps][]

   //this for loop is what I want to parallellise 
   for(int r = 0; r < nReps; r++){

       //run the simulation to completion here
       simulation.doStuffToCompletion()

       allResults[r] = simulation.getValues()

   }
//average allResults here and do further analysis
}

我的问题是,如何同时并行运行所有这些重复,并将每次并行运行的结果保存在 allResults 类型的数组中?

非常感谢。

【问题讨论】:

    标签: java optimization parallel-processing


    【解决方案1】:

    您可以尝试类似并行流之类的方法来执行以下行之一的并行性。

    Stream.of(allResults).parallel().forEach(i -> processData(i));
    
    Arrays.stream(allResults).parallel().forEach(i -> processData(i));
    

    【讨论】:

    • 您还可以考虑以下方法来轻松填充结果数组:IntStream.range(0, nReps).parallel().forEach(i -&gt; allResults[i] = runSimulation());
    • 我想并行化的不是所有结果的分析,而是上面的 for 循环重复模拟几次以获得原始数据。您的方法是否可以获取原始数据,还是仅适用于已经分配了值的数组?
    【解决方案2】:

    Java 在默认情况下是一种同步语言,要并行工作,您需要查看线程。我建议研究异步函数调用以及在 Java 中执行此操作的方法。

    这是之前就此事提出的问题:How to asynchronously call a method in Java

    通过异步调用,您可以在任意数量的线程上运行模拟,并在模拟运行结束时收集数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      相关资源
      最近更新 更多