отправка объекта ImageMagick в openMPI, C ++ - PullRequest
3 голосов
/ 22 июля 2011

У меня серьезная проблема в моем проекте.Мне нужно отправить данные изображения на другой узел в кластере.Я читаю изображения с помощью ImageMagick, как:

Image testImage;

// read in the file
testImage.read("image.png");

И отправляю его как:

MPI_Send( &testImage, sizeof(Image), MPI_BYTE, i , 100, MPI_COMM_WORLD);

, остальные узлы должны получать его как:

Image subimage_toModify;
MPI_Recv( &subimage_toModify, sizeof(Image), MPI_BYTE, 0, 100, MPI_COMM_WORLD, &status);

Но я получаю ошибку сегментации:

Signal code: Address not mapped (1)

Может ли кто-нибудь помочь?я почти разочарован!

1 Ответ

3 голосов
/ 23 июля 2011

Класс Image не является типом POD, поэтому вы не можете отправить его, используя MPI_Send

Самый простой способ сделать это - отправить BLOB-данные, которые вы можете получить из объекта Image, но они могут быть неоптимальными. Итак, сделайте это так:

Image testImage;

// read in the file
testImage.read("image.png");

Blob blob;
testImage.write( & blob );
int size = blob.length();
MPI_Send( &size, sizeof( size ), MPI_BYTE, i , 100, MPI_COMM_WORLD);
MPI_Send( blob.data(), blob.length(), MPI_BYTE, i , 100, MPI_COMM_WORLD);

Для получения:

int size = 0;
MPI_Recv( &size, sizeof( size ), MPI_BYTE, 0, 100, MPI_COMM_WORLD, &status);
std::vector< unsigned char > tempBuffer( size, 0 );
MPI_Recv( &tempBuffer[0], tempBuffer.size(), MPI_BYTE, 0, 100, MPI_COMM_WORLD, &status);
Blob blob( &tempBuffer[0], tempBuffer.size());
...