メニーコア・プロセッサ
メニーコア・プロセッサに特徴的なのは、単にコアが多く集積されているだけではなく、レジスタや命令セットが拡張されている点にあります。
アプリケーション・プログラムの処理性能向上が期待できるハードウェアおよびプログラムの要素と、コンパイラのサポート状況について下表にまとめました。
- 注2013年11月時点でのNTTデータ調べ
以下、上それぞれがどのような効果をもたらすかを具体的に見ていきましょう。
レジスタ数の拡張
レジスタはプロセッサ内部にあり、プロセッサ外部に配置されるメモリよりも高速なアクセスが可能です。
たとえばレジスタが2つしかないようなプロセッサでは、式x=a*b+cの生成コードは下図(1)のようになりますが、レジスタが豊富にあれば下図(2)のように効率の良いコードを生成することができます。
しかし昨今のビジネスシーンにおける複雑な計算を限られた数のレジスタ操作だけで行なうことは難しく、ハードウェアがレジスタ数を拡張するというのは必然的で、最も重要な拡張の一つといえます。
積和演算とコンパイラのサポート
積和演算とは、乗算と加算を同時に実行する命令を指します。内積や行列の演算をはじめとして、多くの科学技術計算は積和演算を多用します。プロセッサ側にこの積和演算を高速に処理するユニットが搭載されることで、非常に大きな効果を発揮できます。
コンパイラはこのような特殊な命令をうまく利用しなければなりませんが、複数のターゲットプロセッサをサポート可能なリターゲッタブルコンパイラ注の研究を経て、積和演算のような命令の最適マッチング技術はすでに確立されています。
SIMD命令とコア集積度の向上
SIMD(Single Instruction Multiple Data)命令とは、同種の演算を複数並列に実行する命令を指します。積和演算と同様、単一の命令で複数の演算を行う特殊命令ですが、同種の演算を数個(2~4程度)並列に実行する点が異なります。SIMD命令を使った並列化をSIMD並列化といいます。
演算は浮動小数の四則演算が主ですが、積和演算がさらにSIMD並列化された命令を実行可能なプロセッサもあります。SIMD命令をうまく使う命令選択には並列性の抽出が必要で、難しい問題です。SIMD並列化の近年の研究についてはCOINS参考1をご参照ください。
メニーコアを利用した並列計算を行うためのフレームワークとして現在最も利用されているものがOpenMP参考2で、以下の特徴があります。
- 既存コンパイラに並列化指示文を挿入するのみでよい
- 異なるスレッドが同一データを参照可能
- メジャーなコンパイラのほとんどでサポートされている
以下はループ内を並列化する例です。並列処理の指示文のみでfor文の制御変数を認識し、現在のスレッド数から適切な並列実行単位を作り実行します。
例えばスレッド数が4であれば、i=0~24,i=25~49,i=50~74,i=75~99が4つのスレッドに割り当てられます。
メニーコアHPCに向けて
メニーコアを活かした並列計算では、自動的な並列化は難しく、現在の多くの研究が継続されています。実際、並列アルゴリズムを見いだすこと自体高度な知的作業であり、自動化には限界があります。先の例であげたような、ループ中の配列計算は並列処理化で重要なポイントにはなりますが、それ以外の多くの一般的なプログラムにおける自動並列化については、ほとんど研究がなされていません。
コア数が少ないプロセッサで高度に最適化されたプログラムを実行させていた時代であれば、重要な部分のみの並列化のみでよかったのですが、有り余るほどのコアを有するメニーコア・プロセッサを前にして、一般的なプログラムがシングルコアで実行されるというのは、いかにももったいないことです。
スーパーコンピュータで培われてきたプロセッサおよびソフトウェア技術がエンタープライズビジネスに活かされようとしています。NTTデータ数理システムおよびNTTデータでは、メニーコア・プロセッサの利点を最大限に引き出せるよう、プログラムの自動並列化などの高度化をめざし、HPCの推進とエンタープライズビジネスへの技術適用を推進していきます。
注釈
- 注さまざまな言語に対してさまざまなターゲットマシンのコードを生成することが可能なコンパイラ。