我编写了一个简单的CUDA内核来对大小为2^18的两个列向量执行SAXPY。
我发现我的图形处理器,一个特斯拉C2070,可以运行每个块最多1024个线程。
然而,我发现运行块大小为X= 512和X= 128的内核比运行块大小为X= 1024的内核快。
为什么会这样呢?如果我的块大小小于1024,我不是在浪费线程吗?
发布于 2012-10-28 06:41:03
像SAXPY这样的1级BLAS函数是内存带宽有限的。操作
y <- alpha * x + y
仅执行单个FMAD,但需要从全局内存进行两次加载和一次存储。您的C2070拥有大约37.5Gfloat/s的全局内存带宽和500GFMAD/s的单精度算术吞吐量。因此,性能是由内存控制器决定的,而不是ALU。通常,在内存带宽有限的内核中减少每个块的线程数可以提高性能,因为它减少了对内存、控制器和缓存资源的争用,并提高了带宽利用率。
这可能就是您的SAXPY内核正在发生的事情。你应该能够通过基准测试找到最优的块大小,但我的经验是,在像你的C2070这样的费米设备上,它将是每个块128-384个线程。
发布于 2012-10-28 13:32:59
对于使用共享内存缓存读/写/数据共享的代码,较小的块大小可能会导致每个线程使用较大的共享内存块,这反过来会增加良好内存访问模式(更多合并)的机会。
我同意talonmies的观点,根据我的经验,每个块128-192个线程几乎总是能为我的代码带来最好的性能,即使可以启动更多的线程。
https://stackoverflow.com/questions/13106801
复制相似问题