【问题标题】:Kernel mode GPGPU usage内核模式 GPGPU 使用情况
【发布时间】:2014-03-18 03:03:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: cuda linux-kernel opencl gpgpu


    【解决方案1】:

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

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

    通过简单的内核模块接口工作的用户空间助手应用程序是您能做的最好的事情。

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

    【讨论】:

    • 更深入地了解这一点,使用 OpenCL 您只能轻松生成 ptx 文件(必须将其编译到最终的 GPU 架构中),但使用 CUDA 在生成 cubin 或 fatbin 时您可以选择编译器以哪个架构为目标(生成必须经过处理的代码的虚拟架构或真正的“金属”架构)。也许有一种“简单”的方式可以将一个cubin发送给司机......
    • @Jaka:大约需要 10 种不同的 CUDA 驱动程序 API 调用才能将代码从 cubin 获取到可以启动内核的状态。如果您在驱动程序 API 应用程序上运行 strace,那么这 10 个 API 调用的初始化阶段可能会执行 50 个用户空间系统调用。容易是一个非常主观的术语,但我不会选择它......
    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多