Chinese, Simplified subtitles

← 为什么使用CUB

Get Embed Code
2 Languages

Showing Revision 2 created 05/23/2013 by Lian7.

  1. 现在让我集中讲解编写高性能内核代码的一个具体方面。
  2. 在较高水平,GPU 编程看起来像这样。
  3. 有一堆位于全局内存中的数据
  4. 你想在该数据上运行一种算法。
  5. 该算法将被在SM上运行的线程执行,
  6. 由于各种原因,您可能希望通过共享内存处理数据。
  7. 你自己已经看到,将全局内存加载或存储到共享内存
  8. 或到线程的局部变量,
  9. 可以是复杂的如果你正在努力获得非常高的性能。
  10. 想想在习题集 2中,
  11. 你把一个图像图块加载到共享内存中,
  12. 而且还得加载图像图块周围的额外单元格的光晕,
  13. 以便解释模糊的宽度,
  14. 这会很棘手,因为那些想对该图块中的像素
  15. 进行计算的线程的数量
  16. 本质上是一个不同的数字,相比于你将启动的线程数,
  17. 如果你的目标只是要加载图块中的像素
  18. 以及图块外部的像素。
  19. 或者想想第五单元中的图块转置示例,
  20. 我们通过共享内存进行,
    以便特别注意合并全局内存。
  21. 想想我们有关利特尔法则的讨论,
  22. 以及我们讨论过的在延迟
  23. 带宽、占用率、线程数、
  24. 和每个线程事务大小之间的平衡。
  25. 还记得我们看过一张有点像这样的图,
  26. 在我们增加线程数的时候,我们实现的带宽越高,
  27. 如果我们能够在单个负载访问 4个浮点值,
  28. 而不是在单个负载访问2个浮点值,
  29. 或在单个负载访问单个浮点值。
  30. 最后,还有我们没在这个课程中谈及的忍者级别的优化,
  31. 像使用固有的Kepler LDG 。
  32. 简而言之, CUDA 对用户管理的共享内存的显式使用
  33. 使可预测的高性能成为可能。
  34. 相比之下,你在CPU上发现的硬件管理的高速缓存
  35. 会导致不可预测的性能,
  36. 尤其是当你有很多个线程共享相同的缓存,
    它们将相互干扰。
  37. 所以这是一个显式共享内存的优势,
  38. 但这种优势以增加程序员的额外负担为代价,
  39. 程序员必须明确地管理数据进出全局内存。
  40. 这是CUB出现的重要部分。
  41. CUB 在算法和其内存访问模式中放置一个抽象,
  42. 不透明地将数据从全局内存
  43. 可能通过共享内存,移动到线程的实际局部变量。
  44. 我想提一下另一个编程强力工具,叫做Cuda DMA,
  45. 它具体针对从全局内存到共享内存的数据移动。