gpt4 book ai didi

c - C语言中使用MPI添加数组

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

我是 MPI 编程的新手。在下面的代码中,我尝试使用流程 1 添加前 3 个元素,使用流程 2 添加最后 3 个元素。结果应显示前三个元素的 Sum is 11Sum is 18 最后三个元素。我看到我的问题的原因是在第 2 级(进程 2)它读取 arr[3] 作为数组的第一个元素。我真的很迷惑为什么它不能在第 2 位正确读取数组的第 3 个元素

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

int main (int argc, char *argv[])
{
MPI_Init(&argc, &argv);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int tag2 = 1;
int tag1 = 2;
int arr[7] = { 6,2,3,9,4,5};

printf ("\n--Current Rank: %d\n", world_rank);
int index;
int source = 0;
int dest;
if (world_rank == 0)
{
printf("* Rank 0 excecuting");
index = 0;
dest = 1;
MPI_Send(&index, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
MPI_Send(&arr, 2, MPI_INT, dest, tag2, MPI_COMM_WORLD);

index = 3;
dest = 2;
MPI_Send(&index, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
MPI_Send(&arr, 1, MPI_INT, dest, tag2, MPI_COMM_WORLD);
}
else
{
int sum = 0;
int i;
MPI_Recv(&index, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&arr[index], 20, MPI_INT, source, tag2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("At Rank: %d index is: %d\n", world_rank, index);
for(i = index; i<=index+2; i++)
{
printf("i: %d and arr[i]: %d\n", i, arr[i]);
sum = arr[i]+sum;
}
printf("\n Sum is: %d and arr[3]: %d\n", sum, arr[3]);
}

MPI_Finalize();
}

使用命令后得到的结果:mpirun -np 3 test1

--Current Rank: 0

--Current Rank: 1
At Rank: 1 index is: 0
i: 0 and arr[i]: 6
i: 1 and arr[i]: 2
i: 2 and arr[i]: 3

Sum is: 11 and arr[3]: 9 //here it shows the correct value of 3rd array element

--Current Rank: 2
At Rank: 2 index is: 3
i: 3 and arr[i]: 6 //Error happens here
i: 4 and arr[i]: 4
i: 5 and arr[i]: 5

Sum is: 15 and arr[3]: 6 //Show the wrong array value for 3rd element
* Rank 0 excecuting

最佳答案

嗯,代码按照您的要求执行...

        index = 3;
dest = 2;
MPI_Send(&index, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
MPI_Send(&arr, 1, MPI_INT, dest, tag2, MPI_COMM_WORLD);

也许你更想要:

        index = 3;
dest = 2;
MPI_Send(&index, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
MPI_Send(&arr[index], 3, MPI_INT, dest, tag2, MPI_COMM_WORLD);

而其他索引“有效”的事实是因为初始分配...

这段代码还有一些问题:

  1. int arr[7] = { 6,2,3,9,4,5};:也许更确切地说 int arr[] = {6,2,3 ,9,4,5};

  2. MPI_Send(&arr, 2, MPI_INT, dest, tag2, MPI_COMM_WORLD); 应该是 MPI_Send(&arr[index], 3, MPI_INT, dest, tag2, MPI_COMM_WORLD ); 虽然我不太确定这是你打算做的。

  3. MPI_Recv(&arr[index], 20, MPI_INT, source, tag2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);:20 从哪里来?不应该是 3 吗?

希望这对您有意义。

关于c - C语言中使用MPI添加数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550398/

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