内核模式GPGPU用法

Jak*_*aka 3 cuda gpgpu opencl linux-kernel

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

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

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

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

我也知道用户空间助手可能是这样做的最佳选择,因为直接调用驱动程序很可能会被新的驱动程序版本破坏...

tal*_*ies 5

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

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

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

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

  • @Jaka:从Cubin到可以启动内核的状态,需要大约10种不同的CUDA驱动程序API调用.如果在驱动程序API应用程序上运行strace,那么这10个API调用的初始化阶段可能会执行*50*用户空间系统调用.容易是一个非常主观的术语,但它不是我会选择的...... (2认同)