@@ -30,13 +30,13 @@ ROCm 软件栈本身具备较高的成熟度与完备性,用户根据 ROCm 提
3030   -  [ operators.cmake] ( https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/operators.cmake#L98 )  配置 HIP Kernel 算子注册方式,自动映射 CUDA Kernel 算子文件为 HIP Kernel 算子文件
3131   -  其他相关 cmake 配置,包括依赖的第三方库如 [ eigen.cmake] ( https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/external/eigen.cmake )  和 [ warpctc.cmake] ( https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/external/warpctc.cmake ) 等
32322 .  设备接入:主要包括设备相关的 Driver/Runtime API 的接入,以及通讯库等底层加速库的接入工作
33-    -  动态库加载: 在 [ paddle/phi/core/platform/ dynload] ( https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/core/platform/ dynload )  目录下动态加载 ROCm 加速库及所需 API,如 [ hiprand.h] ( https://github.com/PaddlePaddle/Paddle/blob /develop/paddle/phi/core/platform/ dynload/hiprand.h )  [ miopen.h] ( https://github.com/PaddlePaddle/Paddle/blob /develop/paddle/phi/core/platform/ dynload/miopen.h )  [ rocblas.h] ( https://github.com/PaddlePaddle/Paddle/blob /develop/paddle/phi/core/platform /dynload/rocblas.h ) 等
33+    -  动态库加载: 在 [ paddle/phi/backends/ dynload] ( https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/backends/ dynload )  目录下动态加载 ROCm 加速库及所需 API,如 [ hiprand.h] ( https://github.com/PaddlePaddle/Paddle/tree /develop/paddle/phi/backends/ dynload/hiprand.h )  [ miopen.h] ( https://github.com/PaddlePaddle/Paddle/tree /develop/paddle/phi/backends/ dynload/miopen.h )  [ rocblas.h] ( https://github.com/PaddlePaddle/Paddle/tree /develop/paddle/phi/backends /dynload/rocblas.h ) 等
3434   -  Driver/Runtime 适配:主要在 [ paddle/fluid/platform/device/gpu] ( https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/platform/device/gpu )  目录下对 HIP 和 CUDA 进行了相关 API 的封装,其中在 [ gpu_types.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/platform/device/gpu/gpu_types.h )  少量封装了部分与 CUDA 差异较小的数据类型定义,部分 ROCm 独有代码位于[ paddle/phi/core/platform/device/gpu/rocm] ( https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/core/platform/device/gpu/rocm ) 目录
3535   -  Memory 管理:利用上一步封装好的 Driver/Runtime API 对 [ memcpy.cc] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/memory/memcpy.cc#L574 )  与 [ paddle/phi/core/memory/allocation] ( https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/core/memory/allocation )  目录下的多种 Memory Allocator 进行实现
3636   -  Device Context 管理:利用封装好的 API 实现对设备上下文的管理及设备池的初始化,位于 [ device_contxt.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/platform/device_context.h ) 
3737   -  其他设备管理相关的适配接入,如 Profiler, Tracer, Error Message, NCCL 等,代码主要位于 [ Paddle/platform] ( https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/platform )  目录下
38383 .  算子注册:主要包括 HIP Kernel 的算子注册,以及 MIOpen 的算子在 ROCm 平台上的注册
39-    -  数据类型支持:除通用数据类型外,还需适配 Paddle 支持的特殊数据类型包括 [ float16.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/platform/ float16.h#L144 )  [ complex.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/platform/ complex.h#L88 )  [ bfloat16.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/platform /bfloat16.h#L65 )  等
39+    -  数据类型支持:除通用数据类型外,还需适配 Paddle 支持的特殊数据类型包括 [ float16.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/common/ float16.h#L144 )  [ complex.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/common/ complex.h#L88 )  [ bfloat16.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/common /bfloat16.h#L65 )  等
4040   -  数学库支持:通过 ROCm 的 rocBLAS 库,实现 Paddle 在 [ blas.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/funcs/blas/blas.h )  中定义的 BLAS 函数,代码位于 [ blas_impl.hip.h] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/funcs/blas/blas_impl.hip.h ) 
4141   -  Kernel 算子注册:根据 [ operators.cmake] ( https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/operators.cmake#L98 )  的修改,可以大部分复用 Paddle 框架下的 CUDA 已有算子 Kernel 文件,存在部分 Kernel 实现在 CUDA 与 ROCm 平台下有所区别,例如线程数、WarpSize 以及 thurst 库等;此类区别需要针对具体的算子实现进行相应的调整,通过 Paddle 自身的算子单测用例以及模型验证测试可以对此类问题进行定位并修复
4242   -  MIOpen 算子注册:MIOpen 与 cuDNN 的接口与类型设计较为类似,但在实际执行中还是存在一定区别,因为对于此类算子需根据 MIOpen API 进行适配,甚至对于差异较大的算子例如 [ rnn_op.cu.cc] ( https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/operators/rnn_op.cu.cc#L506 )  需要进行 weight 数据重排
0 commit comments