当数据在设备中时,有没有办法使用cufftComplex数据类型的推力?

时间:2014-03-24 14:00:54

标签: c++ cuda thrust

我正在制作有4D数据的程序。在循环中,我迭代第4维,并获取原始float的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;

所以,现在我的问题是,当数据已经复制到设备时,有没有办法让thrust::sort()函数与cufftComplex一起使用?或者还有其他类似于thrust的函数,当数据已经复制到设备时,它可以处理cufftComplex数据类型吗?

1 个答案:

答案 0 :(得分:2)

  

所以,现在我的问题是,当数据已经复制到设备时,有没有办法让thrust :: sort()函数与cufftComplex一起工作?

Thrust提供接受用户定义的比较运算符的sort操作versions,以您希望的任何方式对数据进行排序。

自定义仿函数的示例用法在推力sorting example中给出(使用evens_before_odds仿函数)。

所以你需要一个比较函子。我不知道你如何对复杂的值进行排序,但作为一个例子,如果你想根据你可以做的幅度对它们进行排序:

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


struct my_complex_sort
{
  __host__ __device__
  bool operator()(cufftComplex x, cufftComplex y)
  {
    return (cuCabs(x) > cuCabs(y));
  }
};

如果您已在设备上拥有cufftComplex数据,则可以为其创建推力指针。假设指向您设备数据的指针为d_data,数据大小为N

thrust::device_ptr<cufftComplex> dp_data = thrust::device_pointer_cast(d_data);

然后您可以使用以下方式对数据进行排序:

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

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