CUDA 查找 Table 与算法

CUDA Lookup Table vs. Algorithm

我知道这可以测试,但我对理论很感兴趣,理论上应该更快。

我正在尝试找出理论上更快的方法,从共享内存中的 table 随机查找(因此可能会发生内存冲突)与算法 'n' fp 乘法。

最好的情况是共享内存查找没有库冲突,因此需要 20-40 个时钟周期,最坏的情况是 32 个库冲突和 640-1280 个时钟周期。乘法将是 'n' * 每条指令的周期数。这是正确的推理吗?

fp乘法每次都需要1个周期吗? 5个周期?在这一点上,作为多个乘法,使用共享内存查找有意义吗table?

每条指令的乘法运算为 'n' x 个周期。这是正确的推理吗? 在进行 'n' fp 乘法时,它会让核心忙于这些操作。它可能不仅仅是 'mult' 指令,它也会是其他指令,如 'mov' 之间的指令。所以可能总共有 n*3 条指令。当您从共享内存中获取缓存值时 (20-40) * 5(avg max bank conflicts..guessing)= ~150 clocks 内核可以自由地做其他事情。如果内核受计算限制(受限),那么使用共享内存可能更有效。如果内核具有有限的共享内存或使用更多共享内存将导致更少的飞行中扭曲,那么重新计算它会更快。

fp乘法每次都需要1个周期吗? 5 个周期? 当我写 this 时是 6 个周期,但那是 7 年前的事了。它现在可能(或可能不会)更快。这仅适用于特定核心,而不适用于整个 SM。

到什么时候,作为一个数的乘法,使用共享内存查找有意义吗table?真的不好说。这里有很多变量,比如 GPU 生成、内核的其余部分在做什么、共享内存的设置时间等。

在内核中构建随机数的一个问题是额外的寄存器要求。这可能会导致内核其余部分的速度变慢,因为会有更多的寄存器使用,从而可能导致更少的占用。

另一种解决方案(同样取决于问题)是使用 GPU RNG 并用随机数填充全局内存阵列。然后让你的内核访问这些。这将需要 300-500 个时钟周期,但不会有任何库冲突。 Pascal(尚未发布)也将有 hbm2,这可能会进一步降低全局内存访问时间。

希望这对您有所帮助。希望其他专家可以插话并为您提供更好的信息。