是否可以从Linux内核模块运行CUDA或OpenCL应用程序? 我找到了一个提供此功能的项目,但它需要一个用户空间助手才能运行CUDA程序。 (https://code.google.com/p/kgpu/)
虽然这个项目已经避免了用户和内核空间之间的冗余内存复制,但我想知道是否可以完全避免用户空间?
修改 让我扩展我的问题。我知道内核组件只能调用内核和其他内核组件提供的API。所以我不打算直接调用OpenCL或CUDA API。 CUDA或OpenCL API最终必须调用图形驱动程序以使其发生魔力。很可能这个界面完全是非标准的,随着每个版本的变化等等......
但是假设您有一个要运行的已编译的OpenCL或CUDA内核。在实际运行内核之前,OpenCL / CUDA用户空间库是否做了一些繁重的工作?或者它们只是驱动程序接口周围的轻量级包装器吗?
我也知道用户空间助手可能是这样做的最佳选择,因为直接调用驱动程序很可能会因新的驱动程序版本而被破坏...
答案 0 :(得分:5)
简短的回答是,不,你不能这样做。
没有办法调用依赖于内核空间glibc的任何代码。这意味着无法从内核空间进行CUDA或OpenCL API调用,因为这些库依赖于glibc以及内核空间中不可用的许多其他用户空间助手库和用户空间系统API。 CUDA和OpenCL在这方面并不是唯一的 - 例如,这就是整个X11在用户空间中运行的原因。
通过简单的内核模块接口工作的用户空间帮助应用程序是您可以做的最好的。
[编辑] OpenCL的运行时组件不是围绕一些系统调用的轻量级包装器,以将代码有效负载推送到设备上。除此之外,它们还包括一个完整的及时编译工具链(实际上这是OpenCL迄今为止所支持的所有工具),内部ELF代码和对象管理以及其他一些东西。您无法在运行时从驱动程序中模拟接口和功能。