この投稿を2012年1月20日になくなられた マイクロソフトの偉大なエバンジェリスト 川西 裕幸さんに 捧げる。
約30年前に、東北大学の大型計算機センターに NEC ACOS 1000 という当時最高速の大型計算機が導入され、修論でだいぶお世話になりました。一つのビルがこの1つのコンピュータにささげられており、さながらバベルの塔のコンピューターのような畏敬の念をいだきながら、使ったものでした。
http://museum.ipsj.or.jp/computer/main/0053.html
時は流れ、今使っているPCは、メモリも、クロックも、ストレージも、通信も、おまけにSIMD プロセッサーに、MIMD マルチコアプロセッサ、高解像度ディスプレイまであり、当時の世界最高速の大型計算機の性能を軽く数ケタ凌駕している。恐ろしい性能を目の前に、ようやくi7 860 4コアのCPUを全力で 0.1秒だけ振り切らせることができた。それでも、SSEは全く使い余している。
30年後のテクノロジーに思いをはせながら、明日を夢見る。

前回、C# + Native で画像のラプラシアンフィルター実行してみたが、次に C# Parallel + Native C での実行と比較してみた。
ちょっと大きめの画像での実行結果は次の表のとおり。
番号 |
説明 |
C# (秒) |
C++/(秒) |
C# + Native C(秒) |
C# Parallel.For + Native C(秒) |
|
処理ロジック=> |
素直にフィルターを実装 |
素直にフィルターを実装 |
素直にフィルターを実装 |
フィルターの3重for ループを展開 整数演算に変更 |
1 |
Debug |
8.1 |
4.3 |
2.9 |
0.2 |
2 |
Release |
4.8(コードの最適化 Off) |
3.7: 最適化無効 (/0d) |
2.1: 最適化無効 (/0d) |
– |
3 |
Release |
4.5 (コードの最適化 On) |
2.7 : 最大限の最適化 (/Ox) |
0.5: 最大限の最適化 (/Ox) + SSE2 |
0.1秒 最大限の最適化 (/Ox) + SSE2 |
並列化による高速化は、アムダールの法則に従い、問題に内在する並列度に依存する。このような並列度の高い画像処理などでは並列化による高速化に向いており、C# で素直に実装(デフォルトのコンパイラスイッチ)したときが4.8秒に比べて、C# Parallel.For + Native Cで約50倍の高速化ができた。
実際のNative C のアセンブラ出力を確認してみると、次のようにSSE命令までは展開されていなかった。これは、フィルターの3重forループを展開し、さらに整数加減算+シフト演算へ変換しているため、SSE命令を使うより、単純なアセンブラの実行のほうが十分高速であるからと思われる。実際、手書きで SSE Intrinsics で積和演算を書いて実行してみたが、コンパイラーの最適化よりも、若干遅い結果となってしまった。もう少し複雑な演算や、浮動小数点の積和が必要な処理であれば、SSEコードが生成され、50倍以上の高速化も十分可能ではないかと期待している。
アセンブラのコードの一部
mov DWORD PTR tv423[ebp], eax
mov eax, ebx
push edi
lea edi, DWORD PTR [ebx+ecx]
add ebx, esi
mov DWORD PTR tv463[ebp], ebx
mov ebx, esi
imul ebx, DWORD PTR _y$[ebp]
sub eax, esi
mov DWORD PTR tv441[ebp], edi
add edi, esi
mov DWORD PTR tv428[ebp], eax
add eax, ecx
mov DWORD PTR tv422[ebp], edx
add edx, esi
lea esi, DWORD PTR [edx+ebx]
mov DWORD PTR tv442[ebp], edi
add edi, ebx
add ebx, eax
add edi, ecx
アセンブラのコード出力は、プロジェクトプロパティから、[構成プロパティ]→[C/C++]→[出力ファイル]→[アセンブリの出力] を設定する。

今回は4Core 8Thread の i7 860 での Parallel.For を利用したが、さらなるメニーコア化の時代が到来しており、これらのリソースを有効に活用できるソフトウェアの重要性がより高まってくるだろう。そんな時に、生産性の良い C# と.NET Parallel に、 Native C、SIMD Intrinsics の組み合わせは、最強の武器になるだろう。