考虑以下代码片段。
//C
int arr[1024];
void fill_array(){
int len=sizeof(arr)/4;
int res;
for(int i=o;i<len;i++){
res;//=some big operation
arr[i]=res;
}
}
//J
private int[] arr=new int[1024];
void fill_array(){
int len=arr.length;
int res;
for(int i=o;i<len;i++){
res;//=some big operation
arr[i]=res;
}
}
假设每个循环只初始化 arr
的一个索引,并且不依赖于任何其他索引。就像 arr[i]=i*2
一样。
我知道它应该由 GPU 运行或至少并行运行。
问题:
GCC 编译器或 JVM 是否理解它(循环)将被并行处理并隐式执行?
如果是,是否有任何编译标志或其他东西来关闭或打开此功能?
最佳答案
至少有一个实验性 JVM,它致力于在 GPU 上并行化此类循环 (graal)。我自己还没有尝试过,但几个月前我听说它适用于简单的循环 - 无论如何,对于现阶段的任何生产代码来说肯定是不可行的。
在 C 方面,我知道 icc 实际上确实进行了自动并行化,但仅针对 CPU。此外,它非常善变,并且会由于较小的代码或编译器版本更改而“中断”,因此如果它有效但你真的不应该依赖它是一个很好的奖励(或者如果你这样做,请预留一段时间以确保它仍然适用于所有更改,如果不适用,则修改代码)
关于java - GCC 和 JVM 自动并行批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22237511/