COOLChips XIX 2016 | How SIMD Width Affects Energy Efficiency: A Case Study on Sorting

先週,横浜で開催された低消費電力プロセッサに関するIEEEの国際会議COOLChipsで,ソートを例にSIMD命令の幅(一度にデータを並列に処理できる数)と消費電力の関係を調べた内容について発表を行いました.(原稿などはこちら→ 原稿(3ページのExtended Abstract)スライド

目的

最近のプロセッサは,高いピーク性能を達成するためにSIMD命令の幅が伸びてきています.(例えばx86だと,128 bitのSSE→256 bitのAVX→512 bitのAVX512)

幅の広いSIMDはピーク性能の向上には寄与しますが,SIMDの実行ユニットでの消費電力が増えて,電力効率は悪くなるという懸念があります.というわけで,実際にSIMDでのマージソートを例に電力計で電力を測ってみました.

計測環境

Haswell世代のCore i7(4コア,8スレッド)にメモリ8 GB(デュアルチャネル動作)のデスクトップPCに,電力計をつけてシステム全体の消費電力を測りました.また,ハードウェア性能の向上の傾向として,計算性能の伸びに対してメモリバンド幅の伸びは遅いため,将来のプロセッサの性能を想定して,メモリをシングルチャネル動作にしてバンド幅を減らした設定でも計測を行いました.

ソートアルゴリズムとしては,AVX (8-wayのSIMD),SSE (4-wayのSIMD),SIMDなしで実装したマージソートを用いて,256 M個の32 bitランダム整数列の性能を計測しました.比較用にQuicksort (STLのstd::sort)とRadix Sortも測っています.

結果のまとめ(メモリはデュアルチャネル動作)

・実行時間:SIMDなしと比べて,SSEで最大6.8倍,AVXで最大9.7倍向上

・時間あたりの消費電力(watt):SIMDなしと比べて,最大で15%増加

実行時間と消費電力をかけあわせて

・消費電力量(joule):SIMDなしと比べてSSEで最大6.4倍,AVXで最大8.8倍削減

というわけで,実行速度の向上と引き換えに消費電力は多少増加するが,実行速度の向上のほうがはるかに大きいので,全体として消費電力量が大幅に削減されるという(予想通りの)結果になりました.

ただ,面白い点として,ほとんどの場合にAVX版がSSE版よりも時間あたりの消費電力が多いのですが,8スレッド使っている(性能がメモリバンド幅で律速されている)場合には,SSE版がAVX版よりも時間あたりの消費電力が大きくなるという逆転が見られました.

結果のまとめ(メモリはシングルチャネル動作)

じゃあ,もっとメモリバンド幅を減らしてみたら面白い結果になるんじゃなかろうかということで,メモリを一枚抜いて測ってみました.

シングルチャネルで8スレッド使っている場合には,なんとSIMDなしのバージョンが一番時間当たり消費電力が多く,SSE版が次,AVX版が一番少ないという結果になりました.性能的にはメモリで律速されるものの,AVXが最速,SSEが2番目,SIMDなしが一番遅い結果になっています.

結論

幅の広いSIMD命令を使うほど,ある処理を実行するのに必要な命令数が少なくなります.メモリバンド幅などが十分である場合には,少ない命令数は高い性能に繋がるとともに,時間あたり消費電力が増加します.

一方,メモリバンド幅(もしくは他の要因)により律速されて,プロセッサが全力で稼働できないような場合には,命令数が減っても性能が向上しないかわりに,時間あたりに実行する命令数が減り低い消費電力につながります.

以上より,SIMD命令の幅を伸ばすのは,ピーク性能だけでなく消費電力的にも重要であるという結論になりました.(たとえメモリバンド幅などが足りなくなって,SIMD幅を増やしても,もう性能は上がらなくなっても,消費電力的には有利になる可能性があります)

今後の課題

今回はソートという1つの例だけでの調査なので,他のアルゴリズム(特に浮動小数点計算中心のもの)についても調査を行う必要があります.

あとがき

なんでソートとかいうSIMDの用途としては一般的でなさそうなアルゴリズムで試したのかという疑問がありそうですが,建前としての回答はソートはメモリバンド幅と計算量のバランスがちょうどよかったということになります.ただし,本音としてはそこにすでに実装があったからと言うだけだったりします :-)

SIMDソートはネタとしてずいぶん再利用してますが,AVX版の性能を出すのはたぶん初めてかな)

あと,当日も質問出ましたが,電力まで考えても,マージソートRadix sortが互角ぐらいなのは変わらないみたいです.