You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HIP代码内部检测当前GPU为AMD还是NVIDIA厂商

HIP双后端下GPU厂商判断及相关问题解决方案

厂商判断方法

运行时动态判断(跨平台兼容首选)

调用hipGetDeviceProperties获取设备属性后,直接访问公共字段即可判断,这两个字段在AMD ROCm后端和NVIDIA CUDA后端均做了适配,不会触发内存访问错误:

  • 直接读取字符串字段vendorName:返回"Advanced Micro Devices, Inc."即为AMD GPU,返回"NVIDIA Corporation"即为NVIDIA GPU,无需记忆硬编码值,可读性最好。
  • 读取PCIe厂商ID字段vendorId做数值判断:值为0x10DE(十进制4318)对应NVIDIA GPU,值为0x1002(十进制4098)对应AMD GPU,适合做快速分支判断。

段错误的核心原因是未做分支判断,直接访问了仅ROCm后端新增的hipDeviceProp_t字段,这些字段在CUDA后端对应的结构体中不存在偏移定义,直接访问就会触发越界。

编译期静态判断

如果编译阶段就明确目标运行平台,可以直接使用HIP内置的预定义宏做代码裁剪:

  • 编译ROCm(AMD)后端时,宏__HIP_PLATFORM_AMD__会被自动定义
  • 编译CUDA(NVIDIA)后端时,宏__HIP_PLATFORM_NVIDIA__会被自动定义
    所有平台专属的字段访问、特性逻辑都可以用这两个宏包裹,编译阶段就排除不兼容的代码。

配套问题解决

针对开发中涉及的另外两个常见问题,对应解法如下:

  • 结构体字段兼容问题:所有不属于HIP公共API定义的字段,全部放在上述运行时分支或编译期宏分支内访问,NVIDIA分支下仅访问CUDA原生cudaDeviceProp_t存在的字段,AMD分支下再访问ROCm扩展的专属字段,即可彻底避免段错误。
  • 精确GPU型号识别问题:不需要手动解析gfx???格式的架构编码,直接读取hipDeviceProp_t的name字段即可,该字段在双端都会返回完整的零售型号字符串,比如AMD平台返回"Radeon RX 7900 XTX",NVIDIA平台返回"NVIDIA GeForce RTX 4090",可以直接用于输出展示。

最小实现示例

#include <hip/hip_runtime.h>
#include <cstdio>

int main() {
    int dev_count = 0;
    hipGetDeviceCount(&dev_count);
    for (int i = 0; i < dev_count; ++i) {
        hipDeviceProp_t prop;
        hipGetDeviceProperties(&prop, i);
        // 先通过公共字段判断厂商,无访问越界风险
        if (prop.vendorId == 0x10DE) {
            printf("[Device %d] NVIDIA GPU: %s\n", i, prop.name);
            // 此处编写仅NVIDIA平台支持的字段访问逻辑
        } else if (prop.vendorId == 0x1002) {
            printf("[Device %d] AMD GPU: %s, GFX arch: %s\n", i, prop.name, prop.gcnArchName);
            // 此处编写仅AMD平台支持的字段访问逻辑
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者wyphan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:27:40