CUDA查找表与算法

时间:2016-04-08 15:05:10

标签: cuda gpu gpgpu lookup-tables

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

我正在尝试找出理论上更快的东西,从共享内存中的表中随机查找(因此可能存在冲突)与使用'n'fp乘法的算法进行随机查找。

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

fp乘法每次需要1个周期吗? 5个周期?此时,作为多次乘法,使用共享内存查找表是否有意义?

1 个答案:

答案 0 :(得分:1)

乘法将是' n'每条指令x个周期。这是正确的推理吗?在做' n' fp乘法,它使核心忙于这些操作。它可能不仅仅是“多种多样的”。说明,它将是其他类似于' mov'中间也。所以也许它可能是n * 3指令。当您从共享内存中获取缓存值时,(20-40)* 5(平均最大银行冲突......引用)= ~150个时钟核心可以自由地执行其他操作。如果内核是计算绑定(受限),则使用共享内存可能更有效。如果内核具有有限的共享内存或使用更多的共享内存会导致更少的飞行中扭曲,那么重新计算它会更快。

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

此时,作为一系列乘法,使用共享内存查找表是否有意义?这真的很难说。这里有很多变量,比如GPU生成,内核的其余部分,共享内存的设置时间等等。

在内核中构建随机数的问题也是额外的寄存器要求。这可能会导致内核其余部分减速,因为会有更多的寄存器使用,这样可能会减少占用率。

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

希望这会有所帮助。希望其他一些专家可以为您提供更好的信息。