# Lab4 CUDA 程序实验说明 ## 实验内容 ### 实验 4.2: CUDA程序的编译和运行 **文件**: `vectoradd.cu` **实验目的**: - 实现向量加法的CUDA程序 - 测试不同数据规模对程序执行效率的影响 **运行方式**: ```bash ./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 性能对比 **运行方式**: ```bash ./lab4.sh ``` **数据输出**: `experiment_data/matrixmul_comparison.txt` **包含数据**: 1. **CPU (OpenMP)**: 不同线程数 (1, 8, 64, 256) 的性能 2. **CUDA Kernel1**: 基础 CUDA 实现的性能 3. **CUDA Kernel2**: 共享内存优化的性能 **需要绘制**: - 不同矩阵规模下,CPU vs GPU 的运行时间对比 - 加速比图表 (相对于单线程 CPU) - FLOPS 对比图表 - 不同 OpenMP 线程数的性能对比 **矩阵规模**: 512, 1024, 2048, 4096 #### 实验二: BLOCK_SIZE 对性能的影响 **运行方式**: ```bash ./lab4.sh ``` **数据输出**: `experiment_data/blocksize_analysis.txt` **包含数据**: - 不同 BLOCK_SIZE (4, 8, 16, 32) 的性能对比 - 不同矩阵规模下的测试结果 **需要绘制**: - BLOCK_SIZE vs 运行时间 - BLOCK_SIZE vs GFLOPS - 分析最优 BLOCK_SIZE 的原因 --- ## 实验数据分析建议 ### 方法一: 使用 Python 脚本自动生成图表 (推荐) **运行方式**: ```bash # 确保已安装 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 分析数据 --- ## 编译和运行 ### 编译所有程序 ```bash cd lab4 xmake ``` ### 运行实验并收集数据 ```bash ./lab4.sh ``` ### 单独运行某个程序 ```bash cd build/linux/x86_64/release ./vectoradd ./MatrixMul_cpu ./MatrixMul_kernel1 ./MatrixMul_kernel2 ./matrixmultiply_block_size_change ``` --- ## 实验报告要求 ### 必须包含的内容 1. **思考题答案**: 详细回答三个思考问题 2. **性能数据**: 完整的测试数据表格 3. **图表分析**: 至少包含以下图表 - 向量加法: 数据规模 vs 时间 - 矩阵乘法: CPU vs GPU 性能对比 - 矩阵乘法: 加速比分析 - BLOCK_SIZE: 性能影响分析 4. **结论分析**: - 不同优化策略的效果 - 最优配置选择 - 性能瓶颈分析 ### 可选的加分项 - 使用 Python (matplotlib) 生成更专业的图表 - GPU 性能分析工具 (nvprof, Nsight) 的分析结果 - 更深入的优化建议和实现