内核模式下的GPGPU使用

3
有没有可能从Linux内核模块运行CUDA或OpenCL应用程序? 我发现一个项目提供了这个功能,但它需要一个用户空间助手才能运行CUDA程序。(https://code.google.com/p/kgpu/
虽然这个项目已经避免了用户和内核空间之间的冗余内存复制,但我想知道是否有可能完全避免用户空间?
编辑: 让我扩展一下我的问题。我知道内核组件只能调用内核和其他内核组件提供的API。所以我不打算直接调用OpenCL或CUDA API。 最终,CUDA或OpenCL API必须调用图形驱动程序才能实现其魔力。很可能,这个接口是完全非标准的,每次发布都会改变等等…
但是假设你有一个已编译好的OpenCL或CUDA内核需要运行。在实际运行内核之前,OpenCL/CUDA用户空间库是否需要进行一些重要工作,还是它们只是驱动程序接口的轻量级包装器?
我也知道用户空间助手可能是做到这一点的最佳选择,因为直接调用驱动程序很可能会在新的驱动程序发布时出现错误…
1个回答

5
简短的回答是不行。
无法从内核空间调用依赖于glibc的任何代码。这意味着没有办法从内核空间进行CUDA或OpenCL API调用,因为这些库依赖于glibc和许多其他用户空间辅助库以及不在内核空间中可用的用户空间系统API。在这方面,CUDA和OpenCL并不独特,这也是整个X11在用户空间运行的原因,例如。
通过简单的内核模块接口工作的用户空间辅助应用程序是你所能做到的最好的选择。
[编辑] OpenCL的运行时组件不是轻量级的封装器,用于推送代码有效负载到设备上的一些系统调用。除其他事项外,其中包括完整的即时编译工具链(实际上直到最近OpenCL支持的就是这种方式),内部ELF代码和对象管理以及一堆其他东西。几乎没有可能在驱动程序内部模拟接口和功能。

深入研究后发现,使用OpenCL只能轻松生成ptx文件(必须将其转换为最终GPU架构),但是使用CUDA时,在生成cubin或fatbin时有编译器选项可以选择目标架构(虚拟架构会产生必须被转换的代码或真正的“金属”架构)。也许有一种“简单”的方法可以将cubin发送到驱动程序... - Jaka
2
@Jaka:大约需要10个不同的CUDA驱动程序API调用才能将代码从cubin转换为可以启动内核的状态。如果在驱动程序API应用程序上运行strace,则这些10个API调用的初始化阶段执行了大约50个用户空间系统调用。易用性是一个非常主观的术语,但这不是我会选择的一个词.... - talonmies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接