变量中的不同值

different values in variables

本文关键字:变量      更新时间:2023-10-16

为什么mainfoo中的i值不同?

这是我的示例代码:

#include<stdio.h>
#include<omp.h>
double a;
int i;
int j;
int nr_threads;
void foo()
{
    printf("foo::i: t%dn", i);
}

int main()
{
    puts("hejka");
    a = 0;
    nr_threads = omp_get_num_threads();
    printf("Threads: %dn", 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: %dn", nr_threads);
    }
#pragma omp for reduction(+:a)
    for(i=0;i<10;i++)
    {
        printf("main::i:t%dn", i);
        foo();
    }
}
    printf("a: %lfn",a);
    printf("i: %dn",i);
    printf("j: %dn",j);
    return 0;
}

问题是parallel for的循环变量对每个工作线程都是隐式私有的,因此每个线程都会得到一个私有变量i。除了名称之外,工作线程看到的i和主线程看到的i之间没有连接。

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

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

线程专用变量未初始化。

然而,如果内存可用,则默认构造thread=private类对象。