
[n1]只有1?其他序号没了
[n2]病句,表达不清
这些版本的上游Linux内核支持ROCm中的以下GPU:
1)4.17: Fiji, Polaris 10, Polaris 11
2)4.18: Fiji, Polaris 10, Polaris 11, Vega10
3)4.20: Fiji, Polaris 10, Polaris 11, Vega10, Vega 7nm
上游驱动程序可能有助于在与AMD存储库中,可用的内核驱动程序不兼容系统运行ROCm软件。对于可以选择使用AMD或上游驱动程序的用户,需要考虑各种权衡,见表3-1。
表3-1 对于可以选择使用AMD或上游驱动程序的用户,需要考虑各种权衡
|
使用AMD的rock dkms软件包 |
使用上游内核驱动程序 |
正面的 |
更多GPU功能,并且它们更早启用 |
包括最新的Linux内核功能 |
|
AMD在支持的发行版上进行了测试 |
可能适用于其他发行版和自定义内核 |
|
支持的GPU已启用,无论内核版本如何 |
|
|
包含最新的GPU固件 |
|
反面的 |
可能不适用于所有Linx发行版或版本 |
功能和硬件支持因内核版本而异 |
|
4.18以上的内核目前不支持 |
将GPU对系统内存的使用限制为系统内存的3/8 |
|
IPC和RDMA功能尚未启用 |
|
|
AMD没有测试到与rock dkms软件包相同的级别 |
|
|
不包括最新固件 |
|
4. 从AMD ROCm存储库安装
AMD目前为ROCm 2.4.x软件包托管Debian和RPM存储库。Debian存储库中的软件包已经过签名,以确保软件包的完整性。
5. ROCm二进制包结构
ROCm是一系列软件的集合,从驱动程序和运行时到库和开发人员工具。在AMD的软件包发行版中,这些软件项目作为单独的软件包提供。如果用户不想安装所有ROCm,允许他们只安装所需的软件包。默认情况下,这些软件包会将大部分ROCm软件安装到/opt/ROCm/中。
6. 小结一下
从高层次的角度来看,ROCm提供了一套丰富的工具,允许为应用程序选择最佳语言。
1)HCC(异构计算编译器)支持HC方言
2)HIP是一个运行时库,它位于HCC之上(对于AMD ROCm平台;对于Nvidia,它使用NVCC编译器)
3)以下内容将很快为GCN ISA提供本机编译器支持:
①OpenCL 1.2+
②Anaconda(Python)与Numba
所有这些都是开源项目,所以可以从语言到硬件都采用完全开放的堆栈。
比较不同计算API的语法,见表3-2。
表3-2 比较不同计算API的语法
Term |
CUDA |
HIP |
HC |
C++AMP |
OpenCL |
设备 |
int deviceId |
int deviceId |
hc::accelerator |
concurrency:: accelerator |
cl_device |
队列 |
cudaStream_t |
hipStream_t |
hc:: accelerator_view |
concurrency:: accelerator_view |
cl_command_queue |
事件 |
cudaEvent_t |
hipEvent_t |
hc:: completion_future |
concurrency:: completion_future |
cl_event |
内存 |
void * |
void * |
void*; hc::array; hc::array_view |
concurrency::array; concurrency::array_view |
cl_mem |
|
网格 块 线程 变形 |
网格
块 线程
变形 |
程度
小块 线程
波前 |
程度 小块 线程
N/A |
NDRange work-group work-item sub-group |
线程索引 |
threadIdx.x |
hipThreadIdx_x |
t_idx.local[0] |
t_idx.local[0] |
get_local_id(0) |
块索引 |
blockIdx.x |
hipBlockIdx_x |
t_idx.tile[0] |
t_idx.tile[0] |
get_group_id(0) |
块维数 |
blockDim.x |
hipBlockDim_x |
t_ext.tile_dim[0] |
t_idx.tile_dim0 |
get_local_size(0) |
Grid-dim |
gridDim.x |
hipGridDim_x |
t_ext[0] |
t_ext[0] |
get_global_size(0) |
设备功能 |
__device__ |
__device__ |
[[hc]] (在许多情况下自动检测) |
restrict(amp) |
隐含在设备编译中 |
主机功能 |
__host_ (default) |
__host_ (default) |
[[cpu]] (default) |
strict(cpu) (default) |
隐含在主机编译中 |
主机+设备功能 |
__host__ __device__ |
__host_ __device__ |
[[hc]] [[cpu]] |
restrict(amp,cpu) |
没有等价 |
内核启动 |
<<< >>> |
hipLaunchKernel |
hc:: parallel_for_each |
concurrency:: parallel_for_each |
clEnqueueND- RangeKernel |
全局内存 |
__global__ |
__global__ |
不必要/隐含 |
不必要/隐含 |
__global |
组内存 |
__shared__ |
__shared__ |
tile_static |
tile_static |
__local |
常数 |
__constant__ |
__constant__ |
不必要/隐含 |
不必要/隐含 |
__constant |
|
__syncthreads |
__syncthreads |
tile_static.barrier() |
t_idx.barrier() |
barrier(CLK_LOCAL_MEMFENCE) |
原子内置 |
atomicAdd |
atomicAdd |
hc::atomic_fetch_add |
concurrency:: atomic_fetch_add |
atomic_add |
精确数学 |
cos(f) |
cos(f) |
hc:: precise_math::cos(f) |
concurrency:: precise_math::cos(f) |
cos(f) |
快速数学 |
__cos(f) |
__cos(f) |
hc::fast_math::cos(f) |
concurrency:: fast_math::cos(f) |
native_cos(f) |
向量 |
float4 |
float4 |
hc:: short_vector::float4 |
concurrency:: graphics::float_4 |
float4 |
对于HC和C++AMP,假设捕获的_tiled_ext_名为t_ext,捕获的_extent_称为ext。这些语言使用捕获的变量将信息传递给内核,而不是使用特殊的内置函数,因此确切的变量名称可能会有所不同。
索引函数(从线程索引开始)显示了1D网格的术语。一些API对3D网格使用xyz/012索引的逆序。
HC允许在运行时指定图块维度,而C++AMP要求在编译时指定图条维度。因此,拼贴块dims的hc语法是t_ext.tile_dim[0],而C++AMP是t_ext.teile_dim0。
从ROCm 2.0版本开始,C++AMP在HCC中不再可用。