上图表示了CUDA程序调用中间API的层次结构和所处设备情况。
CUDA的接口分三个层次: CUDA Library, CUDA Runtime 和CUDA Driver. 而我们的程序可以在任意一个层次上调用CUDA.层次最高的Library自不必多言,诸如cudnn等。
CUDA Driver 与 CUDA Runtime 相比更偏底层,就意味着 Driver API 有着更灵活的控制,也伴随着更复杂的编程。我们平时常用的 nvidia-smi 调用的是 Driver API。最开始 Driver API 是与显卡沟通的底层 API,但是人们发现 Driver API 太过底层,由此引入了 Runtime API。Runtime是建立在Driver上的, 它里面的接口实际都可以拆解为Driver的接口。两者之间并没有显著的性能差异, 但接口相互排斥,不能同时调用。 相比之下,Runtime抽象层次更高,更容易编写。因此可以由Runtime实现的功能, 推荐使用Runtime进行编写。CUDA driver相比runtime需要做显式的device初始化, 以及context、module的管理, 这些概念在runtime中是不存在, 也是不希望用户关心的。
接口 | 封装层次 | 常用API | include和lib |
---|---|---|---|
CUDA Driver | 更底层 | cu+:cuMemAlloc、cuMemset… | cuda.h\libcuda.so |
CUDA Runtime | 更高级 | cuda+:cudaMalloc、cudaMemset… | cuda_runtime.h/ libcudart.so |