【问题标题】:What is the CUDA Math Library equivalent for arg()?arg() 对应的 CUDA 数学库是什么?
【发布时间】:2021-02-20 17:31:34
【问题描述】:

C++ 标准库有一个名为std::arg() 的函数。它返回其复数参数的相位角(或角度分量),以弧度表示。

我需要在 CUDA 内核中调用类似 std::arg() 的东西。 CUDA Math 库或 CUDA Complex Math 库中是否有等效函数?

【问题讨论】:

  • 我查看了cuComplex.h 并没有退出。 CUDA 仅对复数提供基本支持;基本上是 CUBLAS 和 CUFFT 所要求的。您可以轻松地自己计算函数为 arg (x + i y) = atan2 (y, x)。 CUDA 支持 C++ 标准数学函数atan2()
  • 是的。我只是做了这样的事情并且它起作用了: double myPhaseAngle = atan2(cuCimag(myComplexDouble), cuCreal(myComplexDouble));
  • thrust.github.io/doc/… 是的,就是usable in an ordinary CUDA kernel,它不需要大量使用其他推力结构。

标签: math cuda complex-numbers


【解决方案1】:

对 cme​​ts 进行总结和扩展:

  • CUDA 数学库不提供对复数值的 arg() 函数的直接支持。
  • cuComplex.h 非常初级。正如@njuffa 所说:它只有 CUBLAS 和 CUFFT 所要求的。
  • 您可以而且应该使用atan2(y, x)(或std::atan2(y, x)),其中y 是虚部,x 是实部。

现在,推力怎么样? thrust::complex<T> 确实有 arg() 方法,毕竟?

嗯,这就是它的实现方式:

template <typename T>
__host__ __device__
T arg(const complex<T>& z)
{
  // Find `atan2` by ADL.
  using std::atan2;
  return atan2(z.imag(), z.real());
}

(另见on GitHub。)...所以,atan2() 也在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2012-02-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多