Сообщаются ли адреса памяти в valgrind абсолютных, физических адресах?

Запуская программу MPI с valgrind с использованием mpirun -np 3 valgrind test, я заметил, что адреса массивов 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 = %p\n",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

person ladc    schedule 11.07.2013    source источник


Ответы (1)


В современных процессорах/операционных системах память отображается в пространство процесса программы. Программа не имеет никакого представления (и не интересуется) фактическим адресом физической памяти пространства, которое она использует — в действительности в ней нуждаются только драйверы устройств.

person Curt    schedule 11.07.2013