我想出了一个解决方案 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);
}
我也很关心内核执行速度。因此,很想知道这种方法是否是一种好的做法(生成索引的有效方法)?
最佳答案
两者都应该很快。在您的“算法”方法中,您根据存储在寄存器中的数据计算索引,这将非常快。在这种方法中,您正在对 512 字节的常量内存进行相对良好的合并内存访问,这也非常快。 (即使它合并得不好,它也会很快被缓存)。
我关心的是如何在 func1 中使用这些索引。如果这些索引上的语句可能会导致一些严重的分歧,并且使用这些索引进行内存访问可能会导致一些不良的合并传输。
要考虑的一件事是在相同的子 block 中保持连续的 tid。如果以每个子 block 为基础,这样做将导致更干净的内存传输。
附言我不是特别确定你的子 block 是如何构建的,因为我没有掌握你的索引模式,我也不明白你为什么要在 block 内创建子 block 而不是使用更小的 block 。
关于c - 使用 Cuda-C 查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17684707/