我想在openmp并行代码中将变量作为共享变量传递,但我不确定如何将结构化变量传递给共享变量。这是我的代码: 我不确定这是否是正确的方法:
struct lvl{
int *L;
int *list;
};
struct lvl* lvls(int s,int k){
struct lvl* lvls =malloc(sizeof (struct lvl));
lvls->L = (int*)calloc(s+1, sizeof(int));
lvls->list=(int*)calloc(k+1,sizeof(int));
return lvls;
}
int main(int argc, char *argv[])
{
int n=100;
int k=200;
struct lvls *lvl = lvls(n,K);
#pragma omp parallel num_threads(threadnum) private(k,bi,b,kstart,kend,v,bmax,max,bwt) firstprivate(BinAff,Blist) shared(capacity,lvl)
{
#pragma omp for schedule (static,100)
for (u=0;u<G->n;u++){
//some code in here
}
}
}
不,我想知道shared(lvl)是否是构建struct(L和list)共享数组的两个数组的正确方法?如果不是我该怎么办?我尝试了shared (lvl->L,lvl->list)
,但是我遇到了一些编译错误。
答案 0 :(得分:0)
struct
中没有数组。只有指针。 lvl
也只是一个指针。数据共享条款(例如shared
)仅适用于变量本身(地址lvl
指向)。
顺便说一句,如果您没有指定数据共享属性,那么在并行区域范围之外定义的变量将隐式shared
。内部定义的变量隐式private
。建议尽可能在本地定义变量,这样可以更容易地编写正确的代码。
例如,私有变量(例如k
)未在并行区域内初始化。