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;
}

Reply via email to