아래 코드에서 에 의해 주어진 응답 인 4x4=16
과 같을 것으로 예상했습니다. 왜 addr[2] - addr[1]
가 20을 주는가?예기치 않은 MPI 주소 오프셋
#include <mpi.h>
#include <iostream>
struct S
{
int a;
int nei[4];
double point[4];
};
int main()
{
MPI_Init(NULL, NULL);
S s;
int nblock = 3;
// block count.
int block_count[nblock] = {1, 4, 4};
// extent.
MPI_Aint lb, extent_int;
MPI_Type_get_extent(MPI_INT, &lb, &extent_int);
// offset.
MPI_Aint addr[nblock];
MPI_Get_address(&s.a, &addr[0]);
MPI_Get_address(&s.nei[0], &addr[1]);
MPI_Get_address(&s.point[0], &addr[2]);
//
std::cout << addr[1]-addr[0] << " " << block_count[0]*extent_int << std::endl;
std::cout << addr[2]-addr[1] << " " << block_count[1]*extent_int << std::endl;
MPI_Finalize();
return 0;
}
출력 :
4 4
20 16
이것은 정렬과 관련이있는 것으로 보입니다. http://stackoverflow.com/questions/11108328/double-alignment를 참조하십시오. 특히, ['x86-64, -malign-double은 기본적으로 활성화되어 있습니다. ']] (https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html) 여기에서 시작 부분 double 배열은 8 바이트의 배수 인 24 바이트입니다. – francis