使用 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
我 运行 使用 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