BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C++インタプリタClingでPythonとの相互運用とJupyter Notebooksに対応

C++インタプリタClingでPythonとの相互運用とJupyter Notebooksに対応

原文(投稿日:2021/04/07)へのリンク

Clingは、C++を調査やRAD(Rapid Application Development)に適したものにするためにLLVM上に構築された、インタラクティブなC++インタプリタだ。先日公開された一連の記事では、研究ソフトウェアエンジニアのVassil Vassilev氏が、PythonやJupyter Notebooksとの相互互換性とハードウェアアクセラレータのサポートを実現したClingの発展について説明している。

Clingはコードの部分的な入力を受け入れて、続くコードが入力された時にそれを処理するように、コンパイルプロセスの実行を継続する。最終的にコンパイルされたコードのチャンクにアクセスするためのAPIも用意されている。各チャンクが実行される前には、カスタム定義した変換を行うことができる。

上に挙げたアプローチは、対話性の上で重要であり、かつ、コンパイル言語であるC++では十分にサポートされていない、いくつかの機能を実現するためのものだ。具体的には、グローバルスコープにおけるステートメントのインクリメンタルな実行、結果の出力とエラーリカバリ、エンティティの再定義、構文エラーを処理するためのコード削除などである。これらの機能はいずれも、ClangとLLVMの内部構造に関する詳細な知識を伴った、巧緻なソリューションを必要とする。例えば、

Clingでは、インラインネームスペースを使ってエンティティの再定義を実装するとともに、より新しい定義に高い優先度を与えるように、clangの検索ルールを書き直しています。

同じように、例えばnullポインタが逆参照(dereference)された場合などにセッションのクラッシュを回避する方法や、無効なコードを破棄して有効な状態に復帰する方法も知っておかなければならない。

Clingは特に科学系のコミュニティで多く採用されている、とVassilev氏は言う。これが氏にとって、Pythonとのネイティブレベルでのダイナミックな相互運用性や、ハードウェアアクセラレータの使用を可能とするモチベーションとなっている。研究分野での重要性を示す例として氏が挙げたのは、高エネルギ物理学を始めとするさまざまな分野で使用されるデータ分析フレームワークのROOTである。Clingを使えば、ROOTでeval形式のプログラミングが可能になる。

ROOTではClingを、データ直列化のための情報リフレクションサービスとして使用します。ClingのC++オブジェクトは直列的なバイナリフォーマットで格納されるので、ユーザがデータファイルを読み出して使用することができます。これによって、C++オブジェクトの使い勝手が非常によくなるのです。

さらにClingは、Jupyter NotebooksでC++を使用する手段にもなる。C++を使ったライブコード、方程式、可視化、説明文を含むドキュメントを作成し、共有することが可能になるのだ。C++ Jupyterカーネルのxeus-clingは、Jupyterカーネル開発用のライブラリであるxeusをベースとして構築されている。Vassilev氏はxeus-clingで開発した主要な機能として、Jupyterコンソールインタフェースのサポート、Jupyter magicでのcling "dot commands"のサポート、新しいjupyterデバッガプロトコルのサポートの3つを挙げている。

ClingはCUDAをサポートしているので、並列コンピューティングにも対応する。

CUDA C++コードを実行するためにClingは、コンパイラフロントエンドのエクステンションを起動してCUDA C++ダイアレクトを理解するとともに、そのコードをGPU用にコンパイルするための第2のコンパイラインスタンスを生成します。

この領域に関しては、将来的な開発テーマとして、完全なCUDA APIのサポート、CUDA Kernelsの再定義、他のGPUのサポートなどが考えられている。

Vassilev氏が記事で言及しているもうひとつの領域は、相互運用性のためのClingの使用だ。これは例えば、実行時にPythonの自動バインディングを行うcppyyで実現される。

cppyyでは、実行時リフレクションによって実行時にバインディングを構築し、共通ケースを特殊化する"all-lazy"アプローチによって、高いパフォーマンスを実現しています。これによってpybind11などよりも呼び出しオーバーヘッドが極めて低いだけでなく、cppyyによるstd::vector上のループが同じ型のNumPy配列をループするよりも早い、という結果も生み出しているのです。

ClingはコンパイルされたC++プログラム内でライブラリとして使用することもできるのでで、C++インタプリタ/コンパイラ・アズ・ア・サービスというビジョンも実現可能である。プラグインを使って、ドメイン特有の機能を拡張することも可能だ。

この記事に星をつける

おすすめ度
スタイル

BT