README.md 1.79 KB
Newer Older
1
2
3
4
# HIP target mismatch 最小复现

## 问题描述

one's avatar
one committed
5
使用 Spack 在 DTK26.04 环境编译 Nalu-Wind 依赖的 Trilinos+Kokkos 时遇到编译错误:
6
7
8
9
10
11
12

```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
```

one's avatar
one committed
13
14
15
16
17
环境信息:

- Target: gfx936
- Image: harbor.sourcefind.cn:5443/dcu/admin/base/pytorch:2.7.1-ubuntu22.04-dtk26.04-py3.11

18
19
20
21
22
23
24
25
## 复现方式

拷贝目录中的文件到容器中,然后运行脚本:

```sh
./run.sh
```

one's avatar
one committed
26
容器中使用 DTK 原版 `hip-config.cmake` 时,预期会有编译错误:
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

```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 阶段的符号解析。

one's avatar
one committed
42
使用 DTK 原版 `hip-config.cmake` 时,`hip::device` 会向 consumer 编译和最终链接注入 `gfx906;gfx926;gfx928;gfx936;gfx938` 五个 target。此时 provider 只提供 `gfx936` 的 device symbol 定义,而 consumer 在其它 target 上也引用了这个符号,因此 device link 报错。
43
44

使用修复后的 `hip-config.cmake` 时,`hip::device` 在容器中自动检测为 `gfx936`,provider、consumer 和最终 device link 的 target 一致,因此可以正常链接。