系统软件层
TVM 与 AMD GPU 通过 ROCm 进行交互的完整流程:
-
初始化 GPU 上下文:使用
hipSetDevice(device_id)
选择特定的 GPU 设备。这一步确保后续操作在正确的 GPU 上执行。 -
分配 GPU 显存:调用
hipMalloc(&device_ptr, size)
来在 GPU 上分配所需的显存。这将为输入、输出和中间计算结果分配空间。若不再需要这些显存,可以使用hipFree(device_ptr)
释放显存,以防内存泄漏。 -
数据传输:使用
hipMemcpy(device_ptr, host_ptr, size, hipMemcpyHostToDevice)
将数据从主机(CPU)传输到设备(GPU)。当 GPU 计算完成后,通过hipMemcpy(host_ptr, device_ptr, size, hipMemcpyDeviceToHost)
将结果从设备传回主机。 -
加载和执行内核:使用
hipModuleLoad(&module, "kernel_name")
加载 CUDA 内核模块。通过hipModuleGetFunction(&function, module, "kernel_function_name")
获取内核函数句柄。配置线程块和线程网格后,使用hipLaunchKernel(function, grid_dim, block_dim, args, shared_mem_size, stream)
启动内核。 -
同步 GPU 操作:使用
hipDeviceSynchronize()
确保所有发起的 GPU 操作都已完成。这一步是必要的,以保证主机在继续执行后续操作时能获取正确的结果。 -
释放资源:在计算任务完成后,使用
hipFree(device_ptr)
释放显存,并使用hipModuleUnload(module)
卸载内核模块,确保没有资源泄漏。