gpt4 book ai didi

c - 我所有的 MPI 程序(用 c 语言编写)都会出现段错误

转载 作者:行者123 更新时间:2023-11-30 16:40:13 25 4
gpt4 key购买 nike

我已经使用 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;
}

最佳答案

使用 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会清理参数列表,因此程序之后会像非MPI程序一样使用argcargv[] 。这显然不是一个有保证的行为,但它适用于我正在使用的两个不同的系统。在这种情况下,argc 将为 2,因为第一个参数始终是程序的名称。您可以从终端运行它,例如使用 5 个进程,

mpirun -np 5 mpi_in 300

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

关于c - 我所有的 MPI 程序(用 c 语言编写)都会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758925/

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