高性能计算作业代码样例
时间: 2023-08-06 10:12:52 浏览: 92
这里给出一个简单的高性能计算作业代码样例,使用C语言和MPI库实现矩阵乘法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define MATRIX_SIZE 1000
int main(int argc, char** argv) {
int my_rank, comm_size, i, j, k;
double start_time, end_time;
double *matrix_a, *matrix_b, *matrix_c; // 存储矩阵A、B、C的指针
double local_sum, global_sum;
// 初始化MPI
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
// 所有进程分配内存
matrix_a = (double*)malloc(sizeof(double) * MATRIX_SIZE * MATRIX_SIZE);
matrix_b = (double*)malloc(sizeof(double) * MATRIX_SIZE * MATRIX_SIZE);
matrix_c = (double*)malloc(sizeof(double) * MATRIX_SIZE * MATRIX_SIZE);
// 进程0初始化矩阵A和B
if (my_rank == 0) {
for (i = 0; i < MATRIX_SIZE; i++) {
for (j = 0; j < MATRIX_SIZE; j++) {
matrix_a[i * MATRIX_SIZE + j] = i + j;
matrix_b[i * MATRIX_SIZE + j] = i * j;
}
}
}
// 全局开始计时
MPI_Barrier(MPI_COMM_WORLD);
start_time = MPI_Wtime();
// 每个进程计算自己负责的部分
for (i = my_rank; i < MATRIX_SIZE; i += comm_size) {
for (j = 0; j < MATRIX_SIZE; j++) {
local_sum = 0.0;
for (k = 0; k < MATRIX_SIZE; k++) {
local_sum += matrix_a[i * MATRIX_SIZE + k] * matrix_b[k * MATRIX_SIZE + j];
}
matrix_c[i * MATRIX_SIZE + j] = local_sum;
}
}
// 将每个进程的结果合并到进程0
for (i = 0; i < MATRIX_SIZE; i++) {
MPI_Reduce(&matrix_c[i * MATRIX_SIZE], &global_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (my_rank == 0) {
matrix_c[i * MATRIX_SIZE] = global_sum;
}
}
// 全局结束计时
MPI_Barrier(MPI_COMM_WORLD);
end_time = MPI_Wtime();
// 进程0输出结果和时间
if (my_rank == 0) {
printf("Matrix multiplication finished in %f seconds.\n", end_time - start_time);
printf("The result matrix is:\n");
for (i = 0; i < MATRIX_SIZE; i++) {
for (j = 0; j < MATRIX_SIZE; j++) {
printf("%f ", matrix_c[i * MATRIX_SIZE + j]);
}
printf("\n");
}
}
// 释放内存并结束MPI
free(matrix_a);
free(matrix_b);
free(matrix_c);
MPI_Finalize();
return 0;
}
```
这个样例实现了一个简单的矩阵乘法,并使用MPI库完成了并行化计算。其中,每个进程计算自己负责的部分,并将结果合并到进程0中,最后由进程0输出结果和计算时间。
阅读全文