Multi-GPU 支持 - cuTENSORMg

关于 cuTENSORMg 的介绍及其数据结构的讨论,请参见这篇博客文章

性能指南

cuTENSORMg 在很大程度上具有与 cuTENSOR 相同的性能指南,但有一些额外的考虑事项

  • 尝试在所有 GPU 上完全分配张量,以充分利用可用带宽。

  • 尝试保持块大小的乘积足够大(即,对于块大小有效的缩并操作而言足够大)。

    • 根据数据类型,缩并操作在收缩和非收缩模式的组合范围内的元素数量在 1000 到 4000 之间时,开始达到高效率。

    • 因此,所有分块的乘积应达到该阈值。

    • 例如,单个模式下的 2048 元素分块就足够了,或者两个模式下的 64x64 分块也足够了。

  • 尝试在来自 A 和 B 的收缩模式以及非收缩模式之间分配张量。

  • 尝试保持步长为 1 的模式足够大(即,大于 32 个元素)。

  • 尝试选择包含小素因子的分块,特别是 2 的幂,以保持对齐。

  • 尝试在多种模式下分配张量。由于模式可以相对于不同的张量缩并操作进行收缩或非收缩,因此跨多种模式分配可以对冲退化的分布。

  • 当前,性能在很大程度上取决于设备计数、块大小和问题大小之间的关系。为了获得最佳性能,请尝试使组合块大小为问题大小除以设备计数的倍数。理想情况下,该倍数大于约 4。

精度保证

cuTENSORMg 遵循 cuTENSOR 提供的相同精度保证,但对于半精度类型可能会产生略低的精度,因为累加器平铺具有半精度,而内核累加器具有单精度。

标量类型

许多操作支持将参数乘以标量。使用的标量类型遵循与 cuTENSOR 标量类型相同的规则。

CUDA 图形支持

cuTENSORMg 中的所有操作都可以使用 CUDA 图形捕获,只要它们不涉及主机操作,即操作数均不在主机上存储数据。

cuTENSORMg 日志记录

可以通过在启动目标应用程序之前设置以下环境变量来启用 cuTENSORMg 的日志记录机制

CUTENSORMG_LOG_LEVEL=<level> - 其中 level 是以下级别之一

  • “0” - 关闭 - 日志记录被禁用(默认)

  • “1” - 错误 - 仅记录错误

  • “2” - 跟踪 - 启动 CUDA 内核的 API 调用将记录其参数和重要信息

  • “3” - 提示 - 可能提高应用程序性能的提示

  • “4” - 信息 - 提供关于库执行的常规信息,可能包含关于启发式状态的详细信息

  • “5” - API 跟踪 - API 调用将记录其参数和重要信息

CUTENSORMG_LOG_MASK=<mask> - 其中 mask 是以下掩码的组合

  • “0” - 关闭

  • “1” - 错误

  • “2” - 跟踪

  • “4” - 提示

  • “8” - 信息

  • “16” - API 跟踪

CUTENSORMG_LOG_FILE=<file_name> - 其中 file name 是日志文件的路径。文件名可能包含 %i,它将被进程 ID 替换。例如 “<file_name>_%i.log”。

如果未定义 CUTENSORMG_LOG_FILE,则日志消息将打印到 stdout。