README.md 4.72 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# DTK Local Overrides

维护需要覆盖到 DTK 软件栈目录 `DTK_HOME=/opt/dtk` 中的修改版文件。目录下的相对路径一般来说和 `$DTK_HOME` 下的相对路径保持一致。

例如:

```text
./hip/lib/cmake/hip/hip-config.cmake
```

会覆盖容器中的:

```text
/opt/dtk/hip/lib/cmake/hip/hip-config.cmake
```

## 安装方式

把本目录下载到容器中,进入目录后执行:

```sh
./install.sh
```

安装前会为已存在的目标文件生成带时间戳的 `.bak.*` 备份。

## 可直接覆盖的文件

这部分记录可以直接覆盖到 DTK 软件栈中的文件,这些文件在目录中的相对路径和 `$DTK_HOME` 下的相对路径一致。

### `hip/lib/cmake/hip/hip-config.cmake`

| 类型 | 路径 |
| --- | --- |
| 来源文件 | `hip/lib/cmake/hip/hip-config.cmake` |
| 原始备份 | `hip/lib/cmake/hip/hip-config.cmake.orig` |
| 历史修正版 | `hip/lib/cmake/hip/hip-config.cmake.patched` |
| 目标文件 | `$DTK_HOME/hip/lib/cmake/hip/hip-config.cmake` |

> 参考:[ROCm 7 hipamd](https://github.com/ROCm/rocm-systems/tree/therock-7.13/projects/clr/hipamd)

修复内容:

1. 基于 ROCm 7 最新 `hip-config.cmake.in` 生成 `hip-config.cmake`

   `.cmake.in` 中的 `@PACKAGE_INIT@`、安装路径、`HIP_INSTALLS_HIPCC` 等 configure-time 占位符按当前 DTK 容器布局展开。

2. 保留 ROCm 的平台检测入口。

   当前 DTK 的 `hipconfig --platform` 输出为 `amd`,因此主配置在 `HIP_PLATFORM STREQUAL "amd"` 分支中会加载适配后的子配置:

   ```text
   hip-config-amd.cmake
   ```

### `hip/lib/cmake/hip/hip-config-amd.cmake`

| 类型 | 路径 |
| --- | --- |
| 来源文件 | `hip/lib/cmake/hip/hip-config-amd.cmake` |
| ROCm 参考 | `rocm-references/hip-config-amd.cmake.in` |
| 目标文件 | `$DTK_HOME/hip/lib/cmake/hip/hip-config-amd.cmake` |

修复内容:

1. 按 DTK 容器布局设置默认 `ROCM_PATH`

   ROCm 7 默认把 `ROCM_PATH` 设为 HIP package prefix。当前 DTK 中 HIP package prefix 是 `/opt/dtk/hip`,而 LLVM、device libs、`amdgpu-arch` 等组件位于 `/opt/dtk` 下。因此本文件在未显式设置 `ROCM_PATH` 时使用:

   ```text
   ${PACKAGE_PREFIX_DIR}/..
   ```

2. 不再硬编码多组 GPU targets。

   DTK 原始文件默认设置:

   ```text
   gfx906;gfx926;gfx928;gfx936;gfx938
   ```

   现在沿用 ROCm 逻辑:优先使用 `GPU_TARGETS`,兼容旧变量 `AMDGPU_TARGETS`;如果没有显式设置,则通过 `$ROCM_PATH/llvm/bin/amdgpu-arch` 自动检测。例如容器中该检测结果可能是 `gfx936`,避免 device link 阶段混入多组 target。

3. 限制 `hip::device` 的 HIP 编译选项只作用于 CXX 语言。

   DTK 原始文件将 `-xhip``--offload-arch=...` 无条件挂到 `hip::device``INTERFACE_COMPILE_OPTIONS` 上。Trilinos 通过 `Kokkos::kokkos -> roc::rocthrust -> roc::rocprim_hip -> hip::device` 继承这些选项后,legacy C target 也会带上 HIP 编译参数,导致 Ifpack/ML/Tpetra/Sacado 等 `.c` 文件被按 HIP/C++ 编译。

   现在沿用 ROCm 的 helper,通过 CMake 生成表达式把这些选项限制到 `CXX` 编译语言,避免污染 C target。

### `hip/lib/cmake/hip/hip-config-nvidia.cmake`

| 类型 | 路径 |
| --- | --- |
| 来源文件 | `hip/lib/cmake/hip/hip-config-nvidia.cmake` |
| ROCm 参考 | `rocm-references/hip-config-nvidia.cmake.in` |
| 目标文件 | `$DTK_HOME/hip/lib/cmake/hip/hip-config-nvidia.cmake` |

当前 DTK 适配不使用 NVIDIA 分支,但 `hip-config.cmake` 保留了 `HIP_PLATFORM STREQUAL "nvidia"` 时加载该文件的路径。为了便于和上游同步,本文件也随 overlay 一起安装。

该文件来自 ROCm 7 的 `hip-config-nvidia.cmake.in`,只将 `@PACKAGE_INCLUDE_INSTALL_DIR@` 展开为:

```text
${HIP_PACKAGE_PREFIX_DIR}/include
```

## 非直接覆盖的文件

这部分记录不能按相同相对路径直接覆盖的文件。例如源文件是本地工具脚本,安装时会生成 DTK 目录中的一个或多个命令入口。

### `tools/dtk-amdclang-wrapper`

| 类型 | 路径 |
| --- | --- |
| 来源文件 | `tools/dtk-amdclang-wrapper` |
| 目标文件 | `$DTK_HOME/llvm/bin/amdclang` |
| 目标文件 | `$DTK_HOME/llvm/bin/amdclang++` |

修复内容:

Spack ROCm/CMake HIP language 可能会给 `amdclang++` 传入:

```text
--gcc-toolchain=/opt/dtk/llvm
```

`/opt/dtk/llvm` 是 DTK LLVM/DCC 前缀,不是系统 GCC toolchain 前缀,这会导致 host 侧 C++ 标准库头文件查找失败,例如:

```text
fatal error: 'cmath' file not found
```

该 wrapper 安装为 `$DTK_HOME/llvm/bin/amdclang``$DTK_HOME/llvm/bin/amdclang++`,默认转发到:

```text
/opt/dtk/llvm/bin/dcc
```

转发时改写参数 `--gcc-toolchain=/opt/dtk/llvm``--gcc-toolchain=/usr`