バイトニックソートのコンピュートシェーダー移植版。 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)
1threadあたり2箇所Load,Storeを行います。
一番標準的な実装です。実行時間(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 |
Shared Memoryを使った高速化版です。
青の部分はグローバルメモリへ書き込みをしないで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 |
1threadあたり4箇所Load,Storeを行うことでグローバルメモリのアクセス回数を減らします。

これを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倍以上高速化できました!!わーい

