使用ifort

时间:2016-01-11 22:37:54

标签: memory fortran openmp

我正在使用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)。

感谢所有评论和想法。

1 个答案:

答案 0 :(得分:3)

我不相信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)

具有静态英特尔的动态可执行文件

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