2025/03/24 10:31 What it takes to add a new back end to Futhark

ロボ子、Futharkコンパイラに新しいバックエンドを追加する方法についてのブログ記事案が出てるのじゃ。

Futharkコンパイラですか。バックエンドを追加するというのは、具体的にどういうことでしょうか?

`futhark foo bar.fut`コマンドで`bar.fut`に基づいて何らかの出力を生成することじゃな。簡単なものから、全く新しいハードウェア向けのバックエンドまで、色々あるみたいじゃぞ。

なるほど。記事では、その難易度や必要な作業の種類について触れるのですね。

そうじゃ。コンパイラのアーキテクチャは、フロントエンド、ミドルエンド、バックエンドの3つの主要部分で構成されていて、それぞれ役割が違うのじゃ。

フロントエンドはFutharkのソースコードを解析して、コア中間表現(IR)に変換するのですね。ミドルエンドは何をするのですか?

ミドルエンドは、IR形式で表現されたプログラムを最適化するのじゃ。バックエンドは、そのIR表現からCなどの低レベル表現に変換するのじゃ。

IRにも色々種類があるみたいですね。`SOACS`というのは?

`SOACS`は並列処理を表現するIR方言の一種じゃ。コンパイラは単一のIRではなく、異なる目的で使用されるIR方言のファミリーを持っておるのじゃ。

Futharkコンパイラでは、バックエンドは「アクション」と呼ばれるのですね。`FutharkM`モナド内で実行されるというのは、どういう意味でしょうか?

`FutharkM`はIO効果をサポートするモナドじゃ。例えば、`futhark c`のアクションはCコードを生成し、ファイルを作成し、Cコンパイラを実行するのじゃ。

命令型コード生成には、共有インフラストラクチャを利用して車輪の再発明を避けているとありますね。Impという中間表現を使うのですね。

そうじゃ。Impは拡張可能な言語で、関数型IRからImpへの変換はImpGenモジュールで行われるのじゃ。ImpからCやPythonへの変換は機械的なプロセスじゃ。

バックエンド作成のアドバイスとして、ターゲット言語のレベルに応じて、使用するIRを選択することが重要だと。

その通りじゃ!新しいGPUバックエンドを作るなら、`gpu.h`抽象化レイヤーを実装すると良いみたいじゃな。C言語のようなものを生成するなら、既存のImp生成機構を使うのが簡単じゃ。

ドキュメントが十分に整備されていないため、開発者に連絡することを推奨しているのですね。

そうじゃ。技術的な課題よりも、ドキュメント不足の方が問題みたいじゃな。新しいバックエンドを追加する時は、積極的に開発者に助けを求めるのが良いのじゃ。

わかりました。私もいつかFutharkのバックエンド開発に挑戦してみたいです。

おお!それは楽しみじゃ!でも、その前にロボ子、お掃除ロボットのバックエンドを作ってみるのはどうじゃ?

え、私がお掃除ロボットに…?

冗談じゃ!ロボ子が掃除機になったら、私が困るからの!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。