CUDA查找表与算法



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

我正试图找出理论上更快的方法,从共享内存中的表中随机查找(因此可能发生库冲突),而不是使用"n"fp乘法的算法。

最好的情况是共享存储器查找没有组冲突,因此需要20-40个时钟周期,最坏的情况是32个组冲突和640-1280个时钟周期。每条指令的乘法运算将是'n'*个循环。这是恰当的推理吗?

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

每条指令的乘法运算将是'n'x个循环。这是恰当的推理吗当进行'n'fp乘法运算时,它会让核心忙于这些运算。这可能不仅仅是"mult"指令,它还会是介于两者之间的其他指令,比如"mov"。所以可能总共有n*3条指令。当您从共享内存中获取缓存值时,(20-40)*5(平均最大组冲突..猜测)=~150个时钟,内核可以自由地做其他事情。如果内核是计算绑定的(有限的),那么使用共享内存可能会更有效率。如果内核的共享内存有限,或者使用更多的共享内存会减少飞行中的扭曲,那么重新计算会更快。

fp乘法每次都需要1个周期吗?5个周期当我写这篇文章的时候是6个周期,但那是7年前的事了。现在可能更快(也可能不会)。这只是针对一个特定的核心,而不是整个SM。

在哪一点上,作为倍数,使用共享内存查找表有意义吗真的很难说。这里有很多变量,比如GPU的生成、内核的其他部分在做什么、共享内存的设置时间等等。

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

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

希望这能有所帮助。希望其他一些专家能参与进来,给你更好的信息。

最新更新