我使用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;
}
答案 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
清除参数列表,然后程序使用argc
和argv[]
,就好像它是非MPI程序一样。这显然不是一种保证行为,但它适用于我正在使用的两个不同的系统。在这种情况下,argc
将为2,因为第一个参数始终是程序的名称。您可以从终端运行它,例如使用5个进程
mpirun -np 5 mpi_in 300
请注意,由于argv
是指向字符串的指针数组,因此程序需要atoi
将数字从字符串转换为int。