gpt4 book ai didi

两个处理器之间的通信(并行编程)

转载 作者:行者123 更新时间:2023-11-30 17:09:22 24 4
gpt4 key购买 nike

我想编写一个代码:P0 处理器从键盘获取一个数组,并将该数组发送到 P1 处理器。P1 处理器将所有值打印到屏幕上。例如:

[P0]: Enter the size of array: 1
[P0]: Enter the elements of array: 3
[P1]: The array is: 3
[P0]: Enter the size of array: 3
[P0]: Enter the elements of array: 5 7 5
[P1]: The array is: 5 7 5
.
.
.

这是我的第一个作品。我觉得缺点太多了。但我是新人。想学习如何编码。

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

#define n 100

int main(int argc, char *argv[]){
int my_rank, size_cm;
int value, i;
int dizi[n];
double senddata[n];
double recvdata[n];

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &size_cm);

value=0;

if(my_rank == 0){
printf("[%d]: Enter the size of array: ",&my_rank);
scanf("%d",value);
printf("[%d]: Enter the elements of array",&my_rank);
for(i=0; i<n; i++){
scanf("%d", &dizi[n]);
senddata[0] = dizi[];
MPI_Send(senddata, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
}
if(my_rank == 1){
MPI_Recv(recvdata, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,
printf("[%d]: The array is: %d ",&my_rank, dizi[n]);
}
MPI_Finalize();
return 0;
}

最佳答案

为了获得可编译的最小示例,我将缺少的参数添加到 MPI_Recv() :

MPI_Status status;
MPI_Recv(recvdata, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,&status);

我还修改了senddata[0] = dizi[];senddata[0] = dizi[i];

  • 当我尝试编译您提供的代码时,我收到警告:

format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *

函数scanf()需要指向数据的指针来修改它,所以 int a;scanf("%d",&a);是正确的。但是printf()只需要数据,因为它不会修改它:int a;printf("%d",a);这是正确的方法。

  • 如果您希望填充数组,请使用 scanf("%d", &dizi[i]); ,不是scanf("%d", &dizi[n]);n是数组 dizi 的长度。因此,索引n超出了数组,因为数组的索引从 0 开始。这可能会触发未定义的行为(奇怪的值、段错误甚至正确的结果!)。
  • MPI_Send()被称为 for(i=0; i<n; i++) ,进程 0 尝试发送 n向进程 1 发送消息。但是进程 1 只收到一条消息。因此,进程0将被锁定在i=1处,等待进程1接收第二条消息。这是一个僵局。

我假设您正在尝试将数组从进程 0 发送到进程 1。以下基于您的代码应该可以解决问题。数组的实际长度为 n_arr :

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

#define n 100

int main(int argc, char *argv[]){
int my_rank, size_cm;
int n_arr;
int i;
int dizi[n];
// double senddata[n];
// double recvdata[n];

MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &size_cm);

if(my_rank == 0){
// fflush(stdout); because the standard output is buffered...
printf("[%d]: Enter the size of array: ",my_rank);fflush(stdout);
if(scanf("%d",&n_arr)!=1){fprintf(stderr,"input error\n");exit(1);}
if(n_arr>100){
fprintf(stderr,"The size of the array is too large\n");exit(1);
}
printf("[%d]: Enter the elements of array",my_rank);fflush(stdout);
for(i=0; i<n_arr; i++){
if(scanf("%d", &dizi[i])!=1){fprintf(stderr,"input error\n");exit(1);}

}
//sending the length of the array
MPI_Send(&n_arr, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
//senfing the array
MPI_Send(dizi, n_arr, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
if(my_rank == 1){
// receiving the length of the array
MPI_Recv(&n_arr, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,&status);
//receiving the array
MPI_Recv(dizi, n_arr, MPI_INT, 0, 0, MPI_COMM_WORLD,&status);
printf("[%d]: The array of size %d is: ",my_rank,n_arr);
for(i=0; i<n_arr; i++){
printf("%d ",dizi[i]);
}
printf("\n");
}
MPI_Finalize();
return 0;
}

它是通过运行 mpicc main.c -o main 编译的并通过 mpirun -np 2 main 运行

我添加了一些东西来检查输入是否正确(总是一件好事)并处理 n_arr 的情况大于n=100。最后一个可以通过使用 malloc() 来避免为数组分配内存:这部分留给你!

关于两个处理器之间的通信(并行编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324212/

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