OpenMP - 多循环变量

时间:2014-04-01 05:52:48

标签: c++ multithreading visual-studio-2010 openmp

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'语句形式不正确

2 个答案:

答案 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;
}