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;

}

0dc82a6639939981badd02472eed1485.png

Logo

汇聚原天河团队并行计算工程师、中科院计算所专家以及头部AI名企HPC专家,助力解决“卡脖子”问题

更多推荐