【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;
 
}

【C语言】C语言使用MPI实现并行操作(MPI入门)_第1张图片

你可能感兴趣的:(C语言,#,C多线程与并发,mpi,c语言,omp)