Performance 为什么我的笔记本电脑上的mpi速度较慢

Performance 为什么我的笔记本电脑上的mpi速度较慢,performance,mpi,Performance,Mpi,我在笔记本电脑上运行MPI(英特尔i7四核4700m 12Gb内存),即使代码不涉及进程间通信,效率也会下降。显然,我不能仅仅抛出100个进程,因为我的机器只是四核,但我认为它应该扩展到8个进程(英特尔四核模拟为8??)。例如,考虑简单的玩具FORTRAN代码: program test implicit none integer, parameter :: root=0 integer :: ierr,rank,nproc,tt,i integer :: n=100000 real :: s=

我在笔记本电脑上运行MPI(英特尔i7四核4700m 12Gb内存),即使代码不涉及进程间通信,效率也会下降。显然,我不能仅仅抛出100个进程,因为我的机器只是四核,但我认为它应该扩展到8个进程(英特尔四核模拟为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更改为等于我正在使用的处理器数量

多亏了超线程技术,四核处理器显示了8个线程,但实际上它们只有4个内核。其他4个由硬件本身使用执行管道中的空闲插槽进行调度

特别是对于计算密集型负载,这种方法根本不需要支付任何费用,在极端负载下通常也会适得其反,这是因为开销和不总是优化缓存使用

您可以尝试在BIOS中禁用超线程并进行比较:您将只有4个线程,4个内核

即使从1到4,也有资源在竞争。特别是,每个核心都有自己的一级缓存,但每对核心共享二级缓存(2x256KB),4个核心共享三级缓存

显然,所有的内核都共享内存通道

因此,您不能期望线性扩展占用越来越多的内核,因为它们必须平衡资源的使用,在顺序情况下,这些资源专用于一个内核/一个线程

所有这些都不涉及任何通信

在台式机/服务器上也会发生相同的行为,特别是对于内存密集型负载,就像在测试用例中一样

例如,对于计算密集型的矩阵乘法,这一点就不那么明显了:对于NxN矩阵,有O(N^2)个内存访问,但有O(N^3)个浮点操作