c - C语言的分布式算法

标签 c compiler-errors mpi distributed-system distributed-algorithm

我是C的初学者。我必须使用库 MPI 创建分布式架构。下面的代码是:

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

int main(int argc, char **argv) 
{ 

int N,  w = 1, L = 2, M = 50; // with N number of threads
int T= 2;
int myid;
int buff;
float mit[N][T];                // I initialize a 2d array       
for(int i = 0; i < N; ++i){
    mit[i][0]= M / (float) N; 
    for (int j = 1; j < T; ++j){
            mit[i][j] = 0;
    } 
    }
float tab[T];    // 1d array 
MPI_Status stat; 
/*********************************************
  start 
 *********************************************/
MPI_Init(&argc,&argv);                 // Initialisation
MPI_Comm_size(MPI_COMM_WORLD, &N);   
MPI_Comm_rank(MPI_COMM_WORLD, &myid);      
for(int j = 0; j < T; j++) { 

   for(int i = 0; i < N; i++) {  // I iterate for each slave 

        if (myid !=0) {  

            float y = ((float) rand()) / (float) RAND_MAX; 
            mit[i][j + 1] =  mit[i][j]*(1 + w * L * y);
            buff=mit[i][j+1];
            MPI_Send(&buff, 128, MPI_INT, 0, 0, MPI_COMM_WORLD); // I send the variable buff to the master 
            buff=0; 

}           

   if( myid == 0 )  {  // Master

       for(int i = 1; i < N; i++){ 

           MPI_Recv(&buff, 128, MPI_INT, i, 0, MPI_COMM_WORLD, &stat); 
           tab[j] += buff; // I need to receive all the variables buff sent by the salves, sum them and stock into the tab at the index j 
              }
       printf("\n%.20f\n",tab[j]); // I print the result of the sum at index j 

} 
}
}
MPI_Finalize();
return 0; 
}
}

我在终端中使用命令:mpicc .c -o my_file来编译程序
然后mpirun -np 101 my_file_c以101个线程启动程序

但问题是我在终端中出现以下错误:

It seems that [at least] one of the processes that was started with
> mpirun did not invoke MPI_INIT before quitting (it is possible that
> more than one process did not invoke MPI_INIT -- mpirun was only
> notified of the first one, which was on node n0).
> 
> mpirun can *only* be used with MPI programs (i.e., programs that
> invoke MPI_INIT and MPI_FINALIZE).  You can use the "lamexec" program
> to run non-MPI programs over the lambooted nodes.

看来我的主人有问题,但我不知道为什么......

有什么想法吗???

谢谢:)

最佳答案

此行为很可能是内存损坏的结果。

你不能

    int buff=mit[i][j+1];
    MPI_Send(&buff, 128, MPI_INT, ...);

根据您想要实现的目标,您可以尝试一下

    int buff=mit[i][j+1];
    MPI_Send(&buff, 1, MPI_INT, ...);
    // ...
    MPI_Recv(&buff, 1, MPI_INT, ...);

    int *buff=&mit[i][j+1];
    MPI_Send(buff, 128, MPI_INT, ...);
    // fix MPI_Recv()

关于c - C语言的分布式算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47851140/

相关文章:

c++ - 一段初学者 C++ 代码的模糊编译器错误

c++ - 使用 gcc 链接库在 Ubuntu 中编译 C++ 代码

compiler-errors - 无法编译多个 Solidity 版本

loops - 关于MPI并行循环的问题

c - 匹配字符串中的子字符串,容差为 1 个字符不匹配

c - MSVS 命令行参数

c++ - 如何在MPI-2+中复制MPI_Accumulate的功能

c - 是否可以附加一个回调以在请求完成时执行?

c - 在 C 中,如何计算一个函数中的局部变量,在另一个函数中?

c - MPI 环首领选举返回段错误