Cuda 内核模式GPGPU的使用

Cuda 内核模式GPGPU的使用,cuda,linux-kernel,opencl,gpgpu,Cuda,Linux Kernel,Opencl,Gpgpu,可以从Linux内核模块运行CUDA或OpenCL应用程序吗? 我发现了一个提供此功能的项目,但它需要一个用户空间助手来运行CUDA程序。() 虽然这个项目已经避免了用户和内核空间之间的冗余内存复制,但我想知道是否有可能完全避免用户空间 编辑: 让我扩大我的问题。我知道内核组件只能调用内核和其他内核组件提供的API。所以我不打算直接调用OpenCL或CUDAAPI。 CUDA或OpenCLAPI最终必须调用图形驱动程序才能实现其神奇的效果。最有可能的是,这个界面是完全非标准的,随着每个版本的变化

可以从Linux内核模块运行CUDA或OpenCL应用程序吗? 我发现了一个提供此功能的项目,但它需要一个用户空间助手来运行CUDA程序。()

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

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

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


我也知道,用户空间助手可能是最好的选择,因为直接调用驱动程序很可能会因为新的驱动程序版本而崩溃…

简单的回答是,不,你不能这样做

无法从内核空间调用任何依赖glibc的代码。这意味着无法从内核空间调用CUDA或OpenCLAPI,因为这些库依赖于glibc和大量其他用户空间助手库以及在内核空间中不可用的用户空间系统API。CUDA和OpenCL在这方面并不是独一无二的——例如,这就是为什么整个X11都在用户空间中运行的原因

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

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

更深入地了解这一点,使用OpenCL,您只能轻松生成ptx文件(必须与最终的GPU体系结构同步),但是使用CUDA,在生成目标体系结构的cubin或fatbin时,您可以使用编译器选项(生成必须是JITT的代码的虚拟体系结构或真正的“金属”体系结构)。也许有一种“简单”的方法可以将cubin发送给驱动程序…@Jaka:要将代码从cubin发送到内核可以启动的状态,大约需要10个不同的CUDA驱动程序API调用。如果在驱动程序API应用程序上运行strace,那么这10个API调用的初始化阶段可能会执行50个用户空间系统调用。简单是一个非常主观的术语,但我不会选择它。。。。