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

问题描述:

我有很多位于全局GPU内存中的随机浮点数。我也有“桶”,指定他们将接受的数字范围和他们将接受的数字容量。使用CUDA根据特定数量范围过滤数字的有效方法是什么?

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

我想运行的过滤过程中产生我

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

但每次的方法,我需要跑入的尝试同步跨斗柜线程巨大的开销。如果我尝试使用单线程,算法会成功完成,但需要很长的时间(比首先生成数字慢100倍)。

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

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

第2编辑 重要的是要指出,桶不必单独存储。目标只是丢弃不适合桶的元素。

+0

请问您能给出一个关于您有多少个数字和水桶的说明,以及水桶的大小范围是什么。每个{2个桶1000个元素}和{1000个桶每个2个元素}的最佳解决方案可能会有所不同... – aland 2012-08-02 16:03:18

+0

@aland:我更新了问题的详细信息 – gsk 2012-08-02 16:06:41

您可以使用推力:: 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()); 

你将不得不更换LO和喜与常量每个箱.. 我想你可以模板化的内核,但话又说回来,你将不得不实例具有实际常量的模板。我看不到一个简单的方法,但我可能会错过一些东西。

如果您愿意查看第三方库,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>(); 
} 
+0

您是否知道跟踪计数器的方法对于推力示例中的每个垃圾箱? (您可以运行过滤NUM_BINS次,然后弹出所需的金额,但看起来它会很昂贵) – gsk 2012-08-02 18:21:35