Hi,
I have a segfault while trying to use MPI_Register_datarep with
openmpi-1.10.2:
mpic++ -g -o int64 int64.cc
./int64
[melkor:24426] *** Process received signal ***
[melkor:24426] Signal: Segmentation fault (11)
[melkor:24426] Signal code: Address not mapped (1)
[melkor:24426] Failing at address: (nil)
[melkor:24426] [ 0] /lib64/libpthread.so.0(+0xf1f0)[0x7f66cfb731f0]
[melkor:24426] *** End of error message ***
Segmentation fault (core dumped)
I have attached the beginning of a test program that use this function.
(and btw a totally different error occur with mpich:
http://lists.mpich.org/pipermail/discuss/2016-March/004586.html)
Can someone help me?
Thanks,
Eric
#include <iostream>
#include "mpi.h"
#include <unistd.h>
#include <limits.h>
#include <fcntl.h>
void abortOnError(int ierr) {
if (ierr != MPI_SUCCESS) {
printf("ERROR Returned by MPI: %d\n",ierr);
char* lCharPtr = new char[MPI_MAX_ERROR_STRING];
int lLongueur = 0;
MPI_Error_string(ierr,lCharPtr, &lLongueur);
printf("ERROR_string Returned by MPI: %s\n",lCharPtr);
MPI_Abort( MPI_COMM_WORLD, 1 );
}
}
namespace PAIO {
int calculeExtentInt64VsInt32(MPI_Datatype pDataType,
MPI_Aint *pFileExtent,
void *pExtraState)
{
int lReponse = MPI_ERR_TYPE;
if (pDataType == MPI_LONG_INT) {
lReponse = 8;
}
return lReponse;
}
int conversionLectureInt64VersInt32(void* pUserBuf,
MPI_Datatype pDataType,
int pCount,
void *pFileBuf,
MPI_Offset pPosition,
void* pExtraState)
{
if (pDataType != MPI_LONG_INT) {
return MPI_ERR_TYPE;
}
//ici byte_swap pas nécessaire...
// Conversion du int64 en int32:
for (int i = 0; i < pCount; ++i) {
((int*) pUserBuf)[pPosition+i] = ((long long int*) pFileBuf)[i];
}
return MPI_SUCCESS;
}
int conversionEcritureInt32VersInt64(void* pUserBuf,
MPI_Datatype pDataType,
int pCount,
void *pFileBuf,
MPI_Offset pPosition,
void* pExtraState)
{
if (pDataType != MPI_LONG_INT) {
return MPI_ERR_TYPE;
}
// Conversion du int32 en int64:
for (int i = 0; i < pCount; ++i) {
((long long int*) pFileBuf)[i] = ((int*) pUserBuf)[pPosition+i];
}
//ici byte_swap pas nécessaire...
return MPI_SUCCESS;
}
}
int main (int argc, char *argv[])
{
MPI_Init( &argc, &argv );
int nb_proc = 0;
MPI_Comm_size( MPI_COMM_WORLD, &nb_proc );
//Appelle l'enregistrement d'un nouveau "datarep":
abortOnError(MPI_Register_datarep("int64",
PAIO::conversionLectureInt64VersInt32,
PAIO::conversionEcritureInt32VersInt64,
PAIO::calculeExtentInt64VsInt32,
NULL));
MPI_Finalize();
return 0;
}