AESのビットスライス実装はwork-itemに細かく振り分けすぎたので、
ちょっと作り直しが必要な感じ。なので、気分転換?にSHA-3候補であるLuffa-256を
OpenCLで実装してRadon HD 5750で動かしてみた。(所謂、GPGPUってやつ)
ハッシュ関数は内部状態が膨大なため、ビットスライス実装をするときっと死ねるので、
普通の実装です。
ハッシュ関数はブロック暗号と異なりブロック間に依存性があるので並列計算できません。
なのでここでは別々のデータのハッシュ値を計算する場合を想定し、
並列数 (parallels) = 計算するデータ数 としました。
そして、各データの情報量は全て同じで、それはブロック数(blocks)で示しました。
(Luffa-256においてブロックあたりのバイト数は32バイトです)
| blocks | parallels | throughput |
| 1 | 1 | 0.014Mbps |
| 1 | 512 | 98.49Mbps |
| 1 | 1024 | 216.8Mbps |
| 1 | 2048 | 424.56Mbps |
| 1 | 4096 | 774.89Mbps |
| 1 | 8192 | 1337.68Mbps |
| 1024 | 1 | 0.014Mbps |
| 1024 | 512 | 5.41Mbps |
| 1024 | 1024 | 1915.94Mbps |
| 1024 | 2048 | 6630.51Mbps |
| 1024 | 4096 | 7446.99Mbps |
| 1024 | 8192 | 8399.05Mbps |
| blocks | parallels | throughput |
| 2048 | 1 | 6.275Mbps |
| 2048 | 512 | 2473.63Mbps |
| 2048 | 1024 | 4589.41Mbps |
| 2048 | 2048 | 7447.34Mbps |
| 2048 | 4096 | 8449.14Mbps |
| 4096 | 1 | 6.810Mbps |
| 4096 | 512 | 2810.42Mbps |
| 4096 | 1024 | 5000.69Mbps |
| 4096 | 2048 | 8316.72Mbps |
| 8192 | 1 | 7.138Mbps |
| 8192 | 512 | 3020.44Mbps |
| 8192 | 1024 | 5399.49Mbps |
CPUの場合はCore i7 3.5GHzにおいて、1スレッドで、540Mbpsほど出ました。
(オフィシャルの最適化版実装ではなく、openCrypto.NETに含まれる実装を用いた場合の評価結果です。おそらくオフィシャルの方が速いと思います)
なので、4-threadで2160Mbps。SMTを使って...3000Mbpsぐらいでしょうか?
CPUの方が速いですね (笑
しかも、同時に1000個とか2000個のデータのハッシュ値を計算するとか
そういうシチュエーションが思い浮かばない...
なんて無意味な実装なんでしょう。