使用 ifort 编译的 openmp 程序的 690mb 内存开销

690mb memory overhead for openmp program compiled with ifort

我 运行 使用 openmp 和 fortran 进行了一些测试,然后意识到使用 ifort 15 (15.0.0 20140723) 编译的二进制文件有 690MB 的虚拟内存开销。

我的示例程序是:

program sharedmemtest
  use omp_lib
  implicit none
  integer :: nroot1
  integer, parameter :: dp = selected_real_kind(14,200)
  real(dp),allocatable :: matrix_elementsy(:,:,:,:)

  !$OMP PARALLEL NUM_THREADS(10) SHARED(matrix_elementsy)                                                                                                                           
  nroot1=2

  if (OMP_GET_THREAD_NUM() == 0) then
    allocate(matrix_elementsy(nroot1,nroot1,nroot1,nroot1))
    print *, "after allocation"
    read(*,*)
  end if
  !$OMP BARRIER                                                                                                                                                                     

  !$OMP END PARALLEL                                                                                                                                                                
end program

运行

ifort -openmp test_openmp_minimal.f90 && ./a.out   

显示内存使用量为

50694 user    20   0  694m 8516 1340 S  0.0  0.0   0:03.58 a.out 

在顶部。 运行

gfortran -fopenmp test_openmp_minimal.f90 && ./a.out 

显示内存使用量为

50802 user    20   0 36616  956  740 S  0.0  0.0   0:00.98 a.out    

用ifort编译时690MB的开销从何而来?难道我做错了什么?或者这是 ifort 中的错误?

为了完整性:这是从一个更大的程序中提取的最小示例。我正在使用 gfortran 4.4 (4.4.7 20120313)。

我感谢所有评论和想法。

我不相信top在这里是可靠的。我没有看到任何证据表明从您的测试创建的二进制文件分配了接近那么多内存的任何地方。

下面我展示了正常生成二进制文件的结果,英特尔库静态链接,所有内容都静态链接。静态二进制文件大约为 2-3 兆字节。

我认为是从堆中分配的 OpenMP 线程堆栈可能是此处添加虚拟内存的来源。你能用 OMP_STACKSIZE=4K 试试这个测试吗?我认为默认是几兆字节。

动态可执行文件

jhammond@cori11:/tmp> ifort -O3 -qopenmp smt.f90 -o smt
jhammond@cori11:/tmp> size smt
   text    data     bss     dec     hex filename
 748065   13984  296024 1058073  102519 smt
jhammond@cori11:/tmp> ldd smt
    linux-vdso.so.1 =>  (0x00002aaaaaaab000)
    libm.so.6 => /lib64/libm.so.6 (0x00002aaaaab0c000)
    libiomp5.so => /opt/intel/parallel_studio_xe_2016.0.047/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64/libiomp5.so (0x00002aaaaad86000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002aaaab0c7000)
    libc.so.6 => /lib64/libc.so.6 (0x00002aaaab2e4000)
    libgcc_s.so.1 => /opt/gcc/5.1.0/snos/lib64/libgcc_s.so.1 (0x00002aaaab661000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00002aaaab878000)
    /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)

具有静态 Intel 的动态可执行文件

jhammond@cori11:/tmp> ifort -O3 -qopenmp smt.f90 -static-intel -o smt
jhammond@cori11:/tmp> size smt
   text    data     bss     dec     hex filename
1608953   41420  457016 2107389  2027fd smt
jhammond@cori11:/tmp> ls -l smt
-rwxr-x--- 1 jhammond jhammond 1872489 Jan 12 05:51 smt

静态可执行文件

jhammond@cori11:/tmp> ifort -O3 -qopenmp smt.f90 -static -o smt
jhammond@cori11:/tmp> size smt
   text    data     bss     dec     hex filename
2262019   43120  487320 2792459  2a9c0b smt
jhammond@cori11:/tmp> ldd smt
    not a dynamic executable