2014-02-18 23 views
2

是否可以从Linux内核模块运行CUDA或OpenCL应用程序? 我发现了一个提供此功能的项目,但它需要一个用户空间帮助程序才能运行CUDA程序。 (https://code.google.com/p/kgpu/内核模式GPGPU使用情况

虽然这个项目已经避免了用户和内核空间之间的冗余存储器复制,但我想知道是否有可能完全避免用户空间?

编辑: 让我扩大我的问题。我知道内核组件只能调用内核和其他内核组件提供的API。所以我不打算直接调用OpenCL或CUDA API。 CUDA或OpenCL API最终必须调用图形驱动程序才能使其发生奇迹。很可能这个接口是完全非标准的,随着每个版本的变化而变化,等等......

但是假设你有一个编译好的OpenCL或CUDA内核,你想运行。 OpenCL/CUDA用户空间库在实际运行内核之前是否做了一些繁重的工作,或者它们只是驱动程序接口的轻量级包装?

我也知道,用户空间助手可能是因为用于调用驱动程序直接将最有可能得到一个新的驱动程序版本打破这样做是最好的选择...

回答

5

简短的回答是,没有你不要这样做。

没有办法调用任何代码,它依赖于内核空间中的glibc。这意味着无法从内核空间进行CUDA或OpenCL API调用,因为这些库依赖于glibc和一系列其他用户空间帮助程序库和用户空间系统API,这些API在内核空间中不可用。 CUDA和OpenCL在这方面并不是唯一的 - 例如,这就是为什么整个X11都在用户空间运行的原因。

通过简单的内核模块接口工作的用户空间帮助程序应用程序是最好的。

[编辑] OpenCL的运行时组件并不是轻量级的包装,而是围绕着几个系统调用来将代码有效载荷推送到设备上。除此之外,它们还包括一个完整的即时编译工具链(实际上这是OpenCL直到最近才支持的所有内容),内部ELF代码和对象管理以及其他一些东西。在运行时可以从驱动程序中模拟接口和功能的可能性非常小。

+0

通过OpenCL,您可以轻松地生成ptx文件(必须将其拼接到最终的GPU架构),但使用CUDA时,您可以在生成Cubin或fatbin时使用编译器选项,要么是产生必须被激发的代码的虚拟架构,要么是真正的“金属”架构)。也许有一种“简单”的方式发送一个cubin到驱动程序...... – Jaka

+2

@Jaka:大约有10个不同的CUDA驱动程序API调用需要从一个Cubin获取代码到一个可以启动内核的状态。如果您在驱动程序API应用程序上运行strace,那么这10个API调用的初始化阶段可能会执行* 50 *个用户空间系统调用。简单是一个非常主观的术语,但它不是我会选择.... – talonmies