2026-01-21 18:02:30 +08:00
..
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00
2026-01-21 18:02:30 +08:00

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

包含数据:

  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 对性能的影响

运行方式:

./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

实验报告要求

必须包含的内容

  1. 思考题答案: 详细回答三个思考问题
  2. 性能数据: 完整的测试数据表格
  3. 图表分析: 至少包含以下图表
    • 向量加法: 数据规模 vs 时间
    • 矩阵乘法: CPU vs GPU 性能对比
    • 矩阵乘法: 加速比分析
    • BLOCK_SIZE: 性能影响分析
  4. 结论分析:
    • 不同优化策略的效果
    • 最优配置选择
    • 性能瓶颈分析

可选的加分项

  • 使用 Python (matplotlib) 生成更专业的图表
  • GPU 性能分析工具 (nvprof, Nsight) 的分析结果
  • 更深入的优化建议和实现