系统软件层

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) 卸载内核模块,确保没有资源泄漏。