代码之家  ›  专栏  ›  技术社区  ›  Paul Jurczak

CUDA或OpenCL中的稀疏数组

  •  2
  • Paul Jurczak  · 技术社区  · 15 年前

    我有一个大型数组(比如512K个元素),驻留在GPU中,只需要处理一小部分元素(比如5K个随机分布的元素集)。找出属于S的元素的算法非常有效,因此我可以轻松地创建指向集合S中元素的指针或索引数组。

    什么是最有效的方式来运行CUDA或OpenCL内核只对元素从S?我可以在数组上运行内核吗?到目前为止,我看到的所有示例都涉及连续的一维、二维或三维数组。引入一层间接寻址有什么问题吗?

    3 回复  |  直到 15 年前
        1
  •  4
  •   KoppeKTop    15 年前

    在CUDA中,由于可能使用内存合并,因此首选连续(非随机)内存访问。创建随机分布的索引数组并从每个线程执行一个索引并不是什么大事,类似这样:

    __global__ kernel_func(unsigned * A, float * S)
    {
        const unsigned idx = threadIdx.x + blockIdx.x * blockDim.x;
        const unsigned S_idx = A[idx];
    
        S[S_idx] *= 5; // for example...
        ...
    }
    

    但是对S[随机访问]的内存访问将非常慢(这将是一个最可能的瓶颈)。

    如果您决定使用CUDA,那么您必须对块/网格大小进行大量实验,最小化每个线程的寄存器消耗(以最大化每个多处理器的块数),并可能对a排序以使用来自最近线程的最近S\ ind。。。

        2
  •  1
  •   Eri    15 年前

    如果您对索引进行排序或构建有助于性能分配的已排序列表,如果存在索引簇,则尝试使用纹理内存,如果您使用一些重叠访问每个线程中的许多元素,则使用共享内存可以显著提高性能。

        3
  •  1
  •   peakxu    15 年前

    一级间接操作完全没有问题。我在自己的CUDA代码中使用了相当数量的代码。随着时间的推移,电视机可能会保持静止吗?如果是这样的话,像您所说的那样生成查找A可能是非常值得的。

    推荐文章