Return to Video

cs344_unit5_17_l_转置代码测量内存使用量

  • 0:00 - 0:04
    所以,如果我们回顾一下针对所有这些内核的分析,
    我们就会看到
  • 0:04 - 0:08
    我们的并行每个元素代码的版本将达到每秒12.5 千兆字节。
  • 0:08 - 0:13
    我们的并行每行代码的版本将获取约每秒1.8 千兆字节,
  • 0:13 - 0:19
    而我们的串行代码版本获得令人失望的每秒0.018 千兆字节。
  • 0:19 - 0:24
    这大约是信鸽的速度。或许,这是思考这个问题更好的方式,
  • 0:24 - 0:31
    不在于绝对数字,而是作为我们使用的特定 GPU 能够实现多少百分比。
  • 0:31 - 0:34
    所以,我们正在努力要实现的百分比是否可行,
  • 0:34 - 0:39
    它有点像我们在最大限度执行内核时31 %理论峰值带宽,
  • 0:39 - 0:47
    在我们的每行内核时4.5%的理论峰值带宽,以及我们的串行内核时0.1%d的理论峰值带宽。
  • 0:47 - 0:50
    所以,回到问题。为什么这个数字这么低?
  • 0:50 - 0:57
    嗯,我们可以做一个聪明的猜测,每当你看到真正的低 DRAM 利用率,
  • 0:57 - 1:00
    非常低的百分比带宽,你第一次的猜测始终会纠结在一起。
  • 1:00 - 1:05
    理解合并的一种方法是 GPU 始终访问全局内存,
  • 1:05 - 1:11
    在 DRAM存取很大块数据, 一次 32 个或 128 个字节。
  • 1:11 - 1:14
    这意味着我们需要最少
  • 1:14 - 1:21
    的总内存交换,当在变形中的线程存取连接相邻内存位置时。
  • 1:21 - 1:24
    所以,这是一个好的合并示例。
  • 1:24 - 1:27
    每个线程在读或写一个相邻的内存位置。
  • 1:27 - 1:33
    而且很清楚,如果一种变形中的线程在读取或写入完全的随机地址和内存,
  • 1:33 - 1:36
    然后你会得到较差的合并,对吗?
  • 1:36 - 1:41
    所以,如果这些访问散布在内存,
  • 1:41 - 1:48
    然后我们要读取的内存块总数可能和变形中的线程数一样多。
  • 1:48 - 1:52
    所以,一个随机访问模式显然会导致一个较差的合并。
  • 1:52 - 1:57
    所以,更为常见的访问模式被称为跨步,而这是线程访问
  • 1:57 - 2:03
    本地内存,即它们的线程标识乘以一些步长函数。
  • 2:03 - 2:13
    所以,例如,线程 0 可能会访问位置 0,线程 1 的位置 2,线程 2 位置 4、 线程 3 位置 6,等等。
  • 2:13 - 2:17
    在这种情况下,这将是 2的步幅,因为在线程访问之间有两个元素,
  • 2:17 - 2:25
    跨步访问的范围从,好吧,就像在这种情况下 2 个元素的步幅,
  • 2:25 - 2:28
    我真的只增加了一倍的内存交换数。
  • 2:28 - 2:34
    所以我有点儿把我的合并质量减半一直到非常非常糟糕,对吗?
  • 2:34 - 2:38
    所以,你可以想象,如果元素之间的跨距足够大,
  • 2:38 - 2:44
    然后在变形中的每个线程访问完全不同的 32 或 128 字节的内存块,
  • 2:44 - 2:48
    那么接着你保证得到很糟的行为。
  • 2:48 - 2:52
    你必须要做的是保证将内存交换的数目最大化。
  • 2:52 - 2:56
    所以,让我们看看我们内核的代码。这里是我们从输入矩阵读入的,
  • 2:56 - 2:58
    和这实际上的确很不错。
  • 2:58 - 3:05
    每个线程读取内存中的一个值,这相当于某种巨大的偏移;J乘以N加I。
  • 3:05 - 3:09
    如果你看看I,I真的是线程索引再加上一些偏移量。
  • 3:09 - 3:13
    所以,相邻的线程,你知道,线程和相邻线程进入X
  • 3:13 - 3:17
    正在读入输入矩阵的相邻值。这正是我们想要的,
  • 3:17 - 3:21
    所以这是好的合并。另一方面,当我们写的输出矩阵
  • 3:21 - 3:29
    相邻线程线程与相邻值I,骑到内存中被N分开的地方,对吗?
  • 3:29 - 3:36
    N 就像 1024。所以,相邻线程正在运行相互相邻1024个元素的内存位置。
  • 3:36 - 3:41
    这显然不好,这是很糟的合并。很糟,很糟、很糟、很糟。
  • 3:41 - 3:43
    事实上,这是我们问题的根源。
タイトル:
cs344_unit5_17_l_转置代码测量内存使用量
概説:

more » « less
Video Language:
English
Team:
Udacity
プロジェクト:
CS344 - Intro to Parallel Programming
Duration:
03:44

Chinese, Simplified subtitles

改訂 Compare revisions