質問

次のコードを生成するようなコードの辞書とCUDAを使用推力(C++テンプレート図書館のためのCUDA):

thrust::device_vector<float> dCodes(codes->begin(), codes->end());
thrust::device_vector<int> dCounts(counts->begin(), counts->end());
thrust::device_vector<int> newCounts(counts->size());

for (int i = 0; i < dCodes.size(); i++) {
    float code = dCodes[i];
    int count = thrust::count(dCodes.begin(), dCodes.end(), code);

    newCounts[i] = dCounts[i] + count;

    //Had we already a count in one of the last runs?
    if (dCounts[i] > 0) {
        newCounts[i]--;
    }

    //Remove
    thrust::detail::normal_iterator<thrust::device_ptr<float> > newEnd = thrust::remove(dCodes.begin()+i+1, dCodes.end(), code);
    int dist = thrust::distance(dCodes.begin(), newEnd);
    dCodes.resize(dist);
    newCounts.resize(dist);
}

codes->resize(dCodes.size());
counts->resize(newCounts.size());

thrust::copy(dCodes.begin(), dCodes.end(), codes->begin());
thrust::copy(newCounts.begin(), newCounts.end(), counts->begin());

問題は、とって複数のコピーの4バイトを利用CUDA視覚的プロファイラ.IMOこのよ

  1. ループをカウンター i
  2. floatコード, int countdist
  3. 毎へのアクセス i の変数上記

このように減速すべての逐次コピーの4バイトが楽し---).

では、どのようんちスラスト力は、これらの変数の取扱いについてのデバイス?もしかしては、まだやっていますか。

使用スラスト::device_ptrされていないように見えるのに十分なっており、いかはまだわかりませんが、いずれの速度で走るホストまたはデバイスをも別の理由のslowliness).

役に立ちましたか?

解決

I、サイズ、インデックス、コード、等のすべての繰り返しのためには、ホストからデバイスにコピーされなければなりません.. あなたがあなたのプログラムを持っているように、あなたが行うことができます多くはありません。 最良の結果を得るために、デバイス上の全体iループを移動することを検討して、この方法は、あなたは、デバイスのコピーにホストを持っていません。

パフォーマンスに関して、アルゴリズムは非常にフィットしませ利用可能な機能をしている。ここで、

トラストは、いくつかのもののために素晴らしいですが、しかし、あなたは明示的に推力アルゴリズムを使用することなく、最高のパフォーマンスのために書き換えることがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top