我正在寻找有关CPU在使用GPGPU计算时如何将程序代码移动到GPU的相关信息。 Internet上有大量关于数据传输的手册,但与指令/程序加载无关。
问题是:程序由CPU处理,CPU在每个计算单元上用足够的标志“配置”GPU以执行给定的操作。之后,数据被传输和处理。第一次操作是如何完成的?如何向GPU发出指令?这些指令是否以某种方式利用总线带宽?我可能忽略了一些基本的东西,所以欢迎任何其他信息。
答案 0 :(得分:3)
确实没有太多关于它的信息,但你高估了它的效果。
整个内核代码只加载到GPU上一次(最糟糕的是每次内核调用一次,但看起来它实际上是每个应用程序运行一次,见下文),然后完全执行GPU没有任何来自CPU的干预。因此,在内核调用之前,将整个内核代码复制到某个块中。为了估计代码大小,我们自制的MD软件包(52个内核,其中一些是> 150行代码)的所有GPU代码的.cubin
大小仅为91 KiB,因此可以安全地假设几乎所有情况下代码传输时间都可以忽略不计。
以下是我在官方文档中找到的信息:
在CUDA Driver API中,代码在您调用cuModuleLoad
函数
CUDA驱动程序API不会尝试延迟分配资源 模块所需;如果内存为功能和数据 模块所需的(常量和全局)无法分配, cuModuleLoad()失败
理论上,你可能必须卸载模块然后重新加载它,如果你有几个模块使用太多的常量(或静态分配的全局)内存同时加载,但它很少见,你通常会调用{ {1}}每次应用程序启动时,仅在创建上下文后立即执行。
CUDA Runtime API没有提供控制模块加载/卸载的任何措施,但看起来在初始化期间所有必要的代码都被加载到设备上。
OpenCL Specs并不像CUDA Driver API那样具体,但代码可能(涉及疯狂猜测)被复制到cuModuleLoad
阶段的设备上。