0

sort_by_key単一のキーシーケンスと複数の値シーケンスがある場合に実行したいと思います。

通常、これを実行します

sort_by_key(
             key, 
             key + N, 
             make_zip_iterator(
                                make_tuple(x1 , x2 , ...)
                               )
            )

ただし、それぞれ長さがNを超える10を超えるシーケンスでソートを実行したいと思います。スラストは、サイズが10を超えるタプルをサポートしていません。これを回避する方法はありますか?

もちろん、keyベクトルの別のコピーを保持し、10個のシーケンスの束に対してソートを実行することもできます。しかし、私は1回の呼び出しですべてを実行したいと思います。

4

2 に答える 2

1

thrust::tupleは常に10個の要素を持つようにハードコーディングされているため、10個を超える個別のイテレータからを直接形成する方法はzip_iteratorありません。したがって、1回の融合操作で10個を超える個別のイテレータをキーで並べ替える方法はありません(暗黙的に10を超えるイテレータをユーザーファンクターにも渡します)。

個々のベクトルの一部を単一のイテレーターに結合する(たとえば、タプル値のベクトルを形成する)便利な方法を本当に考えられない場合は、順列イテレーターを使用することもできます。カウントイテレータから配列を作成して並べ替えると、次のようになります。

device_vector<int> indices(N);
copy(make_counting_iterator(0), make_counting_iterator(N), indices.begin());
sort_by_key(key, key+N, indices);

indicesこれで、他の方法でソートしたはずのベクトルに順序付けられたインデックスが保持されます。次に、後続のアルゴリズム呼び出しの一部としてキーによって入力データを「収集」するために使用できる順列イテレーターを作成できます。必要な数の順列イテレーターを作成できます。これらは、後続のコードで必要な12個の入力イテレーターのさまざまな「ビュー」を提供するためのzipイテレーターの順列にすることができます。

于 2012-09-08T09:13:56.263 に答える
0

実際には、単純な「分散」操作を使用できます。「thrust::sort_by_key」操作を1つだけ実行してから、データベクトルごとに「thrust::scatter」操作を適用します。値は場所に応じて配布されます。

thrust::sequence(indices.begin(), indices.end());
thrust::sort_by_key(keyvals.begin(), keyvals.end(), indices.begin());

//now indices keep the locations of the sorted key values
foreach ( ... ) {
    thrust::scatter(data.begin(), data.end(), indices.begin(), sorteddata.begin());
}

収集および分散操作は非常に強力であり、多くの機会を開きます。

于 2013-06-04T07:34:18.997 に答える