MPI地址未被映射 - MPI_Gather函数

问题描述 投票:0回答:1

我有下面的c代码,有一个大的向量,并且是分散在不同的处理器上,然后再聚集,我有一个自定义的MPI类型,之前已经在另一个程序上测试过。

pixel *src = (pixel*) malloc(sizeof(pixel) * MAX_PIXELS);
const int ROOT = 0;
int pid, n_processors;
pixel *receive_buffer;

MPI_Init(NULL, NULL);

MPI_Comm_rank(MPI_COMM_WORLD, &pid);
MPI_Comm_size(MPI_COMM_WORLD, &n_processors);

   [...code...]

receive_buffer = (pixel*)malloc(send_count * sizeof(pixel));
//send_count is a value calculated on root and then broadcasted
MPI_Scatter(src, send_count, mpi_pixel_type, receive_buffer, send_count, mpi_pixel_type, ROOT, MPI_COMM_WORLD);

pixel* dst = (pixel*)malloc(sizeof(pixel)*xsize*ysize_per_proccesor);

[...operations with dst and receive buffer...]

MPI_Gather(&receive_buffer, send_count, mpi_pixel_type, src, send_count, mpi_pixel_type, ROOT, MPI_COMM_WORLD);

但最后一行在执行过程中出现了以下错误

[user] Read -1, expected 32769, errno = 14
[user] *** Process received signal ***
[user] Signal: Segmentation fault (11)
[user] Signal code: Address not mapped (1)
[user] Failing at address: 0x7ffe2dd15000
[user] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x46210)[0x7f04af898210]
[user] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x18e533)[0x7f04af9e0533]
[user] [ 2] /home/yunhi/.openmpi/lib/openmpi/mca_btl_vader.so(+0x3284)[0x7f04ac24c284]
[user] [ 3] /home/yunhi/.openmpi/lib/openmpi/mca_pml_ob1.so(mca_pml_ob1_send_request_schedule_once+0x1c6)[0x7f04ac0add46]
[user] [ 4] /home/yunhi/.openmpi/lib/openmpi/mca_pml_ob1.so(mca_pml_ob1_recv_frag_callback_ack+0x1a9)[0x7f04ac0a6849]
[user] [ 5] /home/yunhi/.openmpi/lib/openmpi/mca_btl_vader.so(mca_btl_vader_poll_handle_frag+0x95)[0x7f04ac24df95]
[user] [ 6] /home/yunhi/.openmpi/lib/openmpi/mca_btl_vader.so(+0x52d7)[0x7f04ac24e2d7]
[user] [ 7] /home/yunhi/.openmpi/lib/libopen-pal.so.40(opal_progress+0x34)[0x7f04af6be0b4]
[user] [ 8] /home/yunhi/.openmpi/lib/openmpi/mca_pml_ob1.so(mca_pml_ob1_send+0x7c5)[0x7f04ac0a1a15]
[user] [ 9] /home/yunhi/.openmpi/lib/libmpi.so.40(ompi_coll_base_gather_intra_linear_sync+0xdf)[0x7f04afc5845f]
[user] [10] /home/yunhi/.openmpi/lib/openmpi/mca_coll_tuned.so(ompi_coll_tuned_gather_intra_dec_fixed+0xb7)[0x7f04ac04da27]
[user] [11] /home/yunhi/.openmpi/lib/libmpi.so.40(PMPI_Gather+0x15a)[0x7f04afc221ea]
[user] [12] ./blurc(+0x2d73)[0x5576edabed73]
[user] [13] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x7f04af8790b3]
[user] [14] ./blurc(+0x13ce)[0x5576edabd3ce]
[user] *** End of error message ***

我已经修改了内存分配,但我找不到为什么recive_buffer或source会导致地址不被映射.任何建议都会有帮助,谢谢:)

c++ c mpi openmpi
1个回答
1
投票

我想你的意思不是要把receive_buffer点的地址传到函数里吧?你要的是MPI_Gather(receive_buffer, send_count, mpi_pixel_type, src, send_count, mpi_pixel_type, ROOT, MPI_COMM_WORLD)。

© www.soinside.com 2019 - 2024. All rights reserved.