2017-07-16 11 views
2

私はしばらくの間苦労してきた次の問題があります。 CUDA多くの小規模のアレーを集約

I持って16素子、たとえば、で構成され、多数の小さなアレイから組み立て実際には、以下の配列:

[1,1,1,1 | 2,2,2,2 、2,2,3,3,3,3,3,3,4,4,4]

実際には、配列はかなり長く、約512または1024であり、配列の総長は最大ブロック・サイズよりも小さいため、1024より小さい。配列は、前の計算の結果であるため、共用メモリーに存在する。最初と最後を除くすべての部分配列は同じサイズであり、すべての部分配列は偶数の要素を持ちます。 12、... | | 18、... |結果は

[4、...となるように、

1つのCUDAブロックでは、私は、この配列を合計したい、16 ...サブアレイは、2のべき乗の長さのものであった場合]

ので、一つの選択肢は、このように0を持つ配列を充填することで、そこに問題はないが、それはほとんど事実でないことをサブアレイ2のべき乗の長さを有するであろう:

[ 1,1,1,2,2,2,2,2,2,0,0,3,3,3,3,3,0,0 | 4,4,4,4]

しかし、これは、私は長さ34のサブアレイを持っていたし、私は誰でもへの効率的なソリューションを参照してくださいん64.

を埋めるために各30個の0値要素に追加する場合は、処理能力の膨大な量の廃棄物と共有MEMでありますそのような配列を合計しますか? 助けていただければ幸いです。

+0

サブアレイの値は、値が列挙によって記述できるように、以前に分かっていた値の集合から来ますか?その場合、アトミック操作が役立つ可能性があります。 – nglee

+0

いいえ、それらはあらかじめ計算されていますが、ここでは明瞭にするために値を繰り返します。とにかく、ついに合理的に速いsulutionを見つけることができました。誰かが同じ問題を抱えた場合に備えてすぐに投稿します – quirell

答えて

1

ブロックの全体の長さが固定されているとします(実行時でも、起動前でもコンパイル時でも)、スレッドごとに次のことを行うのはなぜですか? :

  1. は、あなたの要素がワープ内のスレッドは、移行
  2. シェアの経糸投票結果を持っているかを決定するために
  3. 使用投票(これと次のものを読むことによって)シーケンスの最後であるかどうかを確認します
  4. ブロック全体の最後のセグメントであるビットマップを、自分の位置から逆方向に「検索」して、前回の遷移を検索します(ワープ1つにつき1つのレーンのみが共有メモリ内の適切な場所に書き込みます)。
  5. セグメントの要素数が分かりました。それをあなたの要素の値で掛けて、結果に書き込んでください。

最後のブロックでこれがどのように変化するかのような詳細がいくつかありますが、それはかなりうまくいくはずです。

関連する問題