MUSA Driver API 指南
MUSA Driver API 提供底层编程接口 ,用于显式上下文管理、模块加载、高级设备控制。
- 设计特点:显式控制(需要显式初始化和创建上下文)、灵活性高(可以精细控制设备资源)
- 适用场景:多 GPU 应用、多进程应用、库开发、需要精细控制的高级应用
概述
Runtime API vs Driver API 对比
| 特性 | Runtime API | Driver API |
|---|---|---|
| 初始化 | 隐式(首次调用自动初始化) | 显式(muInit()) |
| 上下文管理 | 自动(primary context) | 手动创建和销毁 |
| 代码复杂度 | 低 | 高 |
| 灵活性 | 低 | 高 |
| 适用场景 | 应用程序、快速原型 | 多 GPU、多进程、库开发 |
对比 Runtime API:详见 Runtime API 指南
初始化和上下文管理
显式初始化
#include <mu.h>
// 显式初始化(可选,首次调用 API 时也会自动初始化)
muInit(0);
// 获取设备
MUdevice device;
muDeviceGet(&device, 0);
// 创建上下文
MUcontext context;
muCtxCreate(&context, 0, device);
// 设置当前上下文
muCtxSetCurrent(context);
// 使用完毕后销毁上下文
muCtxDestroy(context);
上下文管理
// 获取当前上下文
MUcontext currentCtx;
muCtxGetCurrent(¤tCtx);
// 获取上下文的设备
MUdevice device;
muCtxGetDevice(&device, context);
// 获取上下文标志
unsigned int flags;
muCtxGetFlags(&flags, context);
// 切换上下文
muCtxSetCurrent(context1);
// ... 使用 context1 ...
muCtxSetCurrent(context2);
// ... 使用 context2 ...
主上下文
// 获取设备的 primary context(Runtime API 使用)
MUcontext primaryCtx;
muDevicePrimaryCtxGetState(device, &primaryCtx, NULL);
// 释放 primary context(通常不需要手动调用)
muDevicePrimaryCtxRelease(device);
模块管理
模块加载
// 从 PTX 文件加载模块
MUmodule module;
muModuleLoad(&module, "kernel.ptx");
// 从 fatbinary 加载模块
muModuleLoad(&module, "kernel.fatbin");
// 从数据加载模块
void* moduleData = ...;
muModuleLoadData(&module, moduleData);
// 卸载模块
muModuleUnload(module);
获取内核函数
// 从模块中获取内核函数
MUfunction kernelFunc;
muModuleGetFunction(&kernelFunc, module, "vectorAdd");
// 获取内核参数大小
int paramSize;
muFuncGetParamSize(kernelFunc, ¶mSize);
// 设置内核参数
muParamSeti(kernelFunc, 0, n);
muParamSetd(kernelFunc, sizeof(int), d_a);
muParamSetd(kernelFunc, sizeof(int) * 2, d_b);
muParamSetd(kernelFunc, sizeof(int) * 3, d_c);
启动内核
// 设置块大小
muParamSetSize(kernelFunc, blockSize);
// 启动内核
muLaunchKernel(kernelFunc, 1, 1, 1, gridSize, 1, 1, 0, stream);
// 或使用简化 API
muLaunchKernelByPtr(kernelFunc, gridSize, blockSize, 0, stream);