gpt4 book ai didi

c - 具有动态分配的 MPI 矩阵乘法 : Seg. 故障

转载 作者:行者123 更新时间:2023-12-04 06:18:52 24 4
gpt4 key购买 nike

我正在 OpenMPI 中制作一个矩阵乘法程序,我收到以下错误消息:

[Mecha Liberta:12337] *** Process received signal ***
[Mecha Liberta:12337] Signal: Segmentation fault (11)
[Mecha Liberta:12337] Signal code: Address not mapped (1)
[Mecha Liberta:12337] Failing at address: 0xbfe4f000
--------------------------------------------------------------------------
mpirun noticed that process rank 1 with PID 12337 on node Mecha Liberta exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------

这就是我定义矩阵的方式:
  int **a, **b, **r;

a = (int **)calloc(l,sizeof(int));

b = (int **)calloc(l,sizeof(int));

r = (int **)calloc(l,sizeof(int));

for (i = 0; i < l; i++)
a[i] = (int *)calloc(c,sizeof(int));

for (i = 0; i < l; i++)
b[i] = (int *)calloc(c,sizeof(int));

for (i = 0; i < l; i++)
r[i] = (int *)calloc(c,sizeof(int));

这是我的发送/接收(我很确定我的问题应该在这里):
  MPI_Send(&sent, 1, MPI_INT, dest, tag, MPI_COMM_WORLD); 
MPI_Send(&lines, 1, MPI_INT, dest, tag, MPI_COMM_WORLD);
MPI_Send(&(a[sent][0]), lines*NCA, MPI_INT, dest, tag, MPI_COMM_WORLD);
MPI_Send(&b, NCA*NCB, MPI_INT, dest, tag, MPI_COMM_WORLD);

和:
MPI_Recv(&sent, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);  
MPI_Recv(&lines, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&a, lines*NCA, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&b, NCA*NCB, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);

任何人都可以看到问题出在哪里?

最佳答案

这是 C 和多维数组以及 MPI 的常见问题。

在这一行中,说:

MPI_Send(&b, NCA*NCB, MPI_INT, dest, tag, MPI_COMM_WORLD);

你告诉 MPI 发送从 b 开始的 NCAxNCB 整数到 dest,MPI_COMM_WORLD带标签 tag .但是,b 不是指向 NCAxNCB 整数的指针;它是一个指向 NCA 指针的指针,指向 NCB 整数。

所以你想要做的是确保你的数组是连续的(无论如何可能会更好地提高性能),使用这样的东西:
int **alloc_2d_int(int rows, int cols) {
int *data = (int *)malloc(rows*cols*sizeof(int));
int **array= (int **)malloc(rows*sizeof(int*));
for (int i=0; i<rows; i++)
array[i] = &(data[cols*i]);

return array;
}

/* .... */

int **a, **b, **r;

a = alloc_2d_int(l, c);
b = alloc_2d_int(l, c);
r = alloc_2d_int(l, c);

进而
  MPI_Send(&sent, 1, MPI_INT, dest, tag, MPI_COMM_WORLD); 
MPI_Send(&lines, 1, MPI_INT, dest, tag, MPI_COMM_WORLD);
MPI_Send(&(a[sent][0]), lines*NCA, MPI_INT, dest, tag, MPI_COMM_WORLD);
MPI_Send(&(b[0][0]), NCA*NCB, MPI_INT, dest, tag, MPI_COMM_WORLD);

MPI_Recv(&sent, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&lines, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&(a[0][0]), lines*NCA, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI_Recv(&(b[0][0]), NCA*NCB, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);

应该更像预期的那样工作。

关于c - 具有动态分配的 MPI 矩阵乘法 : Seg. 故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6866723/

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