GPU编程范式

gpu加速计算遵循异构编程模型。软件应用程序的高度并行部分被映射到在物理独立的GPU设备上执行的内核中,而其余的顺序代码仍然在CPU上运行。每个内核被分配几个worker或线程,它们被组织成块和网格。内核中的每个线程相对于其他线程并发执行。

GPU Coder™的目标是采用顺序的MATLAB®程序和生成分区,优化CUDA®代码。这个过程包括:

  • CPU/GPU分区-识别运行在CPU上的代码段和运行在GPU上的代码段。对于GPU编码器识别CUDA内核的不同方式,参见内核创建。在内核创建算法中,CPU和GPU之间的内存传输开销是一个重要的考虑因素。

  • 内核分区完成后,GPU编码器分析CPU和GPU分区之间的数据依赖性。在CPU和GPU之间共享的数据被分配到GPU内存(通过使用cudaMalloccudaMallocManagedapi)。分析也决定了最小的位置集的数据必须在CPU和GPU之间复制使用cudaMemcpy。如果在CUDA中使用统一内存,那么同样的分析通过也确定了最小的位置在代码中cudaDeviceSync必须插入调用以获得正确的函数行为。

  • 接下来,在每个内核,GPU编码器可以选择映射数据到共享内存或常量内存。如果明智地使用,这些内存是GPU内存层次结构的一部分,可以潜在地导致更大的内存带宽。有关GPU编码器如何选择映射到共享内存的信息,请参阅模板处理。有关GPU编码器如何选择映射到常量内存的信息,请参见coder.gpu.constantMemory

  • 一旦分区和内存分配和转移语句到位,GPU编码器生成CUDA代码,遵循分区和内存分配的决定。生成的源代码可以编译成从MATLAB中调用的MEX目标,也可以编译成与外部项目集成的共享库。对于GPU编码器选项,请参阅GPU编码器配置属性