在使用mpirun -np 3 valgrind test
使用valgrind运行MPI程序时,我注意到malloc/calloc'ed数组的地址有时对于不同的进程是相同的。这会让我相信Valgrind报告的地址要么不是绝对的,要么与物理内存地址不对应——这是有道理的,因为它使用自己的分配器。有人能证实这一点吗,或者告诉我我在这里缺少了哪一个微不足道的见解?非常感谢。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <assert.h>
int main(int argc, char* argv[])
{
int rank, nproc;
/* first let MPI strip off its MPI stuff: */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
double* a;
int n = 40;
assert(a = calloc(n, sizeof(double)));
printf("Rank %d: Address of a = %pn",rank,a);
free(a);
MPI_Finalize();
return 0;
}
示例输出:
Rank 0: Address of a = 0x6dad300
Rank 1: Address of a = 0x67a8800
Rank 2: Address of a = 0x67a8800
在现代处理器/操作系统中,内存被映射到程序的进程空间中。该程序不知道(或不感兴趣)它正在使用的空间的实际物理内存地址——只有设备驱动程序真正需要。