というわけで、OpenCLでAESのビットスライス実装をし、昨日買ったRadeon HD 5750で動かしてみた。
実装の指針としては、Processing Elementで1bit * 128bitを処理し、Compute Unitではそれを128個管理する。
なので、work-itemではuint4 (32bit*4のvector型) の処理を行い、work-groupで128個のAESブロックを処理する。
こうすることで、ラウンド処理に必要なデータは全てローカルメモリに収まるようにしたつもり。
(実際はGPUのローカルメモリサイズによって収まらない場合があるかも。そう言う場合はエラーで動かないのかな?)
| 2KB | 64KB | 512KB | 1MB | 2MB | 16MB | 64MB | |
| AMDのAES実装 | 9.84Mbps | 32.6Mbps | 64.28Mbps | 14.765Mbps | 14.75Mbps | 14.8Mbps | - |
| ビットスライス実装 | 8.43Mbps | 185.77Mbps | 257.85Mbps | 271.35Mbps | 352.36Mbps | 482.1Mbps | 505.6Mbps |
AMDのAES実装というのは、ATI Stream 2.0 Beta.4のサンプルに付属する実装で、
ProcessingElementに32bitずつ割り当てて、SBOXのテーブル参照を行う普通の実装。
何故か、512KBをピークにスループットが悪くなる。