我的所有MPI程序(用c编写)都会产生分段错误

时间:2017-10-15 19:08:56

标签: c mpi

我使用MPI在C中编写了一些基本程序。他们中的一些人过去常常工作,直到昨天。今天我从大多数人那里得到了分段错误。一个是无限循环,但我没有循环。这真让我生气。 这是循环的程序。

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

int main(int argc, char *argv[]) {
    int rank, nprocs, maxn, i, j, local_counter, global_counter;

    MPI_Status status;  
    MPI_Init(&argc, &argv);
    MPI_Comm comm;
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);  /* Number of processes */  
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    int N = 0; /*Number of prime numbers I've found*/

    if (rank == 0){
        printf("What is the maximum number to check?");
        scanf("%d", &maxn); 
     }

     MPI_Finalize();
     return 0;    
}

1 个答案:

答案 0 :(得分:0)

使用scanf你试图从stdin读取,这在MPI和我的系统(计算机集群)中通常是不可接受的,它会导致程序停止并“无限地”运行。

您需要做的是从文件读取值或作为命令行参数。

这是命令行参数版本:

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

int main(int argc, char *argv[]) {
    int rank, nprocs, maxn, i, j, local_counter, global_counter;

    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm comm;
    /* Number of processes */
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);  
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    /* Number of prime numbers I've found */
    int N = 0; 

   // Usage check
   if(argc!=2){
        printf("Error\n");
        printf("Syntax mpi_in <Maximum number to check>\n");
        MPI_Finalize();
        exit(1);
    }

    maxn = atoi(argv[1]);

    if (rank == 0){
        printf("Maximum number to check is: %d \n", maxn);
     }

    MPI_Finalize();
    return 0;
}

在命令行参数版本中,你也可以让所有进程解包参数,这里为演示过程0输出值。

调用MPI_Init清除参数列表,然后程序使用argcargv[],就好像它是非MPI程序一样。这显然不是一种保证行为,但它适用于我正在使用的两个不同的系统。在这种情况下,argc将为2,因为第一个参数始终是程序的名称。您可以从终端运行它,例如使用5个进程

mpirun -np 5 mpi_in 300

请注意,由于argv是指向字符串的指针数组,因此程序需要atoi将数字从字符串转换为int。