国科大-高性能计算编程-作业六
作业题目
提交内容一:编译运行代码、执行算例、统计运行时间并绘制加速比曲线
GhostExchange3D_ArrayAssign
创建并进入
build
文件夹,执行cmake ..
及make
来编译可执行文件运行算例一
mpirun -np 1 ./GhostExchange -x 1 -y 1 -z 1
运行算例二
mpirun -np 4 ./GhostExchange -x 1 -y 2 -z 2
运行算例三
mpirun -np 8 ./GhostExchange -x 2 -y 2 -z 2
数据统计
thread_num | stencil | boundary condition | ghost cell | total |
---|---|---|---|---|
1 | 5.431515 | 0.790956 | 0.047246 | 6.325972 |
4 | 0.890351 | 0.142488 | 0.553822 | 1.605789 |
8 | 0.533962 | 0.075818 | 0.599633 | 1.219806 |
CartExchange3D_Neighbor
创建并进入
build
文件夹,执行cmake ..
及make
来编译可执行文件运行算例一
mpirun -np 1 ./CartExchange -x 1 -y 1 -z 1
运行算例二
mpirun -np 4 ./CartExchange -x 1 -y 2 -z 2
运行算例三
mpirun -np 8 ./CartExchange -x 2 -y 2 -z 2
数据统计
thread_num | stencil | boundary condition | ghost cell | total |
---|---|---|---|---|
1 | 5.490287 | 0.790111 | 0.000984 | 6.337239 |
4 | 0.882329 | 0.148143 | 0.502601 | 1.548727 |
8 | 0.405536 | 0.047157 | 0.486865 | 0.947385 |
加速比曲线绘制
- 曲线绘制代码
import matplotlib.pyplot as plt
# 时间数据(秒)
times = {
1: 6.325972,
4: 1.605789,
8: 1.219806
}
# 计算加速比
speedup = {n: times[1] / t for n, t in times.items()}
# 绘制加速比曲线
plt.figure(figsize=(10, 6))
plt.plot(list(speedup.keys()), list(speedup.values()), marker='o', linestyle='-', color='b')
# 添加图表标题和标签
plt.title('Speedup Curve')
plt.xlabel('Number of Processes')
plt.ylabel('Speedup')
plt.grid(True)
# 显示图表
plt.show()
- GhostExchange3D_ArrayAssign
- CartExchange3D_Neighbor
提交内容二:说明代码中MPI函数的功能
MPI_Init
它初始化MPI库,并建立MPI环境,必须在调用任何其他MPI函数之前调用
MPI_Init
MPI_Comm_rank
获取当前进程的秩(rank),用于区分不同的进程。
MPI_COMM_WORLD
是默认的通信器,表示所有进程都参与的通信域MPI_Comm_size
获取总的进程数。
nprocs
存储了当前通信域中总的进程数量MPI_Irecv
非阻塞地接收消息
MPI_Isend
非阻塞地发送消息
MPI_Waitall
等待一组非阻塞通信操作完成
MPI_Allreduce
在所有进程中执行全局归约操作,并将结果分发给所有进程
MPI_Barrier
同步所有进程,确保所有进程都到达此点后才能继续执行。
MPI_Barrier
是一个阻塞操作,所有进程必须都调用这个函数,才能继续执行后续代码MPI_Finalize
结束MPI环境,释放相关资源。调用
MPI_Finalize
后,不能再使用任何MPI函数MPI_Cart_create
创建一个笛卡尔拓扑结构的通信域。
dims
数组定义每个维度上的进程数,periods
数组定义每个维度上的周期性,cart_comm
是创建的通信域MPI_Cart_coords
获取指定进程在笛卡尔拓扑结构中的坐标。
coords
数组存储进程的坐标MPI_Cart_shift
计算相邻进程的秩。第一个参数是通信域,第二个参数是移动的维度,第三个参数是移动的步数,后两个参数分别存储相邻进程的秩
自评分
自评分
- 5分(3+2)
理由
- 完成两个提交内容,使用python绘制加速比曲线