具有浮点范围的OpenMP并行

Ric*_*ard 3 floating-point parallel-processing openmp parallel-for

我有以下程序:

int main(){
   double sum=0;
   #pragma omp parallel for reduction(+:sum)
   for(double x=0;x<10;x+=0.1)
   sum+=x*x;
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我得到错误invalid type for iteration variable ‘x’.

我认为这意味着我只能将parallel for构造应用于基于整数的循环.但是我的循环的内部确实依赖于它是浮点数.

有没有办法说服OpenMP这样做?有推荐的替代方法吗?

Jon*_*rsi 6

来自评论:

不,OpenMP不会为你做这个,原因与给出关于带整数运算的OpenMP循环的问题的答案相同; 编译器推理浮点数是非常困难的 - 特别是编译器在进入循环之前需要知道循环的tripcount,并且循环中的浮点运算一般来说非常困难,即使有一些简单的情况那可以(比如,循环0.5到10.0).

出于同样的原因,即使是这种形式的循环的纯粹的串行优化/矢量化也会受到影响.最好的方法是创建一个等效的整数循环,并根据整数索引计算你的浮点数;

for (int i=0; i<100; i++) { 
    double x=0.1*i; 
    sum += x*x; 
}
Run Code Online (Sandbox Code Playgroud)