floating-point - 具有浮点范围的 OpenMP 并行

标签 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;
}

当我编译它时,我得到错误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/

相关文章:

java - 如何检查输入值是整数还是 float ?

c - C中的scanf(用于扫描 float )和精度问题

Java:创建大量 Callable 或将迭代器结果分发给线程?

c++ - `std::mutex` 和 `std::lock` 是否保证处理器间代码中的内存同步?

c++ - 使用openmp创建共享锁

matlab - IEEE754在MATLAB中的详细实现?

floating-point - 58.85显示为58.84999999999

c++ - 如何进行并行双线性插值

algorithm - 并行算法分析中的“工作”,“跨度”和“时间”之间有什么区别?

c - 使用 open mp 的慢速稀疏矩阵 vector 积 (CSR)