说起通用计算、并行计算、加速计算,NVIDIA CUDA无疑是很多开发人员的首选。虽然还有开放的OpenCL,但在开发环境方面还不够,CUDA则在经过大力推广后拥有了不错的群众基础。GeForce GTX 600时代虽然这方面的宣传似乎少了很多,开普勒架构的浮点性能看起来也不强,但其实在并行计算方面仍然有很多进步的,其中蕴藏着不少能量,比如费米架构首创性地加入了和处理器一样的统一读写二级缓存,GK104核心更把底层的SMX进行了变革。
今天就有一位技术宅程序猿同学,利用一块GeForce GTX 680 4GB,展示了如何在开普勒上取得百万级别的线程代码。看不懂不要紧,内行看门道,外行看热闹。
据说,技术宅的厕纸用完了之后就会用书本。
技术宅受到刺激后,迷上了超大规模程序设计,那个叫什么CUDA神秘兮兮的东西。
平台艳照。
CUDA的环境配置:首先安装CUDA工具箱,然后安装显卡驱动,最后安装CUDA SDK。前两步必不可少,第三步可以省略。
G80、GT200的SM架构差异,导致了CUDA程序上的不同优化。 老架构就不花时间去讨论了,直奔在通用计算大放异彩的费米架构,革命性的统一读写一级、二级缓存有些模仿CPU设计的味道。下面结合硬件来说说CUDA如何根据它来优化。
费米的SM拥有3万个高速寄存器,保证了线程的快速切换,要知道八核心CPU也不过几百个而已。16路高速存储通道来并行操作64KB的片上高速缓存,速度可达到1TB/s级别。
开普勒再度加强,在晶体管数量控制在35.4亿个的情况下竟然塞进了比费米多一倍的CUDA核心,寄存器也翻番达到6.5万个,存储通道也多了一倍。
要让CUDA程序为开普勒架构优化,首要任务是让Block里面的线程尽量的多。GT200 SM允许的活动线程是1024个,费米优化的代码可以增加到1536个,开普勒则进一步提高到2048个(注:GK110核心也会如此)。
这个是软件层次对应的硬件层次。Block编程上的线程块在SM里分时运行,一个CUDA程序会有多个blcok并行运行,而每个block线程块又包含了数十到上百的线程,也就构成了CUDA。
不同架构对应不同的计算规格,代码优化也要针对性地进行,比如开普勒可以支持更大的block内部线程,可以让更多线程进行片上同步工作,另外费米和开普勒有DRAM缓存,所以对DRAM优化的力度没有G80那么吃力。
开普勒在CUDA上加入了更大的革新,特别是支持多内核函数的并行执行。注意,一个CUDA内核就是一个可具备百万线程的并行程序,而这些内核函数更可以并行执行。
开普勒在内核函数执行引擎上比费米有了大幅度的加强。
从CUDA的发展角度看,NVIDIA一共经历了四代架构更新,而唯一不变的是warp硬件指令的宽度。(这里和AMD的稍微不同,后者硬件指令宽度是64)。