由于CPU与GPU的硬件结构差别,所以其适用方向亦有不同。
CPU中控制单元占比大,所以适用于低并行逻辑复杂的程序。
GPU中计算单元占比大,所以适用于高并行逻辑简单的大数据计算。
CPU主机端代码 + GPU设备端代码
CUDA nvcc编译器会自动分离代码里面的不同部分,主机代码用C完成,则使用本地的C语言编译器编译,设备代码(kernel)用CUDA C完成,通过nvcc编译,在内核程序调用或GPU设备操作时,添加运行时库。
限定符 | 执行 | 调用 | 备注 |
---|---|---|---|
global | 设备端执行 | 可以从主机调用也可以从计算能力3以上的设备调用 | 必须有一个void的返回类型 |
device | 设备端执行 | 设备端调用 | |
host | 主机端执行 | 主机调用 | 可以省略 |
CPU与GPU执行程序是异步的,核函数调用后会立刻到主机线程继续,而不管GPU端核函数是否执行完成,CUDA提供显示分方法,即在核函数后加入cudaDeviceSynchronize()函数,CPU会等待GPU执行完成,再进行CPU后续步骤。
对应的也有隐式方法,比如内存拷贝函数cudaMemcpy()。
下一篇:多模态预训练模型综述