C++ 当数据在设备中时,是否有任何方法可以将推力与cufftComplex数据类型一起使用?

C++ 当数据在设备中时,是否有任何方法可以将推力与cufftComplex数据类型一起使用?,c++,cuda,thrust,C++,Cuda,Thrust,我正在制作一个有4D数据的程序。在一个循环中,我遍历第四维,并获取最初为浮点的3D数据,我将该数据转换为cufftComplex,然后将其复制到设备,并执行一些设备操作,如傅立叶变换(从cufft库)、图像去噪(我自己的cuda内核)。在傅里叶变换之后,在这些操作之间的循环中,我想找到特定迭代中3D数据的中值 我知道推力允许我进行排序,从中我可以很容易地找到中位数,就像下面的例子中使用正常的float数据类型一样 int row, column, slice; row = 5; column =

我正在制作一个有4D数据的程序。在一个循环中,我遍历第四维,并获取最初为
浮点
的3D数据,我将该数据转换为
cufftComplex
,然后将其复制到设备,并执行一些设备操作,如傅立叶变换(从
cufft
库)、图像去噪(我自己的cuda内核)。在傅里叶变换之后,在这些操作之间的循环中,我想找到特定迭代中3D数据的中值

我知道推力允许我进行排序,从中我可以很容易地找到中位数,就像下面的例子中使用正常的
float
数据类型一样

int row, column, slice;
row = 5;
column = 5;
slice = 5;
int alloc_size = row*column*slice;
float * theMainData = new float[alloc_size];
srand(time(NULL));
for(int k=0; k<slice; k++)
{
    for(int j=0; j<column; j++)
    {
       for(int i=0; i<row; i++)
       {
          theMainData[i+(j*column)+(k*row*column)] = rand()%1000;;
       }
    }
}
thrust::sort(theMainData, theMainData + alloc_size);
float median = theMainData[(alloc_size/2)];
cout<<endl<<"The median value is "<<median<<endl;
int行、列、切片;
行=5;
列=5;
切片=5;
int alloc_size=行*列*切片;
浮动*主数据=新浮动[分配大小];
srand(时间(空));
对于(int k=0;k
所以,现在我的问题是,当数据已经复制到设备上时,有没有办法让推力::sort()函数与cufftComplex一起工作

提供一种接受用户定义的比较运算符的
排序
操作,以便按您希望的方式对数据进行排序

推力中给出了自定义函子的示例用法(使用
evens\u before\u赔率
函子)

因此,您需要一个比较函子。我不知道如何对复杂值进行排序,但作为一个示例,如果您想根据可以执行的大小对它们进行排序:

#include <cuComplex.h>
#include <cufft.h>


struct my_complex_sort
{
  __host__ __device__
  bool operator()(cufftComplex x, cufftComplex y)
  {
    return (cuCabs(x) > cuCabs(y));
  }
};
然后,您可以使用以下方法对数据进行排序:

thrust::sort(dp_data, dp_data+N, my_complex_sort());

(免责声明:在浏览器中编码,未经测试)

当然,在复杂域中没有排序,即使按照大小排序,也不会是排序。
thrust::sort(dp_data, dp_data+N, my_complex_sort());