Java中for循环的并行化
我有一个长的双重嵌套for循环,要进行多次试验。我想平行进行,因为这些试验是相互独立的。在C++中如何类似java中的OpenMP高效地实现这个?我将在一个有64个处理器的节点上运行它,所以我希望每个核心执行一个度量 相关代码: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++) {
//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);
}
});