【问题标题】:how to use thrust::norm for complex number [duplicate]如何将推力::范数用于复数[重复]
【发布时间】:2017-11-22 21:13:22
【问题描述】:

我想对复向量使用推力:: 范数。但是有一个错误:没有函数 'thrust::norm' 的实例与参数列表匹配。这是我的代码。 fft 是一个复数向量。

thrust::transform(fft.begin(), fft.end(), fft.begin(), thrust::norm<thrust::complex<double>>());

【问题讨论】:

  • 谢谢。我已将其更改为另一个真正的矢量 psd。但是我还是有这个问题。

标签: cuda thrust


【解决方案1】:

要将操作传递给像thrust::transform 这样的算法,该操作必须以仿函数或a lambda 的形式表示。 thrust::norm&lt;thrust::complex&lt;T&gt; &gt;()不是这些,它是推力complex.h template header提供的“裸”功能。

因此,要将其用作推力算法操作,我们需要以某种方式包装它。这是一个将它包装在仿函数中的简单示例。由于这个特定的函数接受一个推力复数类型,但返回一个非复数类型,我们需要确保我们的输入和输出向量匹配所需的类型:

$ cat t1336.cu
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/functional.h>
#include <thrust/complex.h>


struct my_complex_norm {
  template <typename T>
  __host__ __device__
  T operator()(thrust::complex<T> &d){
    return thrust::norm(d);
  }
};

int main(){

  thrust::device_vector<thrust::complex<double> > fft(5);
  thrust::device_vector<double> out(5);

  thrust::transform(fft.begin(), fft.end(), out.begin(), my_complex_norm());
}

$ nvcc -arch=sm_35 -o t1336 t1336.cu
$

有关基本函子使用的更多信息,我推荐推力quick start guide

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 2012-11-02
    • 2013-01-04
    • 2011-07-28
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多