Matrix 在CUDA中实现RDF三元组的大型布尔稀疏矩阵(可能有1000万个条目)

Matrix 在CUDA中实现RDF三元组的大型布尔稀疏矩阵(可能有1000万个条目),matrix,cuda,Matrix,Cuda,我正在寻找一种合适的矩阵格式来表示CUDA中非常大的布尔稀疏矩阵(仅包含0和1)。我一直在阅读,发现了几种格式,如压缩稀疏行(CSR)、压缩稀疏列(CSC)等。由于矩阵非零元素都是1,那么哪种格式应该是最佳选择?矩阵中的操作基本上是基于某些条件将0转换为1的写操作。主要目的是查询特定行中每个1的(行,列)对矩阵。欢迎对矩阵格式和行搜索效率进行深入了解 @罗伯特·克罗维拉:非常感谢你澄清这个问题。我知道CUDA没有太多的作用,除非我们决定在不同的行上同时搜索1(非零值),当然矩阵上没有写操作。这可

我正在寻找一种合适的矩阵格式来表示CUDA中非常大的布尔稀疏矩阵(仅包含0和1)。我一直在阅读,发现了几种格式,如压缩稀疏行(CSR)、压缩稀疏列(CSC)等。由于矩阵非零元素都是1,那么哪种格式应该是最佳选择?矩阵中的操作基本上是基于某些条件将0转换为1的写操作。主要目的是查询特定行中每个1的(行,列)对矩阵。欢迎对矩阵格式和行搜索效率进行深入了解


@罗伯特·克罗维拉:非常感谢你澄清这个问题。我知道CUDA没有太多的作用,除非我们决定在不同的行上同时搜索1(非零值),当然矩阵上没有写操作。这可以按照您对第二行(=1)中所有1的搜索所述进行。然后,每个线程都可以异步搜索一个单独的行,以查找非零值(在我们的示例1中)。只需提及,并希望了解您对我们是否可以删除值向量的看法,因为它包含所有值。我们将节省一点空间复杂性(尽管它不是空间方面的主要因素)。空间要求将是nnz+n+1,而不是2nnz+n+1。

我可以告诉你,你的问题与CUDA无关。您只需要一个关于稀疏矩阵压缩存储格式的教程。我建议你用谷歌搜索一下(这里有一些,但我会尝试回答这个问题:

我很想知道一种合适的搜索操作,用于在给定行中数百万个值为1的列中查找相关列

或:

(如何)查询特定行中每个1的(行,列)对矩阵

如果您有一个CSR格式的矩阵,您将有一系列的行指针,以及每个(非零)元素的一组列索引。假设我有以下“稀疏”矩阵:

企业社会责任代表将是:

index:           0    1    2    3     
values:          1    1    1    1
column indices:  1    0    2    1
row pointers:    0    1    3    4
因此,如果我有一个CSR表示,并且我想回答“第二行的哪些列具有非零条目”的问题,那么只需从第二行的行指针(=1)开始,然后继续到下一行指针(3)之前的最后一个元素,并读取相应的列索引。在这种情况下,有两个列索引:0和2。因此,行1在列0和2中有两个非零元素

以编程方式,如果我想增加CUDA代码第2行中的每个非零元素,我可以:

int idx = threadIdx.x+blockDim.x*blockIdx.x;
if (idx < rowPtr[2] - rowPtr[1]) 
  values[idx + rowPtr[1]]++;
intidx=threadIdx.x+blockDim.x*blockIdx.x;
if(idx

并提供许多有用的稀疏矩阵操作功能。

现有技术很好,但实际上有必要在这个问题上全力以赴吗?1000万位只是略多于一兆字节。这实际上并没有那么大,许多操作可以矢量化以处理32或128个条目(位)一个至少要考虑“1000万个条目”的可能性(令人困惑)指矩阵的行/列数。是这样吗?我知道矩阵的总大小(以字节为单位)不会很大。我很想知道一种合适的搜索操作,用于在给定行的数百万个值为1的列中查找相关列。我想到的一件事是掩蔽选项n、 在这种情况下,我是否需要使用一种特定的首选稀疏矩阵表示方案,或者任何东西都可以。
int idx = threadIdx.x+blockDim.x*blockIdx.x;
if (idx < rowPtr[2] - rowPtr[1]) 
  values[idx + rowPtr[1]]++;