Return to Video

每行线程方法

  • 0:00 - 0:02
    那么我们就以每行线程的方法开始。
  • 0:02 - 0:04
    让我们先从数据结构开始。
  • 0:04 - 0:09
    我们将在这里使用压缩的稀疏行(CSR)格式,
    正如我们在第四单元做的一样。
  • 0:09 - 0:13
    回忆一下值包含矩阵中的非零元素,
  • 0:13 - 0:17
    索引给出每个条目的列,
  • 0:17 - 0:20
    另外行指针包含每行起始元素的索引。
  • 0:20 - 0:24
    所以这里的每个蓝点对应于每一行的起始元素,
  • 0:24 - 0:28
    即元素 0、 2、 3 和 5。
  • 0:28 - 0:30
    我们就来浏览一些代码。
  • 0:30 - 0:35
    请注意此代码,就像许多稀疏矩阵向量乘(SpMV)程序,计算 y + = mx。
  • 0:35 - 0:41
    所以它把m与向量 x 相乘,然后将其加到元素 y,
  • 0:41 - 0:43
    并且将结果重置为 y 。
  • 0:43 - 0:47
    它将矩阵向量乘积加到目标向量 y。
  • 0:47 - 0:51
    我们将从这一行语句开始,
    计算每个线程的全局索引。
  • 0:51 - 0:55
    具有索引 i 的线程将计算行 i 的结果。
  • 0:55 - 0:59
    接下来我们将有一个 if 语句,如果row小于行数。
  • 0:59 - 1:01
    我们为什么会有这个 if 语句?
  • 1:01 - 1:03
    我们会启动很多含有许多线程的线程块,
  • 1:03 - 1:07
    行数有可能不是块和线程的完美倍数。
  • 1:07 - 1:10
    这个if语句是CUDA 程序中很常见的语句。
  • 1:10 - 1:13
    在if语句里面是程序的重点。
  • 1:13 - 1:17
    还记得行指针包含每行起始元素的索引。
  • 1:17 - 1:23
    例如,这里的值 3 表示,这里的第三个元素 D
  • 1:23 - 1:29
    是包含 D 和 E的特定行的起始元素。所以我们要从D开始。
  • 1:29 - 1:32
    我们要从一行的开头开始,然后我们继续到,
  • 1:32 - 1:36
    但不包括,下一行的第一个元素,
    因此就是这里的这个循环。
  • 1:36 - 1:40
    在该循环的每次迭代,我们将把两样东西相乘。
  • 1:40 - 1:44
    一是该元素的值,在这个例子中即为 D。
  • 1:44 - 1:49
    第二个是我们查看 D 在哪一列。
  • 1:49 - 1:55
    在这个例子,D是在第 0 列,
    所以我们要查找在位置0的向量元素,
  • 1:55 - 1:59
    然后用 D 乘以该向量元素。
  • 1:59 - 2:05
    所以就是这个值乘以那个向量元素,
    然后把结果加到dot。
  • 2:05 - 2:09
    当我们最后完成时,我们取出我们的目标值 y,
  • 2:09 - 2:11
    将其加到dot, 并把它放回到 y。
Title:
每行线程方法
Description:

more » « less
Video Language:
English
Team:
Udacity
Project:
CS344 - Intro to Parallel Programming
Duration:
02:12

Chinese, Simplified subtitles

Revisions Compare revisions