找不到 mpi 函数声明和定义的正确位置
could not find right place for mpi function declaration and definition
我喜欢用广播的方式实现一个MPI程序。我从教科书上找到了一些广播方法的代码块,并尝试修改我的 this code.
#include <stdio.h>
#include <math.h>
#include<mpi.h>
double sum(int n);
int main(void){
double local_sum, total_sum;
int source;
int local_n;
MPI_Init(NULL,NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
void Get_input(int my_rank, int comm_sz, int *n){
if(my_rank==0){
printf("Enter the value for n:");
scanf("%d",n);
}
MPI_Bcast(n,1,MPI_INT,0,MPI_COMM_WORLD);
}
local_n= n/comm_sz;
local_sum=sum(local_n);
if ( my_rank != 0) {
MPI_Send (&local_sum , 1, MPI_DOUBLE , 0, 0, MPI_COMM_WORLD ) ;
}
else{
total_sum = local_sum;
for(source=1;source<comm_sz;source++){
MPI_Recv (&local_sum , 1, MPI_DOUBLE , source , 0, MPI_COMM_WORLD , MPI_STATUS_IGNORE ) ;
total_sum+=local_sum;
}
}
if(my_rank==0){
printf("Sum is=%lf",total_sum);
printf("\n");
}
MPI_Finalize();
return 0;
}
double sum(int n){
int i;
double cal_sum=0;
for (i =0;i <= n;i++) {
cal_sum = cal_sum + 4*(pow (-1, i))/((2*i)+1);
}
return cal_sum;
}
现在我得到这样的错误:
mpi_sumB.c: In function ‘main’:
mpi_sumB.c:13:34: error: ‘my_rank’ undeclared (first use in this function)
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
^
mpi_sumB.c:13:34: note: each undeclared identifier is reported only once for each function it appears in
mpi_sumB.c:14:35: error: ‘comm_sz’ undeclared (first use in this function)
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
^
mpi_sumB.c:25:12: error: ‘n’ undeclared (first use in this function)
local_n= n/comm_sz;
现在很明显我得到了这个错误,因为我知道我在哪里写下 void Get_input(int my_rank, int comm_sz, int *n)
可能这不是这个函数的正确位置。但是我没有得到任何明确的指导,我需要在哪里定义这个函数。
感谢您的帮助
编辑:我不是在寻找 C 编程语法或嵌套函数。这是一个用 c 实现的 mpi 程序,更具体地说是广播问题。我想知道一般在mpi程序中我们需要在哪里定义广播。
I would like to know generally in mpi program where we need to define
broadcasting.
应用程序的上下文很重要。如果您需要广播,比如配置信息(例如,在您的情况下,输入大小),您需要在您的领先排名(例如 rank 0
)具有相应信息后进行广播。因此,您可以在之后立即调用 MPI_Bcast
。
如果你问的是定义函数的地方,即在 main 之前还是在 main 之后。没关系。文件中函数的顺序是任意的。将函数一放在文件的顶部,将函数二放在底部,反之亦然。警告:为了让一个函数“看到”(使用)另一个函数,函数的“原型”必须在使用前在文件中看到。 See this.
我喜欢用广播的方式实现一个MPI程序。我从教科书上找到了一些广播方法的代码块,并尝试修改我的 this code.
#include <stdio.h>
#include <math.h>
#include<mpi.h>
double sum(int n);
int main(void){
double local_sum, total_sum;
int source;
int local_n;
MPI_Init(NULL,NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
void Get_input(int my_rank, int comm_sz, int *n){
if(my_rank==0){
printf("Enter the value for n:");
scanf("%d",n);
}
MPI_Bcast(n,1,MPI_INT,0,MPI_COMM_WORLD);
}
local_n= n/comm_sz;
local_sum=sum(local_n);
if ( my_rank != 0) {
MPI_Send (&local_sum , 1, MPI_DOUBLE , 0, 0, MPI_COMM_WORLD ) ;
}
else{
total_sum = local_sum;
for(source=1;source<comm_sz;source++){
MPI_Recv (&local_sum , 1, MPI_DOUBLE , source , 0, MPI_COMM_WORLD , MPI_STATUS_IGNORE ) ;
total_sum+=local_sum;
}
}
if(my_rank==0){
printf("Sum is=%lf",total_sum);
printf("\n");
}
MPI_Finalize();
return 0;
}
double sum(int n){
int i;
double cal_sum=0;
for (i =0;i <= n;i++) {
cal_sum = cal_sum + 4*(pow (-1, i))/((2*i)+1);
}
return cal_sum;
}
现在我得到这样的错误:
mpi_sumB.c: In function ‘main’:
mpi_sumB.c:13:34: error: ‘my_rank’ undeclared (first use in this function)
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
^
mpi_sumB.c:13:34: note: each undeclared identifier is reported only once for each function it appears in
mpi_sumB.c:14:35: error: ‘comm_sz’ undeclared (first use in this function)
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
^
mpi_sumB.c:25:12: error: ‘n’ undeclared (first use in this function)
local_n= n/comm_sz;
现在很明显我得到了这个错误,因为我知道我在哪里写下 void Get_input(int my_rank, int comm_sz, int *n)
可能这不是这个函数的正确位置。但是我没有得到任何明确的指导,我需要在哪里定义这个函数。
感谢您的帮助
编辑:我不是在寻找 C 编程语法或嵌套函数。这是一个用 c 实现的 mpi 程序,更具体地说是广播问题。我想知道一般在mpi程序中我们需要在哪里定义广播。
I would like to know generally in mpi program where we need to define broadcasting.
应用程序的上下文很重要。如果您需要广播,比如配置信息(例如,在您的情况下,输入大小),您需要在您的领先排名(例如 rank 0
)具有相应信息后进行广播。因此,您可以在之后立即调用 MPI_Bcast
。
如果你问的是定义函数的地方,即在 main 之前还是在 main 之后。没关系。文件中函数的顺序是任意的。将函数一放在文件的顶部,将函数二放在底部,反之亦然。警告:为了让一个函数“看到”(使用)另一个函数,函数的“原型”必须在使用前在文件中看到。 See this.