3
我想并行循环与内部循环。我的代码如下所示:OpenMP:无法并行嵌套for循环
#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的计算速度比一个线程快。问题是什么?
这里没有多少东西 - 什么是packWT,multBlock,a等? - 但你肯定需要这个ib是私有的,否则线程会覆盖相同的循环索引。没有private(ib)的情况下,它的速度更快的原因可能是许多ib的跳过没有它... –
确实,没有私人(ib)我得到错误的结果..仍然不知道为什么时间是相同的许多线程和一个线程... – Pelsono
有很多原因可以,但没有更多的信息,我们都不会告诉你任何事情。 –