我有一些麻煩將一些變量從void *轉換爲MPI_Aint。下面是代碼的某些部分:(當我評論的最後一行中沒有錯誤)從無效轉換爲MPI_Aint
...
mmap succeeded 0x7fab7b490000
...
*** Process received signal ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: (nil)
任何想法,以幫助
C:
void myfunc_(MPI_Aint *out_ptr, ...)
...
void *ptr = mmap(...)
...
*out_ptr = (MPI_Aint) ptr;
Fortran :
#ifdef DOUBLE_PREC
integer, parameter, public :: mytype = KIND(0.0D0)
integer, parameter, public :: real_type = MPI_DOUBLE_PRECISION
#endif
INTEGER BSIZ, CORE_COMM, status
real(mytype), pointer :: SND
...
call myfunc(SND, BSIZ, real_type, CORE_COMM, status)
MMAP是在錯誤的工作,但在那裏?下面是完整的C函數代碼:
void myfunc_(MPI_Aint *out_ptr, MPI_Fint *nelem, MPI_Fint *type,
MPI_Fint *comm, MPI_Fint *ret)
{
MPI_Comm world;
int mype;
world = MPI_Comm_f2c(*comm);
MPI_Comm_rank(world, &mype);
char filename[20];
#define POSIX_SHM
int i,j;
int world_rank = -1, world_size = -1;
int mpi_result = MPI_SUCCESS;
int color = -1;
int ranks_per_node = -1;
MPI_Comm IntraNodeComm;
int node_shmem_bytes;
mpi_result = MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
assert(mpi_result==MPI_SUCCESS);
mpi_result = MPI_Comm_size(MPI_COMM_WORLD, &world_size);
assert(mpi_result==MPI_SUCCESS);
if (world_rank==0)
{
char * env_char;
int units = 1;
int num_count = 0;
env_char = getenv("NODE_SHARED_MEMORY");
if (env_char!=NULL)
{
if (NULL != strstr(env_char,"G")) units = 1000000000;
else if (NULL != strstr(env_char,"M")) units = 1000000;
else if (NULL != strstr(env_char,"K")) units = 1000;
else units = 1;
num_count = strspn(env_char, "");
memset(&env_char[num_count], ' ', strlen(env_char)-num_count);
node_shmem_bytes = units * atoi(env_char);
printf("%7d: NODE_SHARED_MEMORY = %d bytes \n", world_rank, node_shmem_bytes);
}
else
{
node_shmem_bytes = getpagesize();
printf("%7d: NODE_SHARED_MEMORY = %d bytes \n", world_rank, node_shmem_bytes);
}
}
mpi_result = MPI_Bcast(&node_shmem_bytes, 1, MPI_INT, 0, MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
int node_shmem_count = node_shmem_bytes/sizeof(double);
node_shmem_count = (int) *nelem;
node_shmem_bytes = node_shmem_count * sizeof(double) * 2;
fflush(stdout);
MPI_Barrier(MPI_COMM_WORLD);
IntraNodeComm = world;
int subcomm_rank = -1;
mpi_result = MPI_Comm_rank(IntraNodeComm, &subcomm_rank);
assert(mpi_result==MPI_SUCCESS);
sprintf(filename,"/foo_%d_%d_%d",*nelem,*type,*comm);
#if defined(POSIX_SHM)
int fd;
if (subcomm_rank==0)
fd = shm_open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
if (subcomm_rank!=0)
fd = shm_open(filename, O_RDWR, S_IRUSR | S_IWUSR);
if (fd<0) printf("%7d: shm_open failed: %d \n", world_rank, fd);
else printf("%7d: shm_open succeeded: %d \n", world_rank, fd);
#elif defined(DEV_SHM)
int fd = open("/dev/shm/foo", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd<0) printf("%7d: open failed: %d \n", world_rank, fd);
else printf("%7d: open succeeded: %d \n", world_rank, fd);
#else
int fd = -1;
printf("%7d: no file backing \n", world_rank);
#endif
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
if (fd>=0 && subcomm_rank==0)
{
int rc = ftruncate(fd, node_shmem_bytes);
if (rc==0) printf("%7d: ftruncate succeeded \n", world_rank);
else printf("%7d: ftruncate failed \n", world_rank);
}
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
#ifdef __bgp__
double * ptr = NULL;
_BGP_Personality_t pers;
Kernel_GetPersonality(&pers, sizeof(pers));
if(BGP_Personality_processConfig(&pers) == _BGP_PERS_PROCESSCONFIG_SMP)
{
printf("SMP mode => MAP_PRIVATE | MAP_ANONYMOUS \n");
ptr = mmap(NULL, node_shmem_bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, fd, 0);
}
else
{
if (node_shmem_bytes>pers.Kernel_Config.SharedMemMB)
{
printf("node_shmem_bytes (%d) greater than pers.Kernel_Config.SharedMemMB (%d) - allocating the latter \n",
node_shmem_bytes, pers.Kernel_Config.SharedMemMB);
node_shmem_bytes = pers.Kernel_Config.SharedMemMB;
}
ptr = mmap(NULL, node_shmem_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
}
#else
void *ptr = mmap(NULL, node_shmem_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
#endif
if (ptr==NULL) printf("%7d: mmap failed \n", world_rank);
else printf("%7d: mmap succeeded %p\n", world_rank,ptr);
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
mpi_result = MPI_Comm_size(IntraNodeComm, &ranks_per_node);
assert(mpi_result==MPI_SUCCESS);
if (0==subcomm_rank) printf("%7d: ranks_per_node = %d \n", world_rank, ranks_per_node);
fflush(stdout);
for (i=0; i<ranks_per_node; i++)
{
if (i==subcomm_rank)
{
printf("%7d: subcomm_rank %d setting the buffer \n", world_rank, subcomm_rank);
//for (j=0; j<node_shmem_count; j++) ptr[j] = (double)i;
printf("%7d: memset succeeded \n", world_rank);
int rc = msync(ptr, node_shmem_bytes, MS_INVALIDATE | MS_SYNC);
if (rc==0) printf("%7d: msync succeeded, %p \n", world_rank, ptr);
else printf("%7d: msync failed \n", world_rank);
}
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
//printf("%7d: ptr = %lf ... %lf \n", world_rank, ptr[0], ptr[node_shmem_count-1]);
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
}
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
if (ptr!=NULL)
{
int rc = munmap(ptr, node_shmem_bytes);
if (rc==0) printf("%7d: munmap succeeded %p, %d\n", world_rank,ptr, (MPI_Aint) ptr);
else printf("%7d: munmap failed \n", world_rank);
}
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
#if defined(POSIX_SHM)
//if (fd>=0)
if (fd>=0 && subcomm_rank==0)
{
int rc = -1;
rc = shm_unlink(filename);
if (rc==0) printf("%7d: shm_unlink succeeded %p\n", world_rank,ptr);
else printf("%7d: shm_unlink failed \n", world_rank);
}
#elif defined(DEV_SHM)
if (fd>=0 && subcomm_rank==0)
{
int rc = -1;
rc = ftruncate(fd, 0);
if (rc==0) printf("%7d: ftruncate succeeded \n", world_rank);
else printf("%7d: ftruncate failed \n", world_rank);
rc = close(fd);
if (rc==0) printf("%7d: close succeeded \n", world_rank);
else printf("%7d: close failed \n", world_rank);
}
#endif
fflush(stdout);
mpi_result = MPI_Barrier(MPI_COMM_WORLD);
assert(mpi_result==MPI_SUCCESS);
*out_ptr = (MPI_Aint) ptr;
}
如果您可以依賴MPI-3的存在,只需使用MPI_Win_allocate_shared而不是myfunc即可。這是來自寫myfunc的人:-) [https://wiki.alcf.anl.gov/parts/index.php/Shared_memory] – Jeff