【问题标题】:Instruction transfer between CPU and GPUCPU和GPU之间的指令传输
【发布时间】:2012-03-07 16:34:34
【问题描述】:

我正在寻找有关在使用 GPGPU 计算时 CPU 如何将程序代码移动到 GPU 的信息。互联网上有很多关于数据传输的手册,但没有关于指令/程序加载的手册。

问题是:程序由 CPU 处理,它在每个计算单元上使用适当的标志“配置”GPU 以执行给定的操作。之后,数据被传输和处理。第一次手术是怎么做的?如何向 GPU 发出指令?指令是否以某种方式分组以利用总线带宽?我可能忽略了一些基本的东西,所以欢迎提供任何其他信息。

【问题讨论】:

    标签: gpgpu data-transfer gpu


    【解决方案1】:

    关于它的信息确实不多,但是你高估了效果。

    整个内核代码只加载到 GPU 上一次(最坏的情况是每次内核调用一次,但看起来它实际上是每次应用程序运行一次,见下文),然后在 GPU 上完全执行GPU 无需 CPU 的任何干预。因此,整个内核代码在内核调用之前被复制到某个地方的一个块中。为了估计代码大小,我们自制 MD 包(52 个内核,其中一些超过 150 行代码)的所有 GPU 代码的.cubin 大小只有 91 KiB,因此可以安全地假设几乎所有代码传输时间可以忽略不计的情况。

    这是我在官方文档中找到的信息:

    CUDA Driver API 中,代码在您调用cuModuleLoad 函数时加载到设备上

    CUDA 驱动程序 API 不会尝试延迟分配资源 模块需要;如果函数和数据的内存 无法分配模块所需的(常量和全局), cuModuleLoad() 失败

    理论上,如果您有几个模块使用太多常量(或静态分配的全局)内存来同时加载,您可能必须卸载模块然后再次加载它,但这并不常见,您通常调用@ 987654328@ 每次应用程序启动仅一次,就在上下文创建之后。

    CUDA Runtime API 没有提供任何控制模块加载/卸载的措施,但看起来所有必要的代码在设备初始化期间都已加载到设备上。

    OpenCL Specs 没有 CUDA Driver API 那样具体,但代码很可能(涉及猜测)复制到clBuildProgram 阶段的设备。

    【讨论】:

    • 我对事情的完成方式感兴趣,不一定对性能感兴趣。特别是 GPU 如何处理每个内核中的循环/if-else。
    • @amnl 分支在CUDA C Programming guide 的第 4.1 节中进行了介绍,并且对于 AMD 的 GPU 基本相同(没有证明链接,抱歉):“warp [32 个连续线程] 在time.... 如果 warp 的线程通过依赖于数据的条件分支发散,则 warp 会串行执行所采用的每个分支路径,禁用不在该路径上的线程,并且当所有路径完成时,线程会收敛回相同的执行路径。”
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2013-09-27
    • 2016-12-09
    • 2012-07-07
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多