我想知道是否有人知道更多關於大型嵌套循環崩潰原因的出價嗎? 含義我想比較雜注性能OpenMP崩潰vs大型嵌套循環不崩潰
omp parallel for private(i,j,k) collapse(3) schedule(static)
和
omp parallel for private(i,j,k) schedule(static)
嵌套的循環結構類似
for(int i=0; i<i_max; i++){
for(int j=0; j<j_max; j++){
for(int k=0; k<k_max; k++){
A[i][j][k]=B[i][j][k]+C[i][j][k];
}
}
}
其中最大電流,j_max和k_max都是什麼比可用的線數多5至10倍。
如果我理解了正確的崩潰原因,openmp會將3個迴路摺疊成一個大小爲i_max*j_max*k_max
的迴路,如果是(i_max*j_max*k_max) mod #threads = 0
,我會假設最佳性能。
是不是沒有崩潰導致openmp只會把i循環並行?如果是的話,我的下一個假設是獲得i_max mod #threads = 0
的最佳性能,我期望這兩個編譯指示都具有可比較的性能。
正如你所看到的,我在這裏非常猜測。有沒有人真的測試這兩種編譯指示的性能?
你的猜測很好。你*測試了兩種情況下的表現嗎? – Zulan
對於具有這種小體的循環,由於更好地實現了內部循環,當線程數量將「i_max」分開時,非摺疊版本可能會更快(多少?_it depends_)。摺疊環路可能會抑制其矢量化。 –
@Zulan我做了一些測試,但不知道如何解釋我的結果。在一臺服務器上,崩潰版本更快,而在另一臺服務器上則是非崩潰版本。來這裏做一些澄清,因爲我沒有服務器容量來擴展性地測試它,而不禁止一些模擬。 – LeBo