CPU和GPU之间的指令传输

时间:2012-02-16 09:26:01

标签: gpu gpgpu data-transfer gpu-programming

我正在寻找有关CPU在使用GPGPU计算时如何将程序代码移动到GPU的相关信息。 Internet上有大量关于数据传输的手册,但与指令/程序加载无关。

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

1 个答案:

答案 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阶段的设备上。