2

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

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

我想运行一个过滤过程来产生我

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

但是我采取的每一种方法都会在尝试跨桶计数器同步线程时遇到巨大的开销。如果我尝试使用单线程,算法会成功完成,但需要的时间非常长(比最初生成数字慢 100 倍以上)。

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

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

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

4

1 回答 1

1

您可以使用推力::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>(); 
}
于 2012-08-02T17:31:05.993 回答