cuda并行编程的思考

高内聚,低耦合。内聚指的是单个类内部成员间的关系,例如某个类是否只有自己需要知道的最少量信息,而没有冗余信息。耦合指的是多个类之间的关系,例如多个类之间是否有错综复杂的依赖/继承关系。

使用cuda编程的时候,要尽量以cuda抽象的方式进行思考,尤其是从cuda block的角度进行问题划分。由于cuda block共享可编程的L1 cache(block内的共享内存),因此如果问题能分治到各个block内处理,借助块内共享内存,效率会高很多。

从结果而言,首先需要从problem space对整个问题进行分块,分配的结果可以视为physical block。接下来,需要为每个physical block分配对应的cuda block,即logical block。physical block和logical block的大小可能不相同。最后,利用logical block的并行处理能力去处理physical block的数据,从而解决问题。

一些tips

  • GPU的计算尽可能减少global memory的使用,而使用shared memory
  • 通用方法: 将问题分块,cuda block内部线程协作处理各个问题块
  • 小心,即使是用于存储float4*数组的float*数组也要对地址强制类型转换为float4*后赋值!,如果用float依次赋值则会增加内存访问次数。