使用线性索引到行索引减少按键性能

时间:2014-05-13 15:32:17

标签: performance cuda thrust

我一直在检查代码rows_sum.cu来自推力示例,我无法理解linear_index_to_rows_index中究竟发生了什么。

有人可以用一些例子向我解释一下将线性索引转换成行索引的意思吗?

参考:https://github.com/thrust/thrust/blob/master/examples/sum_rows.cu

1 个答案:

答案 0 :(得分:4)

thrust中,常见的存储格式是矢量容器(例如device_vectorhost_vector)。在典型的使用中,这些容器是一维存储格式。 “行”和“列”的概念并不真正适用于1D向量。我们简单地谈谈元素的索引。在这种情况下,它是线性(1D)指数。

为了存储二维项目,例如可以应用元素“行”和“列”索引概念的矩阵,在推力中使用1D容器的常用方法是“展平”或“线性化“存储:

Matrix A:
        column:
        0    1 
row: 0  1    2
     1  3    4


Vector A:
index:   0    1    2    3
element: 1    2    3    4

此时,我们可以方便地使用推力操作。但是如果我们想对原始矩阵的特定行或列进行操作呢?当我们将其线性化或展平为1D向量时,该信息(行,列)“丢失”。但是如果我们知道原始矩阵的维数,我们就可以用它来转换线性索引:

  0     1     2     3

进入行/列索引:

(0,0) (0,1) (1,0) (1,1)

和反向(行/列到线性索引)。

在您链接的推力示例的情况下,仿函数linear_index_to_row_index将给定的线性索引转换为其关联的行索引。这允许程序员编写一个对特定数据行起作用的推力操作,例如对原始矩阵的“行”求和,即使它现在存储在线性1D向量中。

具体而言,当给出以下线性指标时:

  0    1    2    3

对于我的例子,仿函数会返回:

  0    0    1    1

因为它表示向量中特定元素所属的原始矩阵的行。

如果我想将每一行的所有元素相加,每行产生一个总和,那么我可以使用该仿函数生成的行索引来识别每个元素的行。此时,reduce_by_key可以很容易地将具有相同行索引的元素相加在一起,每行产生一个结果。