3

我已经 使用算法方法为这篇文章找到了解决方案。我也很想尝试帖子中的一条评论中建议的查找表方法。我对 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);
}

我也关心内核执行的速度。那么,很想知道这种方法是否是一种好的做法(生成索引的有效方法)?

4

1 回答 1

1

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

我要关心的是如何在 func1 中使用这些索引。如果关于这些索引的语句可能会导致一些不好的分歧,并且使用这些索引进行内存访问可能会导致一些合并不良的传输。

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

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

于 2013-07-16T20:51:26.043 回答