2025/11/13 05:58 Integer Set Library (ISL) – A Primer

やっほー、ロボ子!今日のITニュースは、コンパイラの最適化ツール、Polyhedral optimizationで使われるInteger Set Library (ISL)についてなのじゃ。

ISLですか、博士。それはどのようなものなのですか?

ISLはね、整数点の集合を扱うライブラリなのじゃ。特に、集合と関係の表現、それと基本的な操作に焦点を当てているんだぞ。MLIRのISLポートであるFPLについても触れられているぞ。

なるほど。整数点の集合を扱うのですね。記事によると、ISLのコアデータオブジェクトは整数点の集合で、quasi-affine formulasで定義される等式と不等式を満たす集合として表現されるとのことですが…。

そうそう!quasi-affine formulaは、整数リテラルとか変数、加算、減算、定数倍、床関数、天井関数、剰余演算でできている多変量関数なのじゃ。

床関数と天井関数ですか。少し難しそうですね。

大丈夫!要は、小数を切り捨てたり、切り上げたりする関数だと思えば良いのじゃ。ISLは、集合をいくつかのカテゴリに分けて扱えるぞ。basic set、set、union set、map、basic map、union map、などなど。

たくさんの種類があるんですね。それぞれにどういう違いがあるんですか?

basic setは単一の凸整数多面体、setは複数の互いに素な凸成分を持つもの、union setは異なる次元を持つ集合の和、mapは変数の一部がdomain変数、その他がcodomain変数として区別されるもの、という感じじゃ。

なるほど、少しずつ分かってきました。記事には、Presburger set内の点を反復処理してCコードを生成する方法も書かれていますね。

そう!iteration scheduleを指定して、どの変数をどの順序で反復処理するかを決めるのじゃ。mapに変換することで、反復処理する変数のサブセットとその順序を指定できるぞ。

ふむふむ。ISL C APIも色々あるんですね。`isl_map_domain`関数は、`isl_map`を入力として、domain内の整数点のサブセットを表す`isl_set`へのポインタを返す、と。

その通り!ISLは内部で参照カウントを行うから、メモリ管理も楽ちんなのじゃ。

集合とmapの和や積などの基本的な操作もできるんですね。テンソルが与えられた整数関係に従ってメモリに配置されている場合、プログラム内のテンソルへの変更を元のレイアウトと合成して、新しいレイアウトの記述子を取得できる、と。

そうそう!ISLでは、div次元という特殊な変数を使って、除算の中間計算を表現するのじゃ。これは常に存在量化されるぞ。

`isl_set_foreach_point`というAPIで、集合内の各点を列挙できるんですね。デバッグに便利そうです。

その通り!そして、`isl_ast_build_node_from_schedule_map`でASTを構築して、`isl_ast_node_to_C_str`でC文字列に変換すれば、ループネストをCコードとして生成できるのじゃ!

すごい!色々なことができるんですね。MLIRコンパイラプロジェクトには、FPLというISLのサブセットの実装があるんですね。MLIRとISL間の相互運用レイヤーもあるんですか。

そう!MLIRの`IntegerRelation`とISLの`basic_map`の間で変換できるのじゃ。制約行列をコピーするだけだから、簡単なのじゃ。

今日はISLについて色々と学ぶことができました。ありがとうございます、博士!

どういたしまして!最後に一つ、ISLはアイスランドの略…ではないぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。