【问题标题】:Special CUDA Double Precision trig functions for SFU用于 SFU 的特殊 CUDA 双精度三角函数
【发布时间】:2013-04-28 07:06:41
【问题描述】:

我想知道如何在带有 CUDA 的内核代码中使用 __cos(x)(以及分别为 __sin(x))。我在 CUDA 手册中查找了这样一个设备函数,但是当我实现它时,编译器只是说我不能在设备中调用主机函数。

但是,我发现有两个姐妹函数cosf(x)__cosf(x),后者在SFU 上运行,总体上比原来的cosf(x) 函数快得多。编译器当然不会抱怨__cosf(x) 函数。

有没有我想念的图书馆?我对这个三角函数有误解吗?

【问题讨论】:

    标签: cuda trigonometry


    【解决方案1】:

    由于 SFU 仅支持某些单精度运算,因此没有双精度 __cos() 和 __sin() 设备函数。有单精度 __cosf() 和 __sinf() 设备函数,以及 CUDA 4.2 编程手册表 C-4 中详述的其他函数。

    我假设您正在寻找标准数学函数 sin() 和 cos() 的双精度版本的更快替代方案?如果需要相同参数的正弦和余弦,则应该使用 sincos() 来显着提升性能。如果 sine 或 cosine 的参数乘以 π,您可能希望使用 sinpi()、cospi() 或 sincospi(),以获得更高的性能。例如,sincospi() 在实现 Box-Muller 算法以生成正态分布的随机数时非常有用。此外,请查看 CUDA 5.0 预览以获得最佳性能(请注意,预览提供 alpha 发布质量)。

    【讨论】:

    • 这个 sincos() 函数是否分别通过 sin 和 cos 计算值?还是做 sin(cos(x)) 或 cos(sin(x))?还是有什么不同?
    • sincos(x) 同时返回 sin(x) 和 cos(x)。组合计算明显快于分别计算 sin() 和 cos()。类似地,sincospi(x) [在 CUDA 5.0 中添加] 计算 sin(πx) 和 cos(πx) 比单独调用 sinpi() 和 cospi(x) 更快。它也比通过 sincos() 手动计算结果要快。函数签名是 sincos(double arg, double *sine_of_arg, double *cos_of_arg)。您还可以在任何 Linux 系统上执行“man sincos”。当然,还有对应的单精度版本 sincosf() 和 sincosf()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2019-02-06
    • 2016-08-17
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多