变量中的不同值

时间:2012-03-20 21:20:25

标签: c++ multithreading openmp

为什么我在imain中有foo的不同值?

以下是我的示例代码:

#include<stdio.h>
#include<omp.h>

double a;
int i;
int j;
int nr_threads;

void foo()
{
    printf("foo::i: \t%d\n", i);
}


int main()
{
    puts("hejka");
    a = 0;

    nr_threads = omp_get_num_threads();
    printf("Threads: %d\n", nr_threads);

    omp_set_num_threads(7);

#pragma omp parallel private(i,j) shared(a)
{
   #pragma omp single
    {
        nr_threads = omp_get_num_threads();
        printf("Threads: %d\n", nr_threads);
    }

#pragma omp for reduction(+:a)
    for(i=0;i<10;i++)
    {
        printf("main::i:\t%d\n", i);
        foo();
    }
}

    printf("a: %lf\n",a);
    printf("i: %d\n",i);
    printf("j: %d\n",j);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您需要在并行部分内初始化i

我认为'copyin'#pragma(或类似的东西)可用于在启动并行部分时将值克隆到每个线程中。

未初始化线程私有变量。

如果内存服务,则默认构造thread = private类对象。

答案 1 :(得分:0)

问题是parallel for的循环变量隐式地为每个工作线程设置为私有,因此每个线程将获得一个私有变量i。除了名称之外,工作线程看到的i与主线程看到的i之间没有任何关联。