gpt4 book ai didi

c - C 中的 MPI 使用数组 - 使用 MPI_Send() 和 MPI_Recv() 实现 MPI_Scatter()

转载 作者:太空宇宙 更新时间:2023-11-04 04:38:37 25 4
gpt4 key购买 nike

我正在尝试使用 MPI 运行矩阵乘法程序。数组“a”和“b”的类型为 double ,大小为 512*512。数组“a”将被分散,数组“b”将被广播。矩阵乘法后的最终结果将在数组 c[512][512] 中收集到 master 进程中我正在尝试使用 MPI_Send() 和 MPI_Recv() 函数实现 MPI_Scatter() 但我有点陷入无限循环(可能)。 P 是进程数。

double a[512][512], b[512][512], c[512][512];
blksz = 512/P;
if(rank == 0) {
// Scatter input matrix a, implementation of MPI_Scatter()
for(j = 1 ; j < P ; j++ ) {
MPI_Send(&a + j*blksz*N*sizeof(double), blksz*N, MPI_DOUBLE, j, 0, MPI_COMM_WORLD);
}

// Broadcast the input matrix b, implementation of MPI_Bcast()
for(j = 1 ; j < P ; j++ ) {
MPI_Send(&b, N*N, MPI_DOUBLE, j, 1, MPI_COMM_WORLD);
}
}
else {
MPI_Recv(&a, blksz*N, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
MPI_Recv(&b, N*N, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &status);
}

for(i = 0 ; i < blksz; i++) {
for(j = 0 ; j < N ; j++) {
c[i][j] = 0;
for(k = 0 ; k < N ; k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}

// Gather result, implementation of MPI_Gather()
if(rank != 0) {
MPI_Send(&c, blksz*N, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD);
}
else {
for(i = 1 ; i < P ; i++) {
MPI_Recv(&c+i*blksz*N*sizeof(double), blksz*N, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD, &status);
}
}

我是编程的初学者,但我整晚都在试图弄明白,但无济于事。如果有人可以帮助我,我将不胜感激。

最佳答案

当你发送 &a + j*blksize*N*sizeof(double) 时,你并没有做你想做的事情。首先,&aa的地址,它是一个数组的数组,这不是你要发送的,你要发送一个指针,或者*a(从技术上讲这是一个数组,但它将隐式转换为指向所述数组第一个元素的指针)。接下来,在进行指针运算时,您不需要(事实上,也不应该)乘以sizeof(type);这将由编译器为您处理。所以你的第一个 MPI_Send 命令应该是

MPI_Send(*a + j*blksz*N, blksz*N, MPI_DOUBLE, j, 0, MPI_COMM_WORLD);

进行类似的更改(针对所有发送和接收),您的代码应该可以正常工作。

关于c - C 中的 MPI 使用数组 - 使用 MPI_Send() 和 MPI_Recv() 实现 MPI_Scatter(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28629140/

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