HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

EPYC ROME環境におけるMKL環境変数の影響について その1

お久しぶりです。
随分間が空いてしまいました、申し訳ありません。

EPYC ROME環境での計算科学アプリケーションの挙動について、引き続き書いていこうと思います。

ソースコードで配布されている科学技術計算用アプリケーションにおいては、想定している開発環境として、数値計算ライブラリ Intel Math Kernel Library ( MKL )に対応しているものが複数あります。
弊社ではこのようなアプリケーションでMKLを使用したビルドを行っています。
これは、Intel製CPU環境においては、MKLが性能的に優れ、動作的にも安定しているためです。

しかし、EPYC環境においては、MKLを使用した場合、そのままでは性能が生かされないケースが多いとインターネット上で多数報告されています。

同時に、そのようなインターネット上での記事は、MKLの環境変数”MKL_DEBUG_CPU_TYPE=5″を使用する事で、
パフォーマンスを向上させることができると報告されています。

では、この MKL_DEBUG_CPU_TYPE とはどのような変数なのでしょうか?

調べてみると、この変数はMKLの公式ドキュメントには記載されていない環境変数で、
なかなか仕様に関する詳細な情報が見つかりませんが、
色々な情報を総合すると以下のような性質のようです。

  • この変数を指定すると、MKL内部の関数を、特定のアーキテクチャに最適化させる( 5 の値はAVX2)
  • この変数によるアーキテクチャ指定は、他のMKLのアーキテクチャ指定に優先される
  • 最新のIntelParallel StudioXE 2020 update 1に同梱されているMKLでは、この変数は無効化されている。

MKL内部の関数を特定のアーキテクチャに最適化させる、というのはどのような事なのでしょうか?
参考となる資料が以下となります。

図1 Intel MKL の数値再現性の表 
インテル® Parallel Studio XEにおける浮動小数点結果の再現性 p20 より抜粋

図2 Intel MKL のISA処理に伴うパフォーマンスの比較
インテル® Parallel Studio XEにおける浮動小数点結果の再現性 p21 より抜粋

ISAとは、Instruction Set Architecture (命令セットアーキテクチャ)の略であり、CPUの世代(内部構造)に相当します。
AMD EPYCプロセッサは、Intel互換プロセッサとなるため、図1より、SSE2互換のISAのみ使用できない事となります。
実際、EPYC環境でテストをしてみましたが、EPYC ROME搭載環境ではAVX2命令に対応しているにもかかわらず、MKLではAVX2が使用できるハードウェアと認識されませんでした。
また、明示的にSSE2互換以外にISAターゲットを変更しようとしても、ROME環境では、対応ハードウェアではない旨のメッセージが出て正常に設定できませんでした。

このISAの選択がどの程度パフォーマンスに影響を及ぼす可能性があるか、についての情報が図2となります。
この図の数値は、Intel製CPUを想定していますので、数値がどの程度信頼できるかどうかについては疑問が残りますが、参考にはなるのではないかと個人的には考えています。
図2によると、AVX2互換モードに比べて、SSE2互換モードでは最大1/4程度までパフォーマンスが劣化することが示唆されています。

ここまで見てくると、”MKL_DEBUG_CPU_TYPE=5″を使用する意図がよくわかります。
MKLでの処理を、EPYC ROMEが対応しているAVX2処理に変更する事で、処理性能を上げているのです。

図1、2については、あくまでMKLにおける性能比較ですので、この性能差がそのまま実際のアプリケーションの性能差になるわけではありません。
しかし、経験上、計算科学アプリケーションにおいて、MKLを使用して処理されることの多いBLASは性能に非常に大きく影響を与える事が多いという事実があります。

ではこの “MKL_DEBUG_CPU_TYPE=5″を使用した場合、実際の計算科学アプリケーションの性能がどのように変化するのか、次回から見ていきます。