使用CUDA根据特定数字范围过滤数字的有效方法是什么?

使用CUDA根据特定数字范围过滤数字的有效方法是什么?,cuda,Cuda,我有很多随机浮点数驻留在全局GPU内存中。我还有“bucket”,指定他们将接受的数字范围和他们将接受的数字容量 即: 数字:-2 0 2 4 桶(大小=1):[-2,0],[1,5] 我想运行一个过滤过程,让我 过滤数值:-2 (过滤后的内存可以是新的内存块) 但我采用的每一种方法都会带来巨大的开销,即试图跨存储桶计数器同步线程。如果我尝试使用一个线程,该算法将成功完成,但耗时惊人(比最初生成数字慢100多倍) 我要求的是一个通用的高级、高效、尽可能简单的方法算法,用于过滤这些数字 编辑 我将

我有很多随机浮点数驻留在全局GPU内存中。我还有“bucket”,指定他们将接受的数字范围和他们将接受的数字容量

即: 数字:-2 0 2 4 桶(大小=1):[-2,0],[1,5]

我想运行一个过滤过程,让我

过滤数值:-2 (过滤后的内存可以是新的内存块)

但我采用的每一种方法都会带来巨大的开销,即试图跨存储桶计数器同步线程。如果我尝试使用一个线程,该算法将成功完成,但耗时惊人(比最初生成数字慢100多倍)

我要求的是一个通用的高级、高效、尽可能简单的方法算法,用于过滤这些数字

编辑 我将处理10个桶和50万个数字。所有数字正好落在10个铲斗范围中的1个范围内。每个铲斗将容纳43000个元件。(有多余的元素,因为目标是填满每个桶,许多数字将被丢弃)

第二次编辑
必须指出的是,桶不必单独存储。其目的只是丢弃那些无法放入桶中的元素。

如果需要,您可以使用推力::移除\u复制\u

struct within_limit
{
    __host__ __device__
    bool operator()(const int x)
        {
            return (x >=lo && x < hi);
        }
};
thrust::remove_copy_if(input, input + N, result, within_limit());
struct在\u限制内
{
__主机设备__
布尔运算符()(常量int x)
{
返回(x>=lo&&x
您必须用每个箱子的常数替换lo和hi。。 我认为您可以对内核进行模板化,但同样,您必须用实际常量实例化模板。我看不出一个简单的方法,但我可能错过了一些东西

如果您愿意查看第三方库,arrayfire可能会提供更简单的解决方案

array I = array(N, input, afDevice);
float **Res = (float **)malloc(sizeof(float *) * nbins);
for(int i = 0; i < nbins; i++) {
   array res = where(I >= lo[i] && I < hi[i]);
   Res[i] = res.device<float>(); 
}
array I=array(N,输入,设备);
浮点数**Res=(浮点数**)malloc(浮点数*)*nbins;
对于(int i=0;i=lo[I]&&I
请大致说明您有多少个数字和桶,以及桶的大小范围。{2个桶每个1000个元素}和{1000个桶每个2个元素}的最佳解决方案可能会有所不同。@aland:我用细节更新了问题w您知道在推力示例中跟踪每个箱子计数器的方法吗?(您可以多次运行过滤NUM_BINS,然后弹出所需的数量,但这似乎很昂贵)