我有以下程序:
int main(){
double sum=0;
#pragma omp parallel for reduction(+:sum)
for(double x=0;x<10;x+=0.1)
sum+=x*x;
}
当我编译它时,我得到错误invalid type for iteration variable ‘x’
。
我认为这意味着我只能将 parallel for
构造应用于基于整数的循环。但我的循环的内部结构确实取决于它是 float 。
有没有办法说服 OpenMP 这样做?有推荐的替代方法吗?
最佳答案
来自评论:
不,出于与 this answer 中相同的原因,OpenMP 不会为您执行此操作。给出了有关使用整数运算的 OpenMP 循环的问题;编译器很难推断出 float ——特别是,编译器在进入循环之前需要知道循环的 tripcount,而循环中的浮点运算通常使这变得非常困难,即使有一些简单的情况也是如此没关系(比如,循环 0.5 到 10.0)。
出于同样的原因,即使是这种形式的循环的纯串行优化/矢量化也会受到影响。最好的方法是制作一个等效的整数循环并根据整数索引计算您的 float ;
for (int i=0; i<100; i++) {
double x=0.1*i;
sum += x*x;
}
关于floating-point - 具有浮点范围的 OpenMP 并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418908/