サイト内の現在位置

NumPy互換数値演算ライブラリNLCPy

no.006 ~SX-Aurora TSUBASA向けPythonライブラリ~(その2)2020.12.25

 NLCPyのライブラリに含まれるオブジェクトファイルは、NEC C/C++コンパイラやNEC Numeric Library Collection(NLC)を使って、ベクトルエンジン向けに最適化されています。NECでは以前よりC/C++やFortranから呼び出す数値演算処理の専用ライブラリとしてNLCを開発し、製品として提供してきました。NLCPyではこのNLCを呼び出すことによって数値演算処理の高速化を図っています。このことで、Pythonベースでもndarray配列のデータ固まりをベクトル演算してNumPyベースの演算より高速な数値演算できるようにしています。

 一方、NumPyにはIntelのXeonなどのプロセッサー向けに最適化されたAnaconda版のNumPyも存在します。Anaconda版のNumPyはIntelコンパイラやMKLと呼ばれる数値演算ライブラリで最適化されたものです。NumPy(MKLを呼び出すものを使用します)とNLCPyを使った場合、Heat Equationの演算処理を例に処理速度の違いを見てみましょう。

 Figure-9は各データサイズにおける単位時間当たりの演算量(GFLOPS)を比較したものです。この結果が示すように、NLCPyを使うことで単位時間当たりの演算量が飛躍的に増加し、その処理時間短は大幅に短縮されることが分かると思います。

Figure-9 Heat Equation計算処理時間について
Figure-9 Heat Equation計算処理時間について
 NumPy(MKL)とNLCPyの比較

 少し雑学的な話題になりますが、NumPyおよびNLCPyの関数には、配列データのメモリへの格納順序を行方向にするか、列方向に指定するか、選択することができるものがあります。これはもともとC言語では行方向のデータ並びでメモリへ配置しているのに対して、Fortranでは列方向並びでメモリに置いて行く、という2つの方式が存在することへの対応になります。

 試しに、C言語方式とFortran言語方式のメモリ配置した場合の行列積の演算時間を比較してみると、その差がほとんどないことが分かります。これはライブラリであるNLCがいずれのメモリ配列方式においても同等に処理最適化していることの表れと言えます。

 Figure-10の例では、reshapeに続けてastypeでデータタイプ(ここでは倍精度浮動小数点)とメモリ配列方向を指定しています。

Figure-10 配列格納方向の違いによる実行時間比較
Figure-10 配列格納方向の違いによる実行時間比較

 それでは最後に、NLCPyとPythonの他のライブラリとの連携をご覧いただきます。

 データ分析を容易にするためのソフトウェアライブラリとしてpandasが有名です。このpandasとNLCPyを併用することが可能です。例えば、CSVファイルなどからpandasデータフレームにデータを読み込み、欠損値処理や複数のデータフレームの連結、時系列データ処理等を行った後に、データ分析する列をNLCPyのndarrayに読み込んで数値計算処理を行うことができます。分析のためのデータ前処理はpandasデータフレームで実施し、その後、数値計算はNLCPyのndarrayに変換して高速に行うというものです。pandasのデータフレームの一部をNLCPyのndarrayに送る際、選択したデータはVHのメモリからVEのメモリに自動で転送されます。

 Figure-11にasarray関数を使ったNumPy ndarrayを経由させたNLCPy ndarrayへの転送の様子と、数値処理の一例を示します。

Figure-11 DataFrameの一部をNLCPy ndarrayへ送り平均値計算
Figure-11 DataFrameの一部をNLCPy ndarrayへ送り平均値計算

 データ可視化のためのライブラリとしてPythonにはMatplotlibが用意されています。このMatplotlibを使ってNLCPyのndarrayのデータを簡単な操作でグラフ化することができます。以下はNLCPyで作成されたndarrayデータをプロットする操作と出力結果になります。

Figure-12 NLCPyとmatplotlib連携Figure-12 NLCPyとmatplotlib連携
Figure-12 NLCPyとmatplotlib連携

 以上、駆け足でSX-Aurora TSUBASAのNLCPyについてご紹介しました。

 現在GitHubPyPI上へ公開しているNLCPyはNEC SDKの一部ではなく、プレビューリリース版という扱い(有償サポート対象外)になっています。NumPy互換関数のNLCPy版を増やしていくため、NECでは現在も開発を継続しています。今後、ベクトルエンジン専用LAPACKを使った線形代数の関数が使えるようになり、幅広い計算処理用途に向けたスクリプトをSX-Aurora TSUBASA上でさらに高速に実行することができるようになる予定です。線形代数の関数がサポートされた際にはあらためて、NLCPyの並列処理と併せてこの場でご紹介する予定です。