我想知道是否有人知道更多关于大型嵌套循环崩溃原因的出价吗? 含义我想比较杂注性能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