2017-07-07 35 views
0

我想在我的代碼的某個點調用cblas_drot,它不在並行區域中。然後我很困惑,這個調用的執行時間在單線程模式和24線程中基本相同。我在函數調用之前通過mkl_set_num_threads()設置線程數。任何人都知道發生了什麼?非常感謝。MKL:未能觀察到線程效果

該CPU是2 * Xeon E5 2620v3和OS是Unbuntu 16.04.2。

+0

Linux發行版提供的BLAS和LAPACK庫是單線程的。專有的性能庫構建如英特爾MKL和AMD可能具有適當功能的內置OpenMP線程,但不是庫中的所有功能。 mkl_set_num_threads的默認值是物理內核的數量。 – tim18

+0

MKL?rot函數被列爲線程函數,但它們似乎不太可能會擴展到24個線程,即使您有24個物理核心和一個最適合縮放的問題大小。 ark.intel.com表示每個cpu有6個內核,因此設置多於12個線程似乎會適得其反。 – tim18

回答

0

也許你正在飽和內存帶寬。該函數的計算強度非常低,性能主要取決於內存訪問的時間。實際上,可伸縮性結果在很大程度上取決於incX和incY的增量。假設N =千萬,我發現(CPU E5-2670):

N threads | time for incX=incY=1 | time for incX=incY=32 
1   | 0.026271    | 1.243775 
2   | 0.020599    | 0.555945 
4   | 0.017871    | 0.301370 
8   | 0.021367    | 0.152756 
16  | 0.021729    | 0.175500 

即示出了加速是體面多達8個線程(仍然在16有螺紋)時INCX/Y不同於1.當incX/Y = 1時,功能的非常優化的版本(大量使用AVX功能)使用可用內存帶寬的主要部分,使得OpenMP並行化的結果非常差。我只是在猜測發生了什麼:爲了確認,你可以考慮使用低級別分析器。

+0

看來我誤解了incX和incY的含義,在我的程序中我設置爲0,事實上當incX/Y = 1時,性能被認爲是可取的。但我仍然想知道incX/Y的確切含義是什麼?看起來它與填充向量寄存器有關,但我無法找到可用材料中的任何線索。 –

+0

incX/Y是必須根據操作員修改的連續數組之間的步幅(在這種情況下爲旋轉)。通常incX/Y = 1,但是,例如,當你想處理表示矩陣的數組的列時,較大的值可能是有用的。檢查基本的netlib實現以闡明:http://www.netlib.org/lapack/explore-3.1.1-html/drot.f.html – Franz