【发布时间】:2016-08-27 18:36:59
【问题描述】:
我正在 CUDA 中编写一个程序,它使用双精度对 sincos() 函数进行大量调用。恐怕这是代码的最大瓶颈之一,我无法减少对函数的调用次数。
在 CUDA 或我可以导入的库中,sincos 是否有合适的近似值?我也很关心准确性,所以近似值越好,我的代码就越快乐。
我也考虑过建立一个查找表或用他们的泰勒级数来近似值,但在走这条路之前我想听听一些意见。
【问题讨论】:
标签: cuda trigonometry
我正在 CUDA 中编写一个程序,它使用双精度对 sincos() 函数进行大量调用。恐怕这是代码的最大瓶颈之一,我无法减少对函数的调用次数。
在 CUDA 或我可以导入的库中,sincos 是否有合适的近似值?我也很关心准确性,所以近似值越好,我的代码就越快乐。
我也考虑过建立一个查找表或用他们的泰勒级数来近似值,但在走这条路之前我想听听一些意见。
【问题讨论】:
标签: cuda trigonometry
CUDA math api 中提供了一个非常快速和准确的 sincos 函数。只需包括math.h。或者使用sincosf (here) 如果这对你有用。 (我知道您在问题中提到了双精度。只是指出了一些事情。)
如果您可以使用sincospif 而不是sincosf,那么@njuffa 已经发挥了他的魔力here,您可能会感兴趣。
This question 和 this question 您可能也感兴趣。
【讨论】:
math.h 的sincos,我不知道使用sincosf 会不会降低太多的准确性,你觉得呢?虽然我的角度不是pi*expr,但是谢谢你指点sincospif!
sincosf 和 sincos 之间的精度(位)肯定有很大差异。我不知道它对您的特定算法有多重要。由于您对性能感兴趣,并且通常性能和精度是一种权衡,考虑到您的问题中的规定,调查您的算法对额外精度位的敏感性似乎是合乎逻辑的。当 njuffa 出现时,他将能够回答您的所有问题。
sincos 的适用性之外,还可能有其他特殊的使用模式。一些代码以规则的角度增量使用正弦和余弦,这允许在不调用sincos 的情况下计算这些值。其他代码将正弦和余弦与反三角函数结合使用,这种用法通常可以用可能更便宜的代数计算代替。您可能需要考虑询问如何针对您的特定用例减少正弦和余弦调用。
sincos 提供超过 10% 的收益。另一方面,在 CUDA 中启动 5 个线程的块是愚蠢的。您将 超过 的 GPU 可用性能的 27/32 留在桌面上,这意味着修复可能会导致 6-10 倍的加速。您应该注意 @tera 在 cmets 中针对该问题给您的建议。尝试每个块使用 128 个线程
sincos 是一个巨大的瓶颈。如果您想回答我的其他问题,让我们在那里讨论它,谢谢!