本节书摘来自华章计算机《CUDA C编程权威指南》一书中的第3章,第3.8节,作者 [美] 马克斯·格罗斯曼(Max Grossman),译 颜成钢 殷建 李亮,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.8 习题
1.当在CUDA中展开循环、数据块或线程束时,可以提高性能的两个主要原因是什么?解释每种展开是如何提升指令吞吐量的。
2.参考核函数reduceUnrolling8和实现核函数reduceUnrolling16,在这个函数中每个线程处理16个数据块。将该函数的性能与reduceUnrolling8内核性能进行比较,通过nvprof使用合适的指标与事件来解释性能差异。
3.参考核函数reduceUnrolling8,替换以下的代码段:
比较每次的性能并解释使用nvprof指标的差异。
4.参考核函数reduceCompleteUnrollWarps8。不要将vmem声明为volatile修饰符,而是使用__syncthreads。注意__syncthreads必须被线程块里的所有线程调用。比较两个核函数的性能并使用nvprof来解释所有的差异。
5.用C语言实现浮点数s的求和归约。
6.参考核函数reduceInterleaved和reduceCompleteUnrollWarps8,实现每个浮点数s的版本。比较它们的性能,选择合适的指标与/或事件来解释所有差异。它们相比于操作整数数据类型有什么不同吗?
7.被动态地产生孩子的全局数据进行更改,这种改变什么时候能保证对其父亲可见?
8.参考文件nestedHelloWorld.cu,用图3-30所示的方法实现一个新的核函数。
9.参考文件nestedHelloWorld.cu,实现一个新的核函数,使其可以用给定深度来限制嵌套层。