2012-02-23 4 views
3

とreduce_by_keyパフォーマンス:推力::私はしばらくの間に一度だけ繰り返し、多くの異なるキーで配列のキー付きの削減をしなければならないいくつかの重要な繰り返し

keys = {1,2,3,3,4,5,6,7,7, 8, 9, 9,10,11,...} 
array = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,...} 

// after reduction 
result = {1,2,7,5,6,7,17,10,23,13,14} 

thrust::reduce_by_key(または任意の他のセグメント化された還元法)を使用しては、ほとんどの操作は実際には1つのアレイから別のアレイにコピーするだけなので、ここでは最速のオプションではありません。

この問題を解決するにはどうすればよいでしょうか?

+0

どのセグメントの長さが1以上であるかを事前に知ることはできますか?答えがノーならば、セグメントを検出するだけのデータ移動のコストは '' reduce_by_key''のコストに匹敵するため、難しい問題のように思えます。 –

+0

@JaredHoberock:はい、実際には、別の配列に格納されているセグメントの長さがあります。 – bbtrb

答えて

3

実際には、reduce_by_keyここで使用する適切なアルゴリズムです。スラストの現在の実装はできるだけ高速ではありません。具体的には、reduce_by_keyがmemcpyの速度で実行されることを防ぐものは何もない。私はother implementationsが既にその速度を達成していると信じている。 Thrust v1.7の暫定計画には、のパフォーマンス改善と、関連するback40computingプロジェクトのコードを使用したその他のスキャンベースアルゴリズムが含まれています。

セグメントが(1)長いか(2)均一な長さの場合は、reduce_by_keyよりも優れている可能性があることに注意してください。たとえば、ある時点では、オフセットベースのセグメント記述子をキーまたはヘッドフラグよりも使用する方が経済的です。しかし、セグメントが短い場合(あなたの場合のように)、または非常に可変長の場合は、最適なreduce_by_key実装が実際には最適なツールです。

関連する問題