gpt4 book ai didi

c - MPI Bsend 中的错误终止

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:59 24 4
gpt4 key购买 nike

我正在尝试通过 MPI_Bsend() 发送打包结构。我做错了什么,我找不到解决方案。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "mpi.h"

#define SIZE 10

struct car {
int id;
int vmax;
char marka[SIZE];
char model[SIZE];
};

int main(int argc, char **argv) {

int i;
int rank, size;

double t1, t2;
struct car BMW, BMW2;

BMW.id = 1;
strcpy(BMW.marka, "BMW");
strcpy(BMW.model, "szybki");
BMW.vmax = 199;

MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);


int rozmiar, packet_size, msg_size, position = 0,tag;
void *bufor;

MPI_Pack_size(2, MPI_INT, MPI_COMM_WORLD, &rozmiar);
packet_size = rozmiar;
MPI_Pack_size(2 * SIZE, MPI_CHAR, MPI_COMM_WORLD, &rozmiar);
packet_size += rozmiar;

msg_size = 2 * packet_size + MPI_BSEND_OVERHEAD;

bufor = (void *)malloc(msg_size);
MPI_Buffer_attach(bufor, msg_size);

t1 = MPI_Wtime();
if (rank == 0) {
tag = 0;
for(i=1;i<size;i++){

MPI_Pack(&BMW.id,1, MPI_INT, bufor, msg_size, &position, MPI_COMM_WORLD);
MPI_Pack(&BMW.vmax,1, MPI_INT, bufor, msg_size, &position, MPI_COMM_WORLD);
MPI_Pack(&BMW.model,SIZE, MPI_CHAR, bufor, msg_size, &position, MPI_COMM_WORLD);
MPI_Pack(&BMW.marka,SIZE, MPI_CHAR, bufor, msg_size, &position, MPI_COMM_WORLD);

MPI_Bsend(bufor,position,MPI_PACKED,i,tag,MPI_COMM_WORLD);
}
} else {
MPI_Recv(bufor,msg_size,MPI_PACKED,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status);

position = 0;

MPI_Unpack(bufor, msg_size, &position, &BMW2.id, 1, MPI_INT, MPI_COMM_WORLD);
MPI_Unpack(bufor, msg_size, &position, &BMW2.vmax, 1, MPI_INT, MPI_COMM_WORLD);
MPI_Unpack(bufor, msg_size, &position, &BMW2.model, SIZE, MPI_CHAR, MPI_COMM_WORLD);
MPI_Unpack(bufor, msg_size, &position, &BMW2.marka, SIZE, MPI_CHAR, MPI_COMM_WORLD);

printf("rank = %d | BMW id: %d, marka: %s, model: %s, vmax: %d \n",rank, BMW2.id, BMW2.marka, BMW2.model, BMW2.vmax);
}

t2 = MPI_Wtime();

MPI_Buffer_detach(&bufor, &msg_size);
MPI_Finalize();

if (i == size)
printf("Elapsed time is %.15f\n", t2 - t1 );

return(0);
}

错误:

==================================================================== BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES

PID 25637 RUNNING AT debian

EXIT CODE: 11

================================================================

YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)

最佳答案

您错误地使用了 MPI 的缓冲模式。您通过 MPI_Buffer_attach 提供给 MPI 的缓冲区应该由 MPI 内部使用。不要使用缓冲的 MPI 接口(interface),它很少有用而且很难正确使用。

只需删除 MPI_Buffer_ 并使用 MPI_Send 而不是 MPI_Bsend,您就走在了正确的轨道上。 MPI_Pack 可能有点笨拙,您可能需要查看自定义数据类型 (MPI_Type_create_struct)。如果您有同构系统,您还可以发送 struct car 的原始字节。

关于c - MPI Bsend 中的错误终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50512275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com