我正在制作有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
数据类型吗?
答案 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());
(免责声明:在浏览器中编码,未经测试)