我正在使用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)。
感谢所有评论和想法。
答案 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