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
有很多原因可以,但沒有更多的信息,我們都不會告訴你任何事情。 –