CUDA软硬件的基本理解
1、软件层
CUDA从软件层分为流、线程格、线程块、线程。在一次Kernel调用时,需要指定一个grid下划分的block的布局和数量,以及一个block下thread的布局和数量。
cuda stream(流)对应一个任务,存储了一个执行序列,如内存数据交换、执行kernel函数、内存数据交换。如果是多任务(不同kernel函数),则可以使用cuda stream,每个流携带一个kernel函数。(仿佛能并行???)
2、硬件层
GPU由多个SM组成,每个SM下包含 多个SP(执行单元)、共享内存、指令单元等。每个SM以block为单位执行任务(每个SM分配一个block),故block个数最好为SM的倍数,所以block下的线程可以通过共享内存进行通信,block之间无法通过shared memory通信。
GPU应该是划分为一个内存拷贝引擎和一个kernel执行引擎,所以使用cuda stream可以在一定程度上并行。
注:关于不同的kernel函数能否同时并行执行,好像是不行,但是为啥每个SM都有指令单元,那SM之间为啥不能执行不同的kernel并行呢???