c - 使用 Cuda-C 查找表

标签 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);
}

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

最佳答案

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

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

要考虑的一件事是在相同的子 block 中保持连续的 tid。如果以每个子 block 为基础,这样做将导致更干净的内存传输。

附言我不是特别确定你的子 block 是如何构建的,因为我没有掌握你的索引模式,我也不明白你为什么要在 block 内创建子 block 而不是使用更小的 block 。

关于c - 使用 Cuda-C 查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17684707/

相关文章:

c - C 中 dup2 与 Windows 套接字的等效项

c - 什么(最小)C 图形库提供这些功能

c - 通过读取字符串检测数据类型

c++ - 在标准 C++ 和 OpenCL 之间共享多线程代码

optimization - 在 OpenCL 中构建偏移邻域操作的更快方法

尽管调试器显示 C 函数返回 1,但它仍返回 0

cuda - 对于CUDA,是否可以确保三元运算符可以避免分支分歧?

cuda - 从主机到主机的cuda memcpy是否执行同步?

cuda - cuBLAS argmin -- 如果输出到设备内存会出现段错误吗?

cuda - GPU 中的同步