c语言 mpi程序,C语言使用MPI实现并行操作(MPI入门)
C语言使用MPI:#include "mpi.h"#include "stdio.h"#include "math.h"#include "unistd.h"#define n 10void printArr(int *arr){for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){printf("%d ",arr[i * n +
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)