lastTest
1.二维数组乘积
#include "mpi.h"
#include "omp.h"
#include <malloc.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int rank, numprocess, dimension;
double startTime, endTime;
float *Matrix1;
float *Matrix2;
float *sendBuf, *revBuf;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &numprocess);
MPI_Barrier(MPI_COMM_WORLD);
startTime = MPI_Wtime();
if (rank == 0)
{
printf("请输入矩阵的维度·:\n");
scanf("%d", &dimension);
Matrix1 = (float *)malloc(dimension * dimension * sizeof(float));
Matrix2 = (float *)malloc(dimension * dimension * sizeof(float));
for (int i = 0; i < dimension; i++)
{
// srand(rank*i+1);
for (int j = 0; j < dimension; j++)
{
Matrix1[i * dimension + j] = 100.0 * rand() / RAND_MAX;
Matrix2[i * dimension + j] = 100.0 * rand() / RAND_MAX;
}
}
revBuf = (float *)malloc(dimension * dimension * sizeof(float));
}
/*
广播二维数组
*/
MPI_Bcast(&dimension, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&Matrix1, dimension * dimension, MPI_FLOAT, 0, MPI_COMM_WORLD);
MPI_Bcast(&Matrix2, dimension * dimension, MPI_FLOAT, 0, MPI_COMM_WORLD);
sendBuf = (float *)malloc(dimension * sizeof(float));
for (int i = rank; i < dimension; i += numprocess)
{
for (int j = 0; j < dimension; j++)
{
for (int k = 0; k < dimension; k++)
{
sendBuf[j] = Matrix1[i * dimension + k] * Matrix2[k * dimension + j];
}
}
MPI_Gather(sendBuf, dimension, MPI_FLOAT, revBuf, dimension, MPI_FLOAT, 0, MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
endTime = MPI_Wtime();
if (rank == 0)
{
for (int i = 0; i < dimension; i++)
{
// srand(rank*i+1);
for (int j = 0; j < dimension; j++)
{
printf("%f\t",revBuf[i*dimension+j]);
}
printf("\n");
}
printf("time= %g(s)\n", endTime - startTime);
}
free(Matrix1);
free(Matrix2);
MPI_Finalize();
return 0;
}2.计算数列加和值
2.1MPI模式
2.2MPi+OpenMp模式
2.3并行效率和加速比
3.所有计算的PI
3.1OMP多线程计算PI
3.2MPI多进程模式
3.3MPI和OpenMPI混合模式
Last updated