@ 既然 Nvidia 已经有不少高性能算子库了,为什么提供 CUDA 编程模型?让用户重复造轮子吗?
虽然 NVIDIA 提供了许多高性能算子库,例如 cuDNN、cuBLAS 和 cuFFT 等。可以直接用于深度学习、线性代数和快速傅里叶变换等常见任务,但 CUDA 编程模型仍然至关重要
- 灵活性与定制化: 现成的算子库虽然高效,但它们的功能有限,无法涵盖所有可能的计算需求。CUDA 允许开发者针对特定算法或应用场景编写自定义内核,实现更高的性能和更精细的控制。
 - 性能优化: 即使对于可以使用现有库的任务,通过仔细设计内核和内存访问模式。进行更深入的优化。
 - CUDA 提供了对 NVIDIA GPU 硬件的直接访问,允许开发者充分利用 GPU 的并行计算能力。这比使用更高层次的库更有效,因为后者可能需要进行额外的间接调用和数据转换。
 
CUDA 编程模型并非为了让用户重复造轮子,而是为了提供一种灵活、高效且可定制的工具,用于开发各种高性能并行计算应用。现成的算子库和 CUDA 编程模型可以互补使用,开发者可以根据实际需求选择最合适的方案。 对于需要高度定制化、极致性能或对底层硬件有精细控制需求的场景,CUDA 编程是不可或缺的。
@ 为什么 PyTorch 有自研算子的 CUDA 实现,而不是直接使用 Nvidia 提供的高性能算字库?
灵活性与控制: 直接使用 NVIDIA 的库虽然方便,但会牺牲一定的灵活性。PyTorch 需要对算子的行为进行精细的控制,以适应其自动微分系统、各种优化策略(例如混合精度训练)以及不同的硬件平台。 自行实现允许 PyTorch 更紧密地集成算子到其框架中,并根据需要进行调整。
性能优化: 虽然 NVIDIA 的库通常性能很高,但它们并非针对所有情况都进行了最佳优化。PyTorch 可以根据其自身的架构和使用模式,对算子进行针对性的优化,从而获得更高的性能。这尤其体现在一些新兴的算法或硬件架构上
可扩展性与定制化: PyTorch 的目标是支持广泛的硬件和算法。自行实现算子使得 PyTorch 能够更容易地扩展到新的硬件平台和算法,而无需依赖 NVIDIA 库的更新速度。 这对于 PyTorch 的长期发展和适应未来技术至关重要。
特定功能支持: 某些 PyTorch 的功能可能需要一些 NVIDIA 库不提供的特定算子实现。
代码维护与版本控制: 依赖外部库会增加维护的复杂性。PyTorch 通过自行实现关键算子,可以更好地控制代码质量、版本兼容性和更新周期。
总之是为了在性能、灵活性、可扩展性和控制方面获得更大的自主权,从而更好地满足其框架的独特需求和长远发展目标。 这是一种权衡,在一定程度上增加了开发难度,但换来了更大的灵活性和对未来技术的适应能力。
一定的灵活性,但不是最佳优化
Nvidia 提供的高性能算字库会牺牲掉一定的灵活性,并且它们并非对所有情况都进行了最佳优化
这并非绝对的缺点,而是一种权衡。NVIDIA 的高性能算子库在性能和易用性方面具有显著优势,但它们并非万能的。 在需要高度的灵活性、针对特定硬件或工作负载进行极致优化,或者需要一些库中未提供的特殊算子时,使用 CUDA 进行自定义实现是必要的。
互操作性
CUDA C、Thrust 和 CUTLASS 等都可以在同一个 CUDA 程序中协同工作,它们之间存在互操作性。这意味着它们可以共享数据和操作,并且可以组合使用以构建高性能的 GPU 应用程序。互操作性体现在以下几个方面:
- 数据共享
 - 操作组合
 - 统一的编程模型
 
如,Pytorch 源码中有些算子前半部分使用 cuda 构建计算过程,后半部分会用到 thrust 库 中的 线性组合 接口。