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

时间:2012-08-02 14:55:25

标签: cuda

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

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

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

filtered_nums:-2 2 (其中filtered_nums可以是新的内存块)

但是我采取的每一种方法都会在尝试跨存储桶计数器同步线程时产生巨大的开销。如果我尝试使用单线程,算法会成功完成,但需要花费很长时间(比首先生成数字慢100多倍)。

我要求的是一种通用的高级,高效,尽可能简单的方法,您可以使用它来过滤这些数字。

修改 我将处理10个桶和50万个数字。所有数字都属于10个铲斗范围中的1个。每个桶将容纳43000个元素。 (有多余的元素,因为目标是填充每个桶,许多数字将被丢弃)。

第二次修改 重要的是要指出铲斗不必单独存放。目标只是丢弃不适合存储桶的元素。

1 个答案:

答案 0 :(得分:1)

您可以使用thrust :: remove_copy_if

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());

你必须用每个bin的常量替换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>(); 
}