OpenMP'For'循环是否适用于多个循环变量?例如:
int i;
double k;
#pragma omp parallel for
for (k = 0, i = 0; k < 1; k += 0.1, i++)
{ }
没有OpenMP它可以正常工作,但使用它我会收到以下错误:
答案 0 :(得分:3)
你可以这样做
#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;
不是一对一的。我的意思是结果不一定相同。那是因为对于浮点数学乘法时间,整数不一定是重复加法。在很多情况下可能没问题,重要的是要意识到它们不是同一个东西。
如果你使用Kahan求和,可以从乘法到重复加法的另一种方式,但是从重复加法到乘法不能保证给出相同的结果。
您可以在floating-point-multiplication-vs-repeated-addition了解更多相关信息。
答案 1 :(得分:1)
您需要将代码转换为仅使用i
(即带有简单增量的int
变量)作为循环本身,并在受控制的代码中使用k
循环:
double k = 0.0;
int i;
for (i=0; i<10; i++) {
// body of loop goes here
k+=0.1;
}