Qiitaが10周年ということで,記念記事を書きました。「10年後のために今勉強しておきたい技術」という部門があるので,ちょうど良いので,10年後のために「私自身が」今勉強しておきたい技術というのを描いてみようと思います。
背景と経緯
2017年以来,私はElixir(エリクサー)におけるコード生成・最適化を研究テーマの主軸にし続けていました。ElixirでGPGPUを実現するPelemay(ペレメイ)シリーズ(旧名称 Hastega: ヘイスガ)にずっと取り組み続けています。一番最初に Lonestar ElixirConf 2019で発表した講演と,Pelemayという新名称を発表したElixirConf US 2019のYouTubeをここで改めて紹介します。
その後,Pelemayのアプリケーションとして,人工衛星の画像処理というテーマをいただき,ElixirConf US 2020にて発表を行いました。その後,A-STEPトライアウトの研究助成をいただけることになりました。
2021年現在もこのような研究開発をしつこく続けています。
Nxの登場
Elixirの作者のJosé Valim(ジョゼ・ヴァリム)自身が,PythonにおけるNumPyとTensorFlowのような位置付けである,機械学習応用向けのライブラリ Nx https://github.com/elixir-nx/nx を2020年に発表します。2021年になった現在も精力的に開発が続けられ,もうまもなくHexライブラリという形でリリースされる運びとなりました。
実はこれは,私の作ったPelemayで培った,メタプログラミングを元にしたJITコード生成の技術の影響を受けていて,かつPelemayとは異なるアプローチでJosé流に開発されたものなのです。Pelemayのとっているアプローチは,たとえば行列計算をElixirで書いたプログラムのパターンをメタプログラミングを用いて検出し,それに適合するC言語のプログラムを生成するというものでした。JoséがNxで取ったアプローチはそうではなく,Nxという標準ライブラリをJosé自ら提供し,Nxの流儀に準じたElixirコードをコンパイルするというものです。このようなアプローチは,私では実施し得ない,Joséならではのアプローチです。
またNxは,Pelemayが対象とした,Elixir標準の多倍長整数・浮動小数点数のリスト構造に対して高速化するのではなく,固定長整数・浮動小数点数のバイナリを用いた新たな構造体を定義し高速化を図っています。これはPelemayの性能上のボトルネックであった,型検査とリスト配列相互変換をなくすことができ,より高速化が図れることが期待できます。
他にもNxの特徴として,Googleの提供するXLAにコンパイルするEXLAというバックエンドを提供することで,GPUやTPU上で実行できるという点があります。これは標準的な方法に則っており,とても良い方法だと思います。
取り組みたいこと
しかしながら,コード最適化の専門家としては,より高速なNxバックエンドを作ってみたいという野心が私に芽生えました。
下記のGitHubレポジトリは,モノクロ画像フィルタを題材に,Nx(の標準バックエンドであるBinary Backend)と,NIF経由でのネイティブコード(Auto-Vectorizationによるものと,まだまだ拙いながら手でSIMDコードを書いたもの)の実行速度を比較するベンチマークです。
これを実行してみると,Nx(のBinary Backend)で実行したものに比べて,1000倍以上の高速化が図れる見込みがあることがわかりました。
一般に,CPUに比べてGPUがいつでも速いかというとそうでもなく,現状のGPUの弱点は,CPUとGPUの間のデータ転送が相互接続するバスの転送速度が上限となるので,一般的なPCIeバスの場合,ボトルネックになるという問題があるので,CPUの方が速い場合も多々あります。
したがって,今回提示したような高速化の可能性について研究する価値は大いにあると考えています。
Elixir, Nx, SIMD/ベクタ命令, GPU, FPGAプログラミングの高速化を極めたい!
そういう関心事なので,このような高速化を極めたいと思っています。
近年のMPSoC技術により,マルチコアCPUとGPUやFPGAを組み合わせたMPSoCが多数市販されています。これらの性能をソフトウェアで最大限まで引き出すことに没頭したいと思っています。そして,CPUとGPU,FPGAをどのように使い分けると良いのかについて,指針を得たいと思っています。
今,現在,まだまだ最新CPUの最大性能を引き出すようなコンパイラ技術は未熟だと思っています。同時に,GPUやFPGAについても,まだまだ研究の余地は多々あると感じています。
下記のPelemay Meetupは,そのようなことを研究していく場にしていこうと思っています。2021年9月現在は毎週火曜日に,朝のSIMD勉強会と夕方のBEAM/OTP対話を交互に開催するというスタイルを取っています。今までの会合についてはほぼ全て録画していて,Pelemay YouTubeチャネルで公開しています。もしこの記事で書いたようなことに興味関心がある方は,是非来てください。