多个并行域之间,或者并行域内部的函数调用之间如果需要在线程内部共享全局变量,必须用threadprivate。如果不将全局变量声明为threadprivate而是声明为private,则在子函数调用时子函数内的全局变量传递不到子函数外面。
比如下面程序:
float global_a,global_b #pragma omp threadprivate(global_a) main() {.... #pragma omp parallel for private(i,inner_var) shared(global_b) for(i=0;i<100;i++) { sub_fun1(i); printf(....);//如果global_a 不用threadprivate而用private,在这里打印 global_a得到的结果会是0, sub_fun2(i);//并且sub_fun2内用的global_a初值也是0,即没有从sub1里面共享过来。 printf(...);//global_b是共享变量,这里可以打出来。 } } sub_fun1() { do_some_thing on global_a using i; printf(a);//如果a是private而非threadprivate,则这里可以打出来,但外面打不出来 #pragma omp critical do_some_thing else on global_b; } sub_fun2() { do_some_other_thing on global_a using i; }
Recent comments
2 weeks 6 days ago
3 weeks 20 hours ago
22 weeks 1 day ago
32 weeks 3 days ago
32 weeks 4 days ago
39 weeks 2 days ago
41 weeks 1 day ago
42 weeks 1 day ago
42 weeks 2 days ago
43 weeks 12 hours ago