2

グローバル GPU メモリに多数のランダムな浮動小数点数があります。また、受け入れる数値の範囲と受け入れる数値の容量を指定する「バケット」もあります。

すなわち: 数字: -2 0 2 4 バケット (サイズ=1): [-2, 0], [1, 5]

私は私を生み出すろ過プロセスを実行したい

filtered_nums: -2 2 (filtered_nums はメモリの新しいブロックにすることができます)

しかし、私が取るすべてのアプローチは、バケット カウンター間でスレッドを同期しようとする大きなオーバーヘッドに遭遇します。シングルスレッドを使用しようとすると、アルゴリズムは正常に完了しますが、驚くほど時間がかかります (最初に数値を生成するよりも 100 倍以上遅くなります)。

私が求めているのは、これらの数値をフィルタリングするために使用する、一般的な高レベルで効率的で、可能な限り単純なアプローチ アルゴリズムです。

編集 10 個のバケットと 50 万個の数字を処理します。すべての数値が 10 個のバケット範囲のうちの 1 つに正確に収まる場所。各バケットには 43000 要素が保持されます。(目的はすべてのバケツを満たすことであり、多くの数字が破棄されるため、余分な要素があります)。

2回目の編集 バケットを個別に保存する必要がないことを指摘することが重要です。目的は、バケツに収まらない要素を破棄することだけです。

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

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 に答える