第一个MPI程序
C语言中
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<mpi.h>
//const int MAX_STRLEN = 100;
int main(int argc, char *argv[]) {
int my_rank; /* rank of process */
int p; /* number of processes */
int source; /* rank of sender */
int tag = 0; /* tag for message */
//char message[MAX_STRLEN ]; /* storage for message */
char message[100]; /* storage for message */
MPI_Status status;/* receive */
/* Start up MPI */
MPI_Init(&argc, &argv);
/* Find out process rank */
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
/* Find out number of process */
MPI_Comm_size(MPI_COMM_WORLD, &p);
if (my_rank != 0) {
/* create message */
sprintf(message, "Greetings from process %d", my_rank);
/* Use strlen+1 so that '\0' gets translatted */
MPI_Send(message, strlen(message) + 1, MPI_CHAR, 0, tag, MPI_COMM_WORLD);
}
else {
/* my_rank == 0 */
printf("Greetings from process %d\n", my_rank);
for (source = 1; source < p; source++) {
MPI_Recv(message, 100, MPI_CHAR, source, tag, MPI_COMM_WORLD, &status);
printf("%s\n", message);
}
}
/* Shut down MPI */
MPI_Finalize();
return 0;
}/* main */
运行结果
#define _CRT_SECURE_NO_WARNINGS的作用
- 我们在编写c语言程序时有时会用到sprintf,strcpy,scanf,gets等函数,会产生警告和错误,这是由于这些c函数太旧而导致的不安全,系统会提示让在函数后面添加"_s"来解决错误。
- 此时我们有两种解决方案:
a.在指定的源文件的开头定义:#define _CRT_SECURE_NO_WARNINGS (只限于该文件起作用)
b.在项目属性里设置,这会在整个项目里生效,依次选择:属性->配置属性->C/C++ ->预处理器->预处理器定义->编辑
最下面加上一行:_CRT_SECURE_NO_WARNINGS (注意不需要#define)
使用const要注意的地方
const的使用有局部变量和全局变量两种,而且在c和c++中用法有区别。
//global variable
const int a = 3;
int arr[a];
现在讨论全局变量情况,c中的const并不是真正的定义常量,如果是c,上边的程序会出错,而在c++中就不会,原因在于gcc认为a只是一个普通的全局变量,而变量是不能用来指定数组的长度的。当然,这是针对全局数组而言,如果是局部的数组的话,就算是int a = 3; int arr[a];这种都是可以的,因为c里面还有一种叫变长数组的东西。
具体的关于const的用法:https://www.cnblogs.com/ylan2009/p/4151744.html
MPI环境的配置
每个项目需要配置一次MPI,配置过程:https://blog.csdn.net/qq_36974075/article/details/81144807
注意,vs中一个项目可以有多个.c文件,但必须保证只能有一个main函数,否则会报错。