# HIP target mismatch 最小复现 ## 问题描述 使用 Spack 在 DTK26.04 环境编译 Nalu-Wind 依赖的 Trilinos+Kokkos 时遇到编译错误: ```text lld: error: undefined protected symbol: kokkos_impl_hip_constant_memory_buffer >>> referenced 21505 more times dcc: error: amdgcn-link command failed with exit code 1 ``` 环境信息: - Target: gfx936 - Image: harbor.sourcefind.cn:5443/dcu/admin/base/pytorch:2.7.1-ubuntu22.04-dtk26.04-py3.11 ## 复现方式 拷贝目录中的文件到容器中,然后运行脚本: ```sh ./run.sh ``` 容器中使用 DTK 原版 `hip-config.cmake` 时,预期会有编译错误: ```text lld: error: undefined protected symbol: kokkos_impl_hip_constant_memory_buffer >>> referenced by lto.tmp:(read_constant(unsigned long*)) clang++: error: amdgcn-link command failed with exit code 1 ``` ## 原因分析 这个复现说明问题的关键不是 Kokkos 或 Trilinos 本身,而是两个 HIP 编译单元的 GPU target 集合不一致: - `provider.cpp` 定义 `kokkos_impl_hip_constant_memory_buffer`,并固定只按 `gfx936` 编译。 - `consumer.cpp` 声明并引用同名 constant memory symbol,编译 target 来自 `hip::device`。 - 两个编译单元都使用 `-fgpu-rdc`,最终链接也使用 `-fgpu-rdc`,从而触发 RDC device link 阶段的符号解析。 使用 DTK 原版 `hip-config.cmake` 时,`hip::device` 会向 consumer 编译和最终链接注入 `gfx906;gfx926;gfx928;gfx936;gfx938` 五个 target。此时 provider 只提供 `gfx936` 的 device symbol 定义,而 consumer 在其它 target 上也引用了这个符号,因此 device link 报错。 使用修复后的 `hip-config.cmake` 时,`hip::device` 在容器中自动检测为 `gfx936`,provider、consumer 和最终 device link 的 target 一致,因此可以正常链接。