2014-03-04 233 views
2

我在我的筆記本電腦(英特爾酷睿i7四核12GB4700米RAM),運行MPI和效率下降,甚至對於不涉及進程間通信代碼MPI慢。顯然,我不能只扔100個進程,因爲我的機器只有四核,但我認爲它應該擴展到8進程(intel四核模擬爲8 ???)。例如,考慮簡單的玩具Fortran代碼:爲什麼我的筆記本電腦

program test 
implicit none 
integer, parameter :: root=0 
integer :: ierr,rank,nproc,tt,i 
integer :: n=100000 
real :: s=0.0,tstart,tend 
complex, dimension(100000/nproc) :: u=2.0,v=0.0 

call MPI_INIT(ierr) 
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr) 
call MPI_COMM_SIZE(MPI_COMM_WORLD,nproc,ierr) 

call cpu_time(tstart) 

do tt=1,200000 
    v=0.0 
    do i=1,100000/nproc 
    v(i) = v(i) + 0.1*u(i) 
    enddo 
enddo 

call cpu_time(tend) 

if (rank==root) then 
    print *, 'total time was: ',tend-tstart 
endif 

call MPI_FINALIZE(ierr) 

end subroutine test2 

對於2個進程需要花費一半的時間,但即使想4個進程的結果開始變得不那麼有效,8個進程(應季的時間?)沒有任何改進。基本上我想知道這是否僅僅是因爲我在筆記本電腦上運行,並且與共享內存有關,或者如果我在代碼中犯了一些基本錯誤。感謝

注:在上面的例子中,我手動更改數組聲明和內環的NPROC爲等於我使用的處理器的數量。

回答

1

一個四核處理器,由於超線程顯示自己有8個線程,但實際上它們只有4個內核。其他4個由硬件本身使用執行管線中的空閒插槽進行調度。

碰巧尤其是計算密集型負載這種做法不付出所有,是往往適得其反上也因爲管理費用的極端負載,而且並不總是優化的緩存使用。

您可以嘗試在BIOS中禁用超線程和比較吧:你將只有4個線程,4個核。

即使從1到4有競爭的資源。特別是每個內核都有自己的L1緩存,但每對內核共享L2緩存(2×256KB),4個內核共享L3緩存。

而且所有的核心顯然都共享內存通道。

所以你不能指望有線性縮放佔據越來越多的內核,因爲它們必須平衡的資源,專用於一個核心/一個線程在連續情況下使用。

所有這些都不涉及通信。

同樣的情況發生在臺式機/服務器,特別是內存密集型負載,作爲一個在您的測試情況。例如,用矩陣 - 矩陣乘法就不那麼明顯,這是計算密集型的:對於NxN矩陣,您有O(N^2)次內存訪問,但是O(N^3)次浮點操作。

相關問題