一、并行执行规模
CUDA关于并行执行具有分层结构。每次内核启动时可以被切分成多个并行执行的块,而每个块又可以进一步地被切分成多个线程。这种并行执行的副本可以通过两种方式完成:一种是启动多个并行的块,每个块具有1个线程;另一种是启动1个块,每个块里具有多个线程。
通过共享内存1个块中的线程可以相互通信。所以启动1个具有多个线程的块让里面的线程能够相互通信是一个优势。更加理想的则是,我们并不单独启动1个块,里面多个线程;也不启动多个块,每个里面1个线程。我们一次并行启动多个块,每个块里面多个线程(最多可以是maxThread-PerBlock的数量)。
所以,假设上一章的那个向量加法例子你需要启动N=50000这么多的线程,我们可以这样调用内核:
gpuAdd << <((N+511)/512), 512 >> > (d_a, d_b, d_c);
这个N最大可以是多少? 从计算能力3.0(目前CUDA能支持的最低计算能力)开始该x方向上的块数量就已经被放开了。因为考虑N过大而不能直接计算块数量的做法已经不需要考虑了。因为当前的限制是如此巨大,在2的31次方减1的块数量和每个块中1024的线程数量,只有非常巨大的N才能超出限制,大约在万亿级别的a,b,c中的元素数量才有可