在運行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 80
或setenv OMP_NUM_THREADS 80
並確保每個核心未運行在50%?或者我必須永遠不會比-np 40
更大,並讓系統處理它?
我使用cfd軟件作爲例子,但我也問過這個問題,關於我和同事們寫的使用OpenMP和其他並行指令的軟件。
q3:我正確地認爲,如果我啓動一個軟件程序並指定它在4個內核上運行,或者它被硬編碼以查找至多4個內核並行運行,那麼如果CPU是超線程能力,會超線程自動發生在幕後?這樣如果我要在BIOS或EFI級別禁用超線程,那麼我的程序運行速度會更慢?假設程序和問題線性擴展,8個內核應該總是兩倍於4個內核,16個內核總是是8個內核的兩倍,依此類推。這個問題#3我對正確理解最感興趣。