如何使用thrust :: norm来表示复数

时间:2017-11-22 21:13:22

标签: cuda thrust

我想将thrust :: norm用于复杂向量。但是有一个错误:没有函数实例&push; ::::匹配参数列表。这是我的代码。 fft是一个复杂的向量。

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

1 个答案:

答案 0 :(得分:1)

要将操作传递给thrust::transform之类的算法,操作必须以仿函数或a lambda的形式表示。 thrust::norm<thrust::complex<T> >()既不是这些,也不是&#34;裸露的&#34;推力complex.h template header提供的功能。

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

$ 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