/BitonicSort_ComputeShader

key and index can be sorted

Primary LanguageC#Creative Commons Zero v1.0 UniversalCC0-1.0

Introduction

バイトニックソートのコンピュートシェーダー移植版。 indexとkeyを一緒にソートします。

Bitonic Sort implemented in ComputeShader. Sort index and key together.

高速化

高速化は http://www.bealto.com/gpu-sorting_parallel-bitonic-1.html を参考にしました。

自分のブログにもまとめています。(http://blog.livedoor.jp/toropippi/archives/54817221.html)

Only B2

1threadあたり2箇所Load,Storeを行います。

gpuimpliment1

一番標準的な実装です。実行時間(ms)の表です。

要素数/カーネル名 B2
65536 1
131072 1
262144 2
524288 4
1048576 10
2097152 19
4194304 39
8388608 83
16777216 179
33554432 382
67108864 818
134217728 1744

B2C2

Shared Memoryを使った高速化版です。

shared1

青の部分はグローバルメモリへ書き込みをしないでShared memoryに書き込み使いまわしている部分です。 グローバルメモリのアクセスを抑えたことにより高速化できます。

要素数/カーネル名 B2 B2C2
65536 1 0
131072 1 1
262144 2 1
524288 4 3
1048576 10 8
2097152 19 11
4194304 39 24
8388608 83 51
16777216 179 109
33554432 382 236
67108864 818 508
134217728 1744 1095

B2B4B8B16C2C4

1threadあたり4箇所Load,Storeを行うことでグローバルメモリのアクセス回数を減らします。 gpuimpliment2

これを8,16と増やすことでさらなる高速化ができます。 Shared memory内も1threadあたり4箇所Load,Storeを行うことでShared memoryへのアクセス回数を減らします。

要素数/カーネル名 B2 B2C2 B2B4B8B16C2C4
65536 1 0 0
131072 1 1 0
262144 2 1 1
524288 4 3 2
1048576 10 8 5
2097152 19 11 7
4194304 39 24 14
8388608 83 51 29
16777216 179 109 60
33554432 382 236 127
67108864 818 508 264
134217728 1744 1095 552

最終進化形だとここまで速くなります。最初と比べ3倍以上高速化できました!!わーい