使用Cuda-C的查找表

时间:2013-07-16 18:52:51

标签: c cuda gpgpu nvidia lookup-tables

我使用算法方法为this post找到了解决方案。我很想尝试在帖子中的一条评论中建议的查找表方法。我是CUDA C的新手,并试图寻找有关如何做到这一点的示例/信息。我将值存储在下表中。我知道我需要关联每个线程来拉取4个值中的每一个。这些值分别对应于每个线程的索引SubBlkIdxA,SubBlkIdxB,BlkIdxA和BlkIdxB。一旦从表中读取它们,它们就会被传递给函数来计算某些东西。

我知道如果我说m_aIdx [3] [0]它会进入{3,0,0,1,},表格中的条目并读取第一个条目'3'。为了将这个位置的每个条目读到上面提到的索引,我想是这样的:

我的表格如下:

static __constant__ int16 m_aIdx[64][4] =
{
    {0,1,0,0,},
    {2,3,0,0,},
    {1,0,0,1,},
    {3,0,0,1,},
    {1,2,0,1,},
    {3,2,0,1,},
    and so on ... upto 64 entries
}

这样的功能:

static __device__ void func()
{
    SubBlkIdxA = m_aIdx[3][0];
    SubBlkIdxB = m_aIdx[3][1];
    BlkIdxA = m_aIdx[3][2];
    BlkIdxB = m_aIdx[3][3];

    func1(SubBlkIdxA, SubBlkIdxB, BlkIdxA, BlkIdxB);
}

内核执行速度也是我关注的问题。所以,很想知道这种方法是否是一种好的做法(生成指数的有效方法)?

1 个答案:

答案 0 :(得分:1)

两者都应该很快。在您的“算法”方法中,您可以根据寄存器中存储的数据计算索引,这将非常快。在接近这个过程中,你正在对512字节的常量内存进行相对良好的合并内存访问,这也非常快。 (即使它很难合并,它也会很快被缓存)。

我要关注的是你如何在func1中使用这些索引。如果关于这些指数的陈述可能会导致一些不良分歧,那么使用这些指数进行内存访问可能会导致一些合并不良的转移。

要考虑的一件事是将连续的tid保持在相同的子块中。如果它们基于每个子块,这样做将导致更清晰的内存传输。

P.S。我不太确定你的子块是如何构造的,因为我没有掌握你的索引模式,也不明白你为什么要在一个块中创建子块而不是使用更小的块。