2016-03-08 55 views
3

在運行Linux的共享內存系統上,假設它有4個Intel Xeon-E5 CPU,每個CPU有10個內核。 PBS Pro已安裝。例如,如果用戶使用qsub -l select=1:ncpu=30來運行軟件程序(如果他們想運行在核心上),那麼它們就可以運行。或者爲其他軟件做setenv OMP_NUM_THREADS 30何時使用MPI和OpenMP以及PBS Pro進行超線程?

我的問題主要與基於MPI的商業軟件包有關。忽略PBS和qsub一會兒,運行這些程序的所有操作都是在啓動後從下拉菜單中選擇要運行的內核數量,或者在啓動時使用類似./cfd.exe -np 30的內核來使用30個內核。

系統有4個物理插座= 4個CPU;每個CPU有10個核心= 40個物理核心; 每個核心擁有超線程,所以cat /proc/cpuinfo將與80級的CPU或核心編號從0報到79.

Q1:我很困惑,當&超線程是如何發生的, 如果它會自動發生在幕後, 或者如果我不得不手動調用它發生。

對於一個系統有很多內核,但爲了簡單起見,我將繼續使用上面的數字,現在當使用PBS Pro和qsub並且用戶使用qsub -l select=1:ncpu=20時,他們會分配10個物理內核,編號從10..19開始,分配了10個虛擬核心,編號從50..59。這讓我想到下面的問題2-

q2:什麼是正確的運行方式? 如果/ proc/cpuinfo總共返回80 CPU那麼我可以安全地假設我總是可以做./cfd.exe -np 80setenv OMP_NUM_THREADS 80並確保每個核心未運行在50%?或者我必須永遠不會比-np 40更大,並讓系統處理它?

我使用cfd軟件作爲例子,但我也問過這個問題,關於我和同事們寫的使用OpenMP和其他並行指令的軟件。

q3:我正確地認爲,如果我啓動一個軟件程序並指定它在4個內核上運行,或者它被硬編碼以查找至多4個內核並行運行,那麼如果CPU是超線程能力,會超線程自動發生在幕後?這樣如果我要在BIOS或EFI級別禁用超線程,那麼我的程序運行速度會更慢?假設程序和問題線性擴展,8個內核應該總是兩倍於4個內核,16個內核總是是8個內核的兩倍,依此類推。這個問題#3我對正確理解最感興趣。

回答

1

Q1

超線程(HT)裝置,有兩個處理器 *該共享物理芯。

*:我使用Linux術語中的術語處理器。使用激活的超線程處理器將等於一個硬件線程

您沒有在應用程序中明確使用HT。 HT是否被使用取決於應用程序線程是否在共享物理內核的處理器上運行。

批處理系統如何處理這取決於配置。 根據我的經驗,HT通常在共享批處理系統中被禁用,因爲它使事情變得複雜,導致微妙的性能問題,並且很少爲優化的代碼提供顯着的性能優勢。 關於如何處理HT in PBS有一些有趣的文檔。

我建議你嘗試通過運行以下作業驗證您從批處理系統得到了什麼樣的處理器:

bash -c "taskset -p \$\$" 

注逃脫\$\$使用內部的bash的進程ID - 而不是一個調用作業提交。 生成的十六進制親和度掩碼告訴你哪些處理器正在運行。例如5 = 00000101將意味着處理器0和2

Q3

我想你誤會HT。它不會爲您提供2x加速,因爲您擁有兩倍的處理器。您可能會獲得10%的加速,或者您的應用程序運行速度可能會變慢。如果您的目標是性能,您總是會選擇使用具有獨立內核的4個處理器,而不是共享2個內核的4個處理器。

q2

它高度依賴於應用程序,如果它受益於HT。 如果要使用HT,只需運行最大數量的進程/線程即可利用所有處理器(或硬件線程)。

如果您的應用程序不受益於HT,請選擇進程/線程的數量作爲物理內核的數量。 然後,您可以通過確保您的應用程序線程僅允許爲每個物理核心使用一個硬件線程來幫助調度程序。通過PBS,tasksetKMP_AFFINITY