GPU並列アルゴリズムライブラリ「massively」をなぜ作るのか

無職になり電験の勉強をする傍ら、 おもむろに 「massively」というRust製ライブラリの開発をはじめた。 この記事では、massivelyとは一体何なのか、なぜ作ったのかを話す。

https://github.com/akiradeveloper/massively

massivelyとは一体何なのか

massivelyとは、GPU並列アルゴリズムを提供するライブラリである。 CubeCLという抽象化基盤の上に構築されているため、実行するGPUを特定しない (各社のdGPU, iGPU, eGPU問わず実行出来る)。

どんなコードが書けるようになるか調べるには例を見るのがいい。 以下はtransform(あるいはmapということもある)の例である。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use cubecl::prelude::*;
use cubecl::wgpu::{WgpuDevice, WgpuRuntime};
use massively::{Executor, transform, op::UnaryOp};

#[cubecl::cube]
impl<R> UnaryOp<R, (f32,)> for AddOne
where
    R: cubecl::prelude::Runtime,
{
    type Output = (f32,);

    fn apply(input: (f32,)) -> (f32,) {
        (input.0 + 1.0,)
    }
}

fn main() -> common::Result {
    let exec = Executor::<WgpuRuntime>::new(WgpuDevice::Cpu);
    let values = exec.to_device(&[1.0_f32, 2.0, 3.0])?;

    let (output,) = transform(&exec, massively::SoA1(values.slice(..)), AddOne)?;

    assert_eq!(exec.to_host(&output)?, vec![2.0, 3.0, 4.0]);
    Ok(())
}

合計で40個以上のアルゴリズムを実装しており、 多様なGPU並列アプリケーションを実装可能である。 詳しくはリポジトリのexampleディレクトリを参照されたい。

あと、モンテカルロ法で円周率を求めるサンプルプログラムも書いたので、 興味があったら動かしてみてほしい。

https://github.com/akiradeveloper/pi-monte-carlo

なぜmassivelyが必要なのか

GPU並列計算というと一般には科学計算を思い浮かべがちであるが、 おれはmassivelyのメインターゲットは科学計算だとは考えていない。 むしろ、科学計算をするのであればより特化したハードウェアの上に特化した実装を行うのが正しい。 また、それだけのコストをかける経済的価値がある。 (プロトタイプとしてmassivelyを使うのは当然構わないが)

おれがmassivelyの売りはピーキーな性能ではなく、使いやすさ(Ease of Use)や ポータビリティであると考えるのは、システム(ストレージ、言語ランタイム、ウェブバックエンドなど) へのGPUアプリケーションをメインに考えているからである。

実は、こういったシステムにおいてGPUを適用し、 アクセラレータとして使ったりオフローディングを行う研究・製品開発はすでに存在する。

また、今までいくつかのウェブバックエンドに関わってきた経験からすると、 大抵のバックエンドにはこれらと似たようなバッチ処理(例えば集計処理とか)のようなものが走っており、 それらの中にはGPUで実行することが可能なものも少なくないように思う。 そしてそうすることで処理時間の短縮に繋がったり、 GPUへのオフローディングによってシステム全体の性能が実現出来る場合も多いはずである。

そして昨今では、これらのシステムはRust言語で書かれることが非常に多くなってきた。 だから、massivelyが存在すれば、これらのシステムをGPUでさらに最適化することが容易になる。 という理屈である。

仕事を探してます。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。