Java中for循环的并行化

Java中for循环的并行化,java,parallel-processing,Java,Parallel Processing,我有一个长的双重嵌套for循环,要进行多次试验。我想平行进行,因为这些试验是相互独立的。在C++中如何类似java中的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循环,要进行多次试验。我想平行进行,因为这些试验是相互独立的。在C++中如何类似java中的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);
    }
  }

}
错误:

考虑到
度量值
是一个数组,而不是
数组列表
。在写入
array[]
时,您可能需要锁定。
我希望您不要使用
数组
作为变量名。

使用Java-8方法可能效率更低:

这将并行地独立设置数组元素。虽然您可能有除法的开销,但它可能比@pallavt answer中创建嵌套并行流的开销要小得多。尽管这可能取决于问题的大小

如果您的
someFunc
抛出选中异常,请将其作为未选中异常重新显示:

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

了解线程:您可以尝试使用-尽管您可能需要更改
someFunc
签名来直接接受数组项,而不是它在数组中的位置。如果度量值不是int数组,而是类Measure的对象数组呢?如果
measures
不是int,您的代码
如何表示(int i:measures)
正在运行吗?另外,为什么在设置
数组[i*N*N+j*N+k]
时要跳过索引?对不起,我在哪里跳过索引?在
数组[i*N*N+j*N+k]
中,您要与
N
相乘,并添加
k
j
,因此,如果生成器函数引发异常,您必须跳过元素。这发生在我身上,Netbeans默认设置的try-catch在parallelSetall函数中不起作用。@henri编辑了答案,以说明如何处理选中的异常。一般来说,在Java-8中,您应该更喜欢所有未检查的异常。非常感谢Tagir。我再试了一次,但它说“lamdba表达式中的返回类型不正确,缺少返回值。”它应该返回一个双精度。@henri,您缺少
try
块中的
return
语句,该语句存在于我的代码中。仔细看。
    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);
Arrays.parallelSetAll(array, idx -> someFunc(idx/(N*N), (idx/N)%N, idx % N));
Arrays.parallelSetAll(array, idx -> {
    try {
        return someFunc(idx/(N*N), (idx/N)%N, idx % N);
    }
    catch(MyCheckedException ex) {
        throw new RuntimeException(ex);
    }
});