Cuda 为什么使用少于max的线程会使内核运行得更快?

Cuda 为什么使用少于max的线程会使内核运行得更快?,cuda,Cuda,我编写了一个简单的CUDA内核,在大小为2^18的两个列向量上执行SAXPY 我发现我的GPU,特斯拉C2070,每个块最多可以运行1024个线程。因此,我将块大小设为X=1024,Y=1,Z=1。我还制作了网格大小X=2^18/1024,Y=1,Z=1。我这样做是因为我想确保每个块的每个线程都被使用 但是,我发现运行块大小为X=512和X=128的内核总是比运行块大小为X=1024的内核更快 为什么呢?如果我的块大小小于1024,我不是在浪费线程吗?像SAXPY这样的级别1 BLAS函数是内存

我编写了一个简单的CUDA内核,在大小为2^18的两个列向量上执行SAXPY

我发现我的GPU,特斯拉C2070,每个块最多可以运行1024个线程。因此,我将块大小设为X=1024,Y=1,Z=1。我还制作了网格大小X=2^18/1024,Y=1,Z=1。我这样做是因为我想确保每个块的每个线程都被使用

但是,我发现运行块大小为X=512和X=128的内核总是比运行块大小为X=1024的内核更快


为什么呢?如果我的块大小小于1024,我不是在浪费线程吗?

像SAXPY这样的级别1 BLAS函数是内存带宽有限的。手术

y <- alpha * x + y

y对于使用共享内存缓存读/写/数据共享的代码,较小的块大小可能会导致每个线程使用更大的共享内存块,这反过来又增加了良好内存访问模式的可能性(更多合并)

我同意Talonmes的观点,根据我的经验,每个块128-192个线程几乎总能使我的代码获得最佳性能,即使有可能启动更多线程