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