一、Identifying Architecture Features
1. HIP_ARCH Defines
在 CUDA 编程中,__CUDA_ARCH__ 是一个预定义的宏,用于指示当前编译的代码所针对的 NVIDIA GPU 的计算能力(Compute Capability)。开发者可以使用这个宏来编写条件代码,以便在不同架构的 GPU 上支持不同的特性。例如,如果代码需要使用双精度浮点数(doubles),它可能会检查 __CUDA_ARCH__ 是否大于或等于 130,因为这是支持双精度浮点数的最小计算能力。
#if (__CUDA_ARCH__ >= 130)
// doubles are supported
然而,当使用 AMD GPU 和 ROCm 平台时,这种基于 __CUDA_ARCH__ 的检查就不再适用,因为 AMD GPU 有不同的架构和特性集。为了解决这个问题,HIP(Heterogeneous-compute Interface for Portability)提供了一套宏定义,使得开发者可以编写可移植的代码,这些代码可以在 NVIDIA 的 CUDA 平台和 AMD 的 ROCm 平台上运行。
HIP 提供的宏定义如下:
__HIP_ARCH_HAS_DOUBLES__:如果当前的 GPU 支持双精度浮点数,则定义为真。
在编写 HIP 代码时,您应该使用这些宏来代替直接比较 __CUDA_ARCH__ 的值。这样做的好处是您的代码可以在不同的硬件架构上移植,而不需要为每种架构编写特定的条件代码
#if __HIP_ARCH_HAS_DOUBLES__
// 双精度浮点数在当前架构上是支持的
#endif
对于主机代码(即在 CPU 上运行的代码),所有 __HIP_ARCH__ 相关的宏都会被定义为 0。这意味着这些宏只应该在设备代码(即在 GPU 上运行的代码)中使用。
2. Device-Architecture Properties
在 CUDA 和 HIP 编程中,查询设备属性是一种常见的做法,用于确定特定 GPU 设备支持哪些特性。这对于编写可在不同 GPU 架构上运行的可移植代码非常重要。
在 HIP 中,hipGetDeviceProperties 函数用于获取设备的属性,这些属性描述了设备的能力和特性。设备属性结构体 hipDeviceProp_t 包含了多个字段,可以用来检查设备是否支持特定的功能。
以下是如何使用 hipGetDeviceProperties 来查询设备属性的示例:
hipDeviceProp_t deviceProp;
hipGetDeviceProperties(&deviceProp, device);
// 检查设备是否支持共享 int32 原子操作
if (deviceProp.arch.hasSharedInt32Atomics) {
// 执行支持共享 int32 原子操作的代码
}
在这个例子中,deviceProp.arch.hasSharedInt32Atomics 是一个布尔字段,如果设备支持共享内存中的 32 位整数原子操作,则该字段为真。
与直接测试 major 和 minor 字段相比,使用 hipGetDeviceProperties 返回的结构体中的特定功能标志字段是一种更可移植的方法。直接测试 major 和 minor 字段通常与特定的 GPU 架构相关联,这限制了代码的可移植性:
// 不可移植的代码示例
if ((deviceProp.major == 1 && deviceProp.minor < 2)) {
// 针对特定架构的代码
}
在编写 HIP 代码时,应该避免直接比较 major 和 minor 字段,而是使用 hipGetDeviceProperties 返回的属性来检查设备的功能。这样可以确保您的代码能够在不同的 GPU 设备上正常运行,无论它们是由 NVIDIA、AMD 还是其他制造商生产的。
3. Table of Architecture Properties



最低0.47元/天 解锁文章
712

被折叠的 条评论
为什么被折叠?



