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