---------------------編輯------------------ -------OpenMP:ON NUMA的編譯指示取消
我已編輯的代碼如下:
#pragma omp parallel for private(i, piold, err) shared(threshold_err) reduction(+:pi) schedule (static)
{
for (i = 0; i < 10000000000; i++){ //1000000000//705035067
piold = pi;
pi += (((i&1) == false) ? 1.0 : -1.0)/(2*i+1);
err = fabs(pi-piold);
if (err < threshold_err){
#pragma omp cancel for
}
}
}
pi = 4*pi;
我與LLVM3.9/Clang4.0編譯它。當我使用一個線程運行它時,我得到了預期的結果,其中使用了雜注取消操作(對照非編譯指示取消版本進行檢查,導致運行速度更快)。
但是當我運行線程> = 2時,程序進入循環。我在NUMA機器上運行代碼。發生什麼事?也許取消條件不滿足!但是,然後代碼花費比單線程非編譯指示取消版本更長的時間!僅供參考,它在OMP_CANCELLATION = false時運行文件。
我有以下的OpenMP代碼。我正在使用LLVM-3.9/Clang-4.0編譯此代碼。
#pragma omp parallel private(i, piold, err) shared(pi, threshold_err)
{
#pragma omp for reduction(+:pi) schedule (static)
for (i = 0; i < 10000000 ; i++){
piold = pi;
pi += (((i&1) == false) ? 1.0 : -1.0)/(2*i+1);
#pragma omp critical
{
err = fabs(pi-piold);// printf("Err: %0.11f\n", err);
}
if (err < threshold_err){
printf("Cancelling!\n");
#pragma omp cancel for
}
}
}
不幸的是,我不認爲#pragma omp cancel for
被終止整個for
循環。我最終打印出的值是err
,但再次使用並行性時,會打印出哪個值會產生混淆。 err
的最終值小於threshold_err
。打印取消是打印,但在程序的最開始,這是令人驚訝的。程序在那之後繼續運行!
如何確保這是正確的實施? BTW OMP_CANCELLATION設置爲true,並且一個小測試程序爲相應的函數omp_get_cancellation()返回'1'。
嗨,感謝您的回覆。什麼是cancelFre? – algoProg
另外,當我刪除'cancel for'循環部分時,代碼在'i = 100000000'時需要約11秒。但是在取消它的過程中,我必須永遠放棄它。 – algoProg
@algoProg cancelFre是cancalling的頻率,我把它放在ompcancel之後來計算髮送取消信號的次數(這樣我就知道它只是一個信號)。我很確定我可以通過循環。我也在我的筆記本電腦上確認您的代碼也適用。我只是看到你分享了很多變數。 –