我想在其中内部循环并行循环。我的代码看起来像这样:
#pragma omp parallel for private(jb,ib) shared(n, Nb, lb, lastBlock, jj, W, WT) schedule(dynamic) //private(ib, jb) shared(n, Nb, lb, lastBlock, jj, W, WT) //parallel for loop with omp
for(jb=0; jb<Nb; jb++)
{
int lbh = (jb==Nb-1) ? lastBlock : lb;
int ip = omp_get_thread_num();
packWT(a, n, lb, s, jb, colNr, WT[ip], nr); //pack WWT[jb]
for(ib=jb; ib<Nb; ib++)
{
int lbv = (ib==Nb-1) ? lastBlock : lb;
multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh); //MULT BLOCK - 2x4xK (W[jb]*W[ib])
}
}
我测量proc花在计算这个循环上的时间。少数线程与一个线程相同。当我改变条款
private(jb,ib)
的
private(jb)
一切都在改变。我的意思是少数线程proc计算速度比一个线程快。有什么问题?
答案 0 :(得分:4)
问题是你的内部for循环不是规范形状。因此,openmp无法并行化循环,并且不能实现加速。循环需要如下图所示。在start,idx和inc不允许在代码的并行部分期间更改。
我想我确定了你的问题。你正在调用这些功能:
packWT(a, n, lb, s, jb, colNr, WT[ip], nr); packWT(a, n, lb, s, jb, colNr, WT[ip], nr);
multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh);
其中一个参数是循环变量jb,因为jb可以在函数内部更改(取决于函数声明),编译器决定不并行化循环。 为了避免这种情况,请将变量jb复制到局部变量,并将局部变量传递给函数。