我想重構基於OpenMP的程序,並遇到一個可怕的可伸縮性問題。以下(顯然不是很有意義)的OpenMP程序似乎重現了這個問題。當然,微小的示例代碼可以重寫爲嵌套for循環,並且可以實現幾乎完美的可擴展性。但是,我正在處理的原始程序不允許這樣做。OpenMP並行的內部做 - 而
因此,我正在尋找一個修復程序,保持do-while結構。根據我的理解,OpenMP應該足夠聰明,以保持迭代之間的線程活躍,並且我期望具有良好的可伸縮性。爲什麼不是這種情況?
int main() {
const int N = 6000;
const int MAX_ITER = 2000000;
double max = DBL_MIN;
int iter = 0;
do {
#pragma omp parallel for reduction(max:max) schedule(static)
for(int i = 1; i < N; ++i) {
max = MAX(max, 3.3*i);
}
++iter;
} while(iter < MAX_ITER);
printf("max=%f\n", max);
}
我用Cray compiler 8.3.4測量了以下運行時間。
OMP_NUM_THREADS=1 : 0m21.535s
OMP_NUM_THREADS=2 : 0m12.191s
OMP_NUM_THREADS=4 : 0m9.610s
OMP_NUM_THREADS=8 : 0m9.767s
OMP_NUM_THREADS=16: 0m13.571s
這似乎與this question相似。提前致謝。幫助表示讚賞! :)
你的物理機器上有多少個線程/內核?另外,如果你在'for'循環中只做很少的工作,你可能無法獲得良好的可伸縮性。 – NoseKnowsAll
我有32個內核分在2個CPU之間。每個核心都有2個超線程線程。 CPU是Intel Xeon E5-2698v3。 – aka