2011-07-22 28 views
3

我的项目中存在严重问题。我需要将图像数据发送到群集中的另一个节点。我读与ImageMagick的图像,像:在openMPI中发送ImageMagick对象,C++

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) 

c任何人都有帮助?我几乎感到沮丧!

+0

subimage_toModify –

+0

@Nikola,我不明白你的答案! – camelian77

+0

尝试仅使用subimage_to再次修改地址。 –

回答

3

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()); 
+0

有什么想法,我可以发送它呢?像将它转换成数组并在接收时重建图像? – camelian77

+0

@ camelian77查看编辑答案 –

+0

感谢您的回答。然而,这种方法会遇到如下错误:'错误:从'const void *'无效转换为'void *' aks.C++:115:89:错误:初始化'int MPI_Send(void *,int,ompi_datatype_t * ,int,int,ompi_communicator_t *)''。我很感激你能否详细说明接收端。非常感谢你。 ' – camelian77