5.2 KiB
5.2 KiB
Lab4 CUDA 程序实验说明
实验内容
实验 4.2: CUDA程序的编译和运行
文件: vectoradd.cu
实验目的:
- 实现向量加法的CUDA程序
- 测试不同数据规模对程序执行效率的影响
运行方式:
./lab4.sh
数据输出: experiment_data/vectoradd_results.txt
需要回答的问题:
- 改变数组大小,测试程序执行效率和数据规模之间的关系
- 绘制数据规模 vs 执行时间的图表
- 分析性能随数据规模变化的趋势
实验 4.3: 基于CUDA优化矩阵乘法
思考问题
思考一: matMultCUDAKernel1 对于矩阵的数据划分策略是什么?
- 提示: 查看
MatrixMul_kernel1.cu中的核函数实现 - 关键点:
- 每个线程负责计算结果矩阵中的哪个元素?
- blockIdx 和 threadIdx 如何映射到矩阵的行列?
思考二: matMultCUDAKernel2 对于矩阵运算的优化策略是什么,线程同步是否是必要的,为什么?
- 提示: 查看
MatrixMul_kernel2.cu中的共享内存使用 - 关键点:
- 共享内存的作用是什么?
__syncthreads()的作用是什么?- 为什么需要两次
__syncthreads()?
思考三: matMultCUDAKernel2 还有没有可以继续优化的空间?
- 提示: 考虑以下优化方向
- 寄存器使用
- 内存合并访问
- 循环展开
- Warp 级别的优化
实验一: CPU vs GPU 性能对比
运行方式:
./lab4.sh
数据输出: experiment_data/matrixmul_comparison.txt
包含数据:
- CPU (OpenMP): 不同线程数 (1, 8, 64, 256) 的性能
- CUDA Kernel1: 基础 CUDA 实现的性能
- CUDA Kernel2: 共享内存优化的性能
需要绘制:
- 不同矩阵规模下,CPU vs GPU 的运行时间对比
- 加速比图表 (相对于单线程 CPU)
- FLOPS 对比图表
- 不同 OpenMP 线程数的性能对比
矩阵规模: 512, 1024, 2048, 4096
实验二: BLOCK_SIZE 对性能的影响
运行方式:
./lab4.sh
数据输出: experiment_data/blocksize_analysis.txt
包含数据:
- 不同 BLOCK_SIZE (4, 8, 16, 32) 的性能对比
- 不同矩阵规模下的测试结果
需要绘制:
- BLOCK_SIZE vs 运行时间
- BLOCK_SIZE vs GFLOPS
- 分析最优 BLOCK_SIZE 的原因
实验数据分析建议
方法一: 使用 Python 脚本自动生成图表 (推荐)
运行方式:
# 确保已安装 matplotlib
pip install matplotlib numpy
# 运行绘图脚本
./plot_results.py
生成的图表:
experiment_data/figures/vectoradd_performance.png: 向量加法性能图experiment_data/figures/cpu_vs_gpu_comparison.png: CPU vs GPU 性能对比experiment_data/figures/blocksize_analysis.png: BLOCK_SIZE 性能分析
方法二: 手动分析数据
1. 数据提取
所有实验数据都保存在 experiment_data/ 目录下,格式为表格形式,可以直接复制到 Excel 或其他数据分析工具。
2. 图表绘制建议
实验 4.2:
- 折线图: 数据规模 (N) vs 执行时间
- 分析时间复杂度
实验 4.3 实验一:
- 柱状图: 不同实现的运行时间对比
- 折线图: 矩阵规模 vs 加速比
- 热力图: 线程数 × 矩阵规模 的性能分布
实验 4.3 实验二:
- 折线图: BLOCK_SIZE vs GFLOPS (不同矩阵规模)
- 分析最优 BLOCK_SIZE 的原因
3. 性能分析要点
加速比计算:
加速比 = CPU单线程时间 / 并行程序时间
FLOPS 计算:
矩阵乘法浮点运算数 = 2 × M × N × K
GFLOPS = 浮点运算数 / (时间 × 10^9)
效率分析:
- 内存带宽利用率
- 计算强度
- GPU 占用率 (Occupancy)
文件说明
源代码文件
vectoradd.cu: 向量加法程序MatrixMul_cpu.cu: CPU OpenMP 矩阵乘法MatrixMul_kernel1.cu: CUDA 基础版本矩阵乘法MatrixMul_kernel2.cu: CUDA 共享内存优化版本matrixmultiply_block_size_change.cu: 不同 BLOCK_SIZE 性能测试
配置文件
xmake.lua: xmake 构建配置lab4.sh: 实验数据收集脚本
输出目录
experiment_data/: 实验数据输出目录gpu_info.txt: GPU 信息vectoradd_results.txt: 向量加法测试结果matrixmul_comparison.txt: CPU vs GPU 对比数据blocksize_analysis.txt: BLOCK_SIZE 分析数据
编译和运行
编译所有程序
cd lab4
xmake
运行实验并收集数据
./lab4.sh
单独运行某个程序
cd build/linux/x86_64/release
./vectoradd
./MatrixMul_cpu
./MatrixMul_kernel1
./MatrixMul_kernel2
./matrixmultiply_block_size_change
实验报告要求
必须包含的内容
- 思考题答案: 详细回答三个思考问题
- 性能数据: 完整的测试数据表格
- 图表分析: 至少包含以下图表
- 向量加法: 数据规模 vs 时间
- 矩阵乘法: CPU vs GPU 性能对比
- 矩阵乘法: 加速比分析
- BLOCK_SIZE: 性能影响分析
- 结论分析:
- 不同优化策略的效果
- 最优配置选择
- 性能瓶颈分析
可选的加分项
- 使用 Python (matplotlib) 生成更专业的图表
- GPU 性能分析工具 (nvprof, Nsight) 的分析结果
- 更深入的优化建议和实现