- 207 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:59:03 ]
- >>205
結局>20は、>24で書いたようにインデックスで並列にした。 要はこんな感じ。 -- 大きな配列tmpがあるとき、下図の+で区切られた範囲ごとに集計したい。 tmp+-----+-----+--------+-----+---+... つまり、1番目のセクションは最初の(先頭の)+から次の+まで、2番目のセクションはその次の+まで…… ここで、こんな構造体を考える。 struct sections {short begin, end;} こいつの配列を作って次のように値をセットする。 {{0, 6}, {6, 12}, {12, 21}, {21, 27}, {27, 31}, ...} これをデバイス側に転送しておいて、一つのデータスレッドが一つのセクションを担当する形で集計した。 この方法の問題点: ・セクションのサイズが不均衡なので、ワープ内でも不均衡だと無駄なからループが発生してしまう。 # 1ワープ内では同じインストラクションが走ってしまうため。つまり、使用効率が落ちる状態。 ・セクションサイズがワープ内では極力等しくなるようにソートすると、今度はアクセス場所がランダムになる。 # 先程の配列が、例えば{{0, 6}, {6, 12}, {21, 27}, {301, 307}, ...}のようになってしまう。 いずれにしても、綺麗に並べることができない。 但し、今回は前段のtmp配列への演算結果の格納が所要時間の大半を占めたために適当にチューニングして放置。 尚、予告した集計のロジックは、総和ではなく↑とも違う小計算出だったので条件が違うと言うことでパス。 総計は興味があるので、その内テストできたら改めて晒そうと思う。
|

|