2016-10-14 73 views
0

-----示例代碼-----------OpenACC的和高速緩存耕作

for (body1 = 0; body1 < NBODIES; body1 ++) { 
    for (body2=0; body2 < NBODIES; body2++) { 
    OUT[body1] += compute(body1, body2); 
    } 
} 

-----阻斷代碼------

for (body2 = 0; body2 < NBODIES; body2 += BLOCK) { 
    for (body1=0; body1 < NBODIES; body1 ++) { 
     for (body22=0; body22 < BLOCK; body22 ++) { 
     OUT[body1] += compute(body1, body2 + body22); 
     } 
    } 
} 

我插入OpenACC指令將代碼卸載到GPU。 但表現正在下降。 我搜索了一些論文,他們得出結論,原因是OpenACC不能利用GPU中的共享內存。但我認爲主要原因是耕作/阻塞阻止了平行。因爲耕耘會帶來數據依賴性。 如果OpenACC不提供或不鼓勵代碼耕種? 如果有一個解決方案或示例,耕耘技術可以改善OpenACC代碼。

回答

1

OpenACC可以做自動和顯式的平鋪(通過tile子句),但是,我不認爲這是你的問題。我看到的問題是由於依賴於「OUT [body1]」,body2循環不可並行化。 OpenACC的可並行執行標量減少,因此你可以嘗試以下操作:

#pragma acc parallel loop 
    for (body1 = 0; body1 < NBODIES; body1 ++) { 
    sum = 0.0; 
    #pragma acc loop reduction(+:sum) 
    for (body2=0; body2 < NBODIES; body2++) { 
     sum += compute(body1, body2); 
    } 
    OUT[body1] += sum; 
    } 

當然,我猜在這裏,如果這沒有幫助,請張貼問題的compliable例子。如果您正在使用PGI,請發佈編譯器反饋消息(-Minfo = accel)。