我想将thrust :: norm用于复杂向量。但是有一个错误:没有函数实例&push; ::::匹配参数列表。这是我的代码。 fft是一个复杂的向量。
thrust::transform(fft.begin(), fft.end(), fft.begin(), thrust::norm<thrust::complex<double>>());
答案 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。