2

次のコードには、CPU または GPU で実行される可能性のある情報がありません。「削減」操作はどこで実行されるのだろうか?

#include <thrust/iterator/counting_iterator.h>
...
// create iterators
thrust::counting_iterator<int> first(10);
thrust::counting_iterator<int> last = first + 3;

first[0]   // returns 10
first[1]   // returns 11
first[100] // returns 110

// sum of [first, last)
thrust::reduce(first, last);   // returns 33 (i.e. 10 + 11 + 12)

さらに、

thrust::transform_reduce(
    thrust::counting_iterator<unsigned int>(0), 
    thrust::counting_iterator<unsigned int>(N), 
    MyOperation(data), 0 ,thrust::plus<unsigned int>())

データが Thrust::host_vector として定義されていても、この関数は GPU で実行しようとします (ファイル名が .cpp で終わるため、コンパイラは関連するエラーを返します)。コードを CPU で実行する方法を教えてください。または、たとえばcounting_iteratorを使用しないなど、同じ操作を実行する別の方法を探す必要がありますか?

4

1 に答える 1

4

デフォルトでは、このようなアルゴリズムの呼び出しはデバイス バックエンド (つまり、この場合は GPU) で実行されます。

Thrust 1.7 以降を使用している場合は、thrust::host実行ポリシーを使用して、ホスト (つまり、CPU) でアルゴリズム呼び出しを強制的に実行します。

#include <thrust/execution_policy.h>

...

thrust::reduce(thrust::host, first, last);

...

thrust::transform_reduce(thrust::host,
                         first,
                         last,
                         MyOperation(data),
                         0,
                         thrust::plus<unsigned int>());

Thrust 1.6 を使用している場合はretag、既存のイテレーターを ging することで、呼び出しをホストに再ターゲットできます。

#include <thrust/iterator/retag.h>

...

thrust::reduce(thrust::retag<thrust::host_system_tag>(first),
               thrust::retag<thrust::host_system_tag>(last));

...

thrust::transform_reduce(thrust::retag<thrust::host_system_tag>(first),
                         thrust::retag<thrust::host_system_tag>(last),
                         MyOperation(data),
                         0,
                         thrust::plus<unsigned int>());

1.6 より前の古いバージョンの Thrust を使用している場合は、テンプレート パラメーターとしてhost_space_tagに渡す必要があります。counting_iterator

thrust::reduce(thrust::counting_iterator<unsigned int, thrust::host_space_tag>(0),
               thrust::counting_iterator<unsigned int, thrust::host_space_tag>(N));
于 2013-06-09T02:27:33.037 に答える