gpt4 book ai didi

c++ - OpenMP - 多个循环变量

转载 作者:行者123 更新时间:2023-11-30 01:53:49 26 4
gpt4 key购买 nike

OpenMP“For”循环是否适用于多个循环变量?例如:

int i;
double k;
#pragma omp parallel for
for (k = 0, i = 0; k < 1; k += 0.1, i++)
{ }

它在没有 OpenMP 的情况下工作正常,但使用它时出现以下错误:

  • C3015:OpemMP“for”语句中的初始化形式不正确
  • C3019:OpenMP“for”语句中的递增形式不正确

最佳答案

你可以这样做

#pragma omp parallel for
for (int i = 0; i<10; i++) {
double k = 0.1*i;
}

如果你真的想避免循环中的乘法并更接近你的原始代码,你可以这样做

#pragma omp parallel 
{
int nthreads = omp_get_num_threads();
int ithread = omp_get_thread_num();
int starti = ithread*10/nthreads;
int finishi = (ithread+1)*10/nthreads;
double start = 0.1*starti;
double finish = 0.1*finishi;

double k;
int i;
for (k = start, i = starti; k < finish; k += 0.1, i++) {
}
}

当我第一次写这个答案时,我没有意识到一个细微的问题。

转化自

for (k = 0; k < 1; k += 0.1)

for (int i = 0; i<10; i++) double k = 0.1*i;

不是一对一的。我的意思是结果不一定相同。那是因为对于 float 学乘法乘以整数不一定重复加法。在许多情况下可能没问题,重要的是要意识到它们不是同一回事。

如果您使用 Kahan 求和,则可以从乘法到重复加法进行相反的操作,但不能保证从重复加法到乘法会得到相同的结果。

您可以在 floating-point-multiplication-vs-repeated-addition 阅读更多相关信息.

关于c++ - OpenMP - 多个循环变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22777841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com