2014-03-04 2 views
2

내 노트북 ​​(인텔 i7 쿼드 코어 4700m 12Gb RAM)에서 MPI를 실행 중이며 프로세스 간 통신이없는 코드의 경우에도 효율이 떨어집니다. 분명히 내 컴퓨터가 쿼드 코어이기 때문에 100 개의 프로세스를 던질 수는 없지만 8 프로세스 (인텔 쿼드 코어는 8대로 시뮬레이트)로 확장해야한다고 생각했습니다. 그것은 절반의 시간이 걸리지 만도 4 개 프로세스를 시도하는내 랩톱에서 mpi가 느린 이유는 무엇입니까

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 

이 개 프로세스에 대한 결과는 덜 효율적이고 8 개 프로세스가 시작 : 예를 들어, 간단한 장난감 포트란 코드를 고려 (시간의 분기를해야 하는가?) 무엇이든 개선은 없습니다. 기본적으로 랩톱 컴퓨터에서 실행되고 공유 메모리와 관련이 있거나 코드에서 근본적인 실수를 저지르고 있기 때문에 이것이 단지 것인지 궁금합니다. 감사합니다

참고 : 위의 예에서는 배열 선언에서 nproc을 수동으로 변경하고 내부 루프는 사용중인 프로세서 수와 동일하게 변경합니다.

답변

1

하이퍼 스레딩 덕분에 쿼드 코어 프로세서는 8 개의 스레드를 가지고 있음을 보여 주지만 실제로는 4 코어입니다. 나머지 4 개는 실행 파이프 라인의 빈 슬롯을 사용하여 하드웨어 자체에서 예약됩니다.

특히 계산량이 많은로드에서는이 방법이 전혀 비용이 들지 않으며 오버 헤드와 항상 캐시 사용량이 최적화되어 있지 않기 때문에 극단적 인로드로 인해 종종 비생산적입니다.

BIOS에서 하이퍼 스레딩을 비활성화하고 비교해보십시오. 단지 4 개의 스레드와 4 개의 코어 만 사용하면됩니다.

1에서 4까지가는 경우에도 경쟁중인 리소스가 있습니다. 특히 각 코어에는 자체 L1 캐시가 있지만 각 코어 쌍은 L2 캐시 (2x256KB)를 공유하며 4 코어는 L3 캐시를 공유합니다.

그리고 모든 코어가 분명히 메모리 채널을 공유합니다.

순차적 인 경우 하나의 코어/하나의 스레드 전용으로 사용되는 리소스 사용의 균형을 조정해야하기 때문에 더 많은 코어를 차지하는 선형 확장을 기대할 수 없습니다.

이 모든 것은 통신을 전혀 포함하지 않습니다.

데스크톱/서버, 특히 메모리 사용량이 많은로드의 경우 테스트 사례와 동일한 문제가 발생합니다.

예를 들어 연산 집약적 인 행렬 행렬 곱셈에서는 그다지 명확하지 않습니다. NxN 행렬에 대해서는 O (N^2) 개의 메모리 액세스가 있지만 O (N^3) 부동 소수점 연산이 있습니다.

관련 문제