基础:我有非常大的并行Fortran90/MPI程序,它代表了复杂的物理模型.我想为它添加新功能:例如,我需要组织消息队列,在某处引入mergesort并使用哈希表.
问题:我知道如何写自己的哈希表,创建队列和代码合并,但我不认为发明一辆自行车是个好主意.
问题: Fortran大师在这种情况下应该做些什么?我是否应该构建与Fortran的C++类绑定并使用STL实现逻辑,或者您可以建议一些类似Fortran STL的库?谢谢.
在大量内核上调试我的程序,我遇到了非常奇怪的错误insufficient virtual memory.我的调查导致代码的和平,主机向每个从机发送小消息.然后我写了一个小程序,其中1个master只发送10个整数,MPI_SEND所有从属接收它MPI_RECV./proc/self/status前后文件的比较MPI_SEND表明,内存大小之间的差异是巨大的!最有趣的事情(崩溃我的程序)是,这个内存不会释放后MPI_Send仍然占用大量空间.
有任何想法吗?
System memory usage before MPI_Send, rank: 0
Name: test_send_size
State: R (running)
Pid: 7825
Groups: 2840
VmPeak: 251400 kB
VmSize: 186628 kB
VmLck: 72 kB
VmHWM: 4068 kB
VmRSS: 4068 kB
VmData: 71076 kB
VmStk: 92 kB
VmExe: 604 kB
VmLib: 6588 kB
VmPTE: 148 kB
VmSwap: 0 kB
Threads: 3
System memory usage after MPI_Send, rank 0
Name: test_send_size
State: R (running)
Pid: …Run Code Online (Sandbox Code Playgroud) 我在谷歌和这个网站上搜索了我的问题,但我仍然不理解解决方案.
我有一些MPI程序哪些RECV数据.程序在大型阵列上崩溃,虚拟内存不足,所以我开始考虑/proc/self/status文件.
之前MPI_RECV:
Name: model.exe
VmPeak: 841640 kB
VmSize: 841640 kB
VmHWM: 15100 kB
VmRSS: 15100 kB
VmData: 760692 kB
Run Code Online (Sandbox Code Playgroud)
之后:
Name: model.exe
VmPeak: 841640 kB
VmSize: 841640 kB
VmHWM: 719980 kB
VmRSS: 719980 kB
VmData: 760692 kB
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu上测试它并通过系统监视器看到这个内存增加了.但我很困惑,VmSize(和VmPeak)参数没有变化.
问题是 - 实际内存使用情况的指标是什么?
这是真的指标VmRSS吗?(并且VmSize仅分配但仍未使用内存)
我正在尝试编写一个过程,该过程存储用户数组的地址以供进一步处理.问题被封装在这个测试程序中:
program test_ptr
real(4), target, allocatable :: i4(:,:)
real(8), target, allocatable :: i8(:,:)
real(4), pointer :: p(:,:)
allocate(i4(2,2))
allocate(i8(2,2))
p => i4 ! ok
p => i8 ! compile error
end
Run Code Online (Sandbox Code Playgroud)
编译器建议为不同类型制作不同的指针.但我不想为real(4)和real(8)创建单独的指针.我试图制作通用和紧凑的解决方案,并有一个指针用于不同类型的数据.可能吗?