【C语言】C语言使用MPI实现并行操作(MPI入门)

【C语言】C语言使用MPI实现并行操作(MPI入门)

C语言使用MPI:

#include "mpi.h"
#include "stdio.h"
#include "math.h"
#include "unistd.h"
 
#define n 10
 
void printArr(int *arr){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			printf("%d ",arr[i * n + j]);
		}
		printf("\n");
	}
 
}
 
 
int main(int argv, char *argc[])
{
	int rank, p, a;
	MPI_Init(&argv, &argc);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &p);
	MPI_Status status;
 
//	printf("程序开始运行: 开启的线程数量为:%d, 我是线程%d\n", p, rank);
	
	if(p != 1){ // 线程的数量多于1条
		a = n / (p - 1);
	}
//	printf("a = %d\n", a);
 
	if(rank == 0){ // 0号线程处理
		int A[n * n];
		int B[n * n];
		int C[n * n];
			
		for(int i = 0; i < n; i++){
			for(int j = 0; j < n; j++){
				A[i * n + j] = i + j;
				B[i * n + j] = 1;
			}
		}
 
		double tb, te;
		if(p == 1){ // 只有一条线程的情况
			tb = MPI_Wtime();
			for(int i = 0; i < n; i++){
				for(int j = 0; j < n; j++){
					C[i * n + j] = 0;
					for(int k = 0; k < n; k++){
						C[i * n + j] = A[i * n + k] * B[k * n + j];
					}
				}
			}						
		}else{ // 线程大于1的情况
			tb = MPI_Wtime();
			for(int i = 0; i < p - 1; i++){
 
			//	printf("A B 数组的情况:\n");
			//	printArr(A);
			//	printf("\n");
			//	printArr(B);
			
			//	printf("线程%d 发送数据给线程%d\n", rank, i + 1);
				MPI_Send(A, n * n, MPI_INT, i + 1, 1, MPI_COMM_WORLD);
			//	printf("线程%d 等待接收线程%d的数据\n", rank, i + 1);
				MPI_Send(B, n * n, MPI_INT, i + 1, 2, MPI_COMM_WORLD);
		
			//	MPI_Recv(&C[i * a], a * n, MPI_INT, i + 1, 3, MPI_COMM_WORLD, &status);
		}
 
			for(int i = 0; i < p - 1; i++){
		//		printf("接收线程%d 传递的数据:i * a * n = %d \n", i + 1, i * a * n);
				MPI_Recv(&C[i * a * n], a * n, MPI_INT, i + 1, 3, MPI_COMM_WORLD, &status);
		//		printf("所接收到的数据为,线程%d传递过来的:\n", i + 1);
		//		printArr(C);
		//		printf("\n\n\n");
			}
		}
			te = MPI_Wtime();
			printf("运算的结果是:\n");
			printArr(C);
			printf("time is %f\n", te - tb);	
	}
 
	if(p != 1){ // 线程数大于1,且非0号线程处理的代码
		if(rank != 0){
			int A[n * n];
			int B[n * n];
			int C[n * n];
 
			MPI_Recv(A, n * n, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
			MPI_Recv(B, n * n, MPI_INT, 0, 2, MPI_COMM_WORLD, &status);
		
		//	sleep(rank); // 几号线程就休息几秒		
 
			for(int i = a * (rank - 1); i < a * rank; i++){
				for(int j = 0; j < n; j++){
					C[i * n + j] = 0;
					for(int k = 0; k < n; k++){
						C[i * n + j] = A[i * n + k] * B[k * n + j];
					}
				}
			}
		//	printf("线程%d 处理后的数组为:\n", rank);
		//	printArr(C);
		//	printf("a * (rank - 1) * n  = %d,  a * n = %d \n", a * (rank - 1) * n, a * n);
			// 向rank = 0 发送自己的 a行c,大小是a * n
			MPI_Send(&C[a * (rank - 1) * n], a * n, MPI_INT, 0, 3, MPI_COMM_WORLD);
		}
		
	
	}
 
	MPI_Finalize();
 
	return 0;
 
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言并行程序MPI(Message Passing Interface),是一种用于并行计算的编程模型。MPI允许在多个计算机之间进行进程间通信,以实现并行计算任务的协同工作。 MPI程序主要由多个进程组成,每个进程在不同的计算机上运行,并可以在运行时相互通信。通信是通过消息传递的方式来实现的,每个进程可以发送和接收消息。 在MPI程序中,通常会有一个主进程(通常被称为rank 0),负责协调整个计算任务的执行和结果的收集。其他进程(rank 1, rank 2等)则负责执行具体的任务。主进程可以把任务分成若干子任务,然后将这些子任务分发给其他进程并协调它们的执行。子进程在执行完任务后,可以将结果返回给主进程或者将结果发送给其他进程。 MPI程序可以在单个机器上运行,也可以在多台机器组成的集群上运行。在集群上运行MPI程序时,需要在每台机器上安装MPI库,并通过网络连接进行进程间通信。 MPI程序可以应用于各种并行计算任务,如科学计算、图像处理、数据挖掘等。通过将任务分解成小的子任务,并在多个计算机上同时执行,可以大大加快计算速度,提高程序的执行效率。 总之,C语言并行程序MPI提供了一个强大的工具,可以将计算任务分布到多个计算机上并实现进程间通信。通过合理的任务划分和结果的收集,可以实现高效的并行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值