CUDA【4】获得 GPU 加速的关键

文章目录

      • 时间计算
      • 注意事项
        • nvprof
        • 影响 GPU 加速的关键因素
        • CUDA 的数学函数库

  • 本章介绍了一个计算用时的流程,然后讨论了算子加速的一个核心思想——减少拷贝时间占比

时间计算

  • 基本流程就是记录然后同步相减
cudaEvent_t start, stop;
CHECK(cudaEventCreate(&start)); // 创建cuda 事件对象。
CHECK(cudaEventCreate(&stop));
CHECK(cudaEventRecord(start));  // 记录代表开始的事件。
cudaEventQuery(start);  // 强制刷新 cuda 执行流。

// run code.

CHECK(cudaEventRecord(stop));
CHECK(cudaEventSynchronize(stop)); // 强制同步,让主机等待cuda事件执行完毕。
float elapsed_time = 0;
CHECK(cudaEventElapsedTime(&curr_time, start, stop)); // 计算 start 和stop间的时间差(ms)。
printf("host memory malloc and copy: %f ms.\n", curr_time - elapsed_time);  

注意事项

nvprof

  • nvprof在算力8.0以上的卡好像不支持
$ nvprof ./add
======== Warning: nvprof is not supported on devices with compute capability 8.0 and higher.
                  Use NVIDIA Nsight Systems for GPU tracing and CPU sampling and NVIDIA Nsight Compute for GPU profiling.
                  Refer https://developer.nvidia.com/tools-overview for more details.

影响 GPU 加速的关键因素

  • 要获得可观的 GPU 加速,就必须尽量缩减主机和设备间数据传输所花时间的占比
    • 有些计算即使在 GPU 中速度不高也要尽量放在 GPU 中实现,以避免过多数据经由 PCIe 传递。
  • 提高算术强度可以显著地提高 GPU 相对于 CPU 的加速比。
    • 算术强度,是指一个计算问题中算术操作的工作量与必要的内存操作的工作量之比。
    • 对设备内存的访问速度取决于 GPU 的显存带宽。
  • 核函数的并行规模。
    • 并行规模可以用 GPU 中的线程数目来衡量。
    • 一个 GPU 由多个流多处理器SM(streaming multiprocessor)构成,每个 SM 中有若干 CUDA 核心。
    • 每个 SM 是相对独立的,一个 SM 中最多驻留的线程数一般为 2048 或 1024(图灵架构)。
    • 若要 GPU 满负荷工作,则核函数中定义的线程总数要不少于某值,一般与 GPU 能够驻留的线程总数相当。

CUDA 的数学函数库

  • CUDA Math

你可能感兴趣的:(#,CUDA编程,cuda)