CUDA或OpenCL中的稀疏数组

CUDA或OpenCL中的稀疏数组,cuda,opencl,gpgpu,Cuda,Opencl,Gpgpu,我有一个大型数组(比如512K个元素),驻留在GPU上,其中只需要处理一小部分元素(比如5K个随机分布的元素-集合)。找出哪些元素属于S的算法非常有效,因此我可以轻松地创建一个数组,其中包含指向集合S中元素的指针或索引 什么是只在S中的元素上运行CUDA或OpenCL内核的最有效方法?我可以在阵列上运行内核吗?到目前为止,我看到的所有示例都涉及连续的一维、二维或三维阵列。引入一层间接寻址有什么问题吗?在CUDA中,由于可能使用内存合并,因此首选连续(非随机)内存访问。创建随机分布的索引数组并从每

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

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

在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

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

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


此外,纹理内存将是您提供缓存位置的朋友。您使用的纹理类型(1D、2D或3D)将取决于您的问题。

大型阵列是否已经驻留在GPU中?我记得到GPU的传输速率不是很高,所以只需将A复制到GPU就可以节省时间,特别是当A-ness测试为O(1)时。它是GPU驻留的(我编辑了这个问题以反映这一点)。CUDA体系结构公开了不同类型的内存。你在用什么?我还没有做过任何CUDA或OpenCL编程。我对GPGPU有相当好的总体理解,但没有实际经验。这个问题的答案将帮助我决定GPGPU在多大程度上适用于我的问题集。