我正在寻找有关在使用 GPGPU 计算时 CPU 如何将程序代码移动到 GPU 的信息。互联网上有很多关于数据传输的手册,但没有关于指令/程序加载的手册。
问题是:程序由 CPU 处理,它在每个计算单元上用足够的标志“配置”GPU 以执行给定的操作。之后,数据被传输和处理。第一个操作是怎么做的?如何向 GPU 发出指令?指令是否以某种方式分组以利用总线带宽?我可能忽略了一些基本的东西,所以欢迎提供任何额外的信息。
最佳答案
关于它的信息确实不多,但你高估了效果。
整个内核代码只加载到 GPU 一次(最坏的情况是每次内核调用一次,但看起来它实际上是每次应用程序运行一次,见下文),然后在 GPU 上完全执行,没有任何来自 CPU 的干预。因此,在内核调用之前,整个内核代码被复制到一个块中。为了估计代码大小,我们自制的 MD 包(52 个内核,其中一些超过 150 行代码)的所有 GPU 代码的 .cubin
大小仅为 91 KiB,因此可以安全地假设几乎在所有情况下代码传输时间可以忽略不计。
以下是我在官方文档中找到的信息:
在 CUDA Driver API 中,代码在您调用 cuModuleLoad
函数时加载到设备上
从理论上讲,如果您有几个模块使用太多常量(或静态分配的全局)内存要同时加载,则您可能必须卸载模块然后再次加载它,但这种情况很少见,并且您通常每次只调用一次 cuModuleLoad
应用程序启动,在上下文创建之后。
CUDA Runtime API 不提供任何控制模块加载/卸载的措施,但看起来所有必要的代码都在初始化期间加载到设备上。
OpenCL Specs 不像 CUDA 驱动程序 API 那样具体,但代码很可能(涉及疯狂猜测)复制到 clBuildProgram
阶段的设备。
关于gpgpu - CPU和GPU之间的指令传输,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9308562/