Java中for循环的并行化

时间:2015-09-28 03:17:14

标签: java parallel-processing

我有一个很长的双嵌套for循环来进行多次试验。我想同时这样做,因为这些试验是相互独立的。如何在Java中有效地实现这一点,类似于C ++中的OpenMP?我将在64个处理器的节点上运行它,所以我希望每个核心都做一个测量。

相关代码:

//I want each measure to perform the doubly nested loop at the same time.

for (int i : measures) {

  for (int j = 0; j < N; j++) {
    for (int k = 0; k < N; k++) {
    array[i*N*N + j*N + k] = someFunc(i,j,k);
    }
  }

}

编辑:仍有问题:

//sim is a 1D array of type double
//gM is an array of type SMconf
//gene[foo].annot is a LinkedHashSet of URIs.
//Javadoc http://www.semantic-measures-library.org/sml/docs/apidocs/

Arrays.parallelSetAll( sim, i -> {
    try {
        engine.compare( gM[i/(N*N)], gene[(i/N)%N].annot, gene[i % N].annot );
    }
    catch (SLIB_Ex_Critic ex) {
        Logger.getLogger(Exp2.class.getName()).log(Level.SEVERE, null, ex);
    }
});

错误:

enter image description here

2 个答案:

答案 0 :(得分:0)

    int N=5;
    int array[]=new int[200];
    int [] measures={1,2,3,4,5};

    Arrays.stream(measures).parallel().forEach(i->{
        IntStream.range(0, N).parallel().forEach(j->{
            IntStream.range(0, N).parallel().forEach(k->{
                array[i*N*N+j*N + k]= someFunc(i,j,k);
            });
        });
    });


    Arrays.stream(array).forEach(System.out::println);

考虑measures是一个数组,而不是ArrayList。您可能希望在写入array[]时放置锁定。 我希望你没有使用array作为变量名。

答案 1 :(得分:0)

使用Java-8方法Arrays.parallelSetAll

可能会更有效率
Arrays.parallelSetAll(array, idx -> someFunc(idx/(N*N), (idx/N)%N, idx % N));

这将独立地并行设置数组元素。虽然你可能有一个划分开销,但它可能比创建嵌套并行流的开销要小得多,就像@pallavt回答一样。虽然它可能取决于问题的大小。

如果你的someFunc抛出检查异常,请将其重新抛出为未经检查的异常:

Arrays.parallelSetAll(array, idx -> {
    try {
        return someFunc(idx/(N*N), (idx/N)%N, idx % N);
    }
    catch(MyCheckedException ex) {
        throw new RuntimeException(ex);
    }
});