使用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编辑 重要的是要指出,桶不必单独存储。目标只是丢弃不适合桶的元素。
您可以使用推力:: 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>();
}
您是否知道跟踪计数器的方法对于推力示例中的每个垃圾箱? (您可以运行过滤NUM_BINS次,然后弹出所需的金额,但看起来它会很昂贵) – gsk 2012-08-02 18:21:35
请问您能给出一个关于您有多少个数字和水桶的说明,以及水桶的大小范围是什么。每个{2个桶1000个元素}和{1000个桶每个2个元素}的最佳解决方案可能会有所不同... – aland 2012-08-02 16:03:18
@aland:我更新了问题的详细信息 – gsk 2012-08-02 16:06:41