Idea: MUDA, MUltiple Data Accelerator language for high performance computing

by syoyo

[En]

Note that this is just in idea phase.

Since I started to code my renderer lucille(it goes back to 2003), I’ve been lived a lot in SIMD world(AltiVec, then SSE).
I think most of my coding time for lucille was spent for coding SIMD(AltiVec, SSE) part(ray-triangle intersection, data reorganization for SIMD friendly manner and so on), not for writing light transport algorithm.
SIMDizing was needed for efficient rendering.

I tried to portablize SIMD part of my renderer lucille as many as possible.
I.e. cross-platform safe(win, linux, darwin), cross-compiler safe(vc, gcc), SIMD engine-safe(SSE, AltiVec).
but making that portable and maintaining it is terribly non productive and was a lot of waste of my time.
(But, at least, knowing SIMD architecture raised my skills for CPU architecture and optimzation)

After I scratched the surface of great compiler tools such like LLVM, ANTLR and Elsa/Elkhound,
One idea have struck to my mind.

How about to write my own vector language which generates portable SIMD code?
It would save a lot of my SIMD coding time.

The idea of my own vector language codenamed MUDA(MUltiple Data Accelerator) language is as follows.

– C like language

First of all, MUDA is just like a generator which emits native C code with SIMD intrinsics from GLSL like vector language,
so that it can be easily combinable to non-SIMDized C/C++ languge.


// MUDA code
// input.mu

struct {
    int    i;
    vec4 a;
    vec4 b;
    vec4 c;
} mystruct;

mystruct s;
s.c = s.a + s.b;

is translated to native C code


$ # mudah is the MUDA High performance compiler
$ mudah -engine=SSE2 input.mu

#ifdef __GNUC__
#define MUDA_ATTRIB_ALIGN(x) __attribute__((aligned(x)))
#define MUDA_DECL_ALIGN(x)
#else  // VC
#define MUDA_ATTRIB_ALIGN(x)
#define MUDA_DECL_ALIGN(x) __declspec(align(x))
#endif

// structs and members are properly aligned.
typedef struct MUDA_DECL_ALIGN(16) _mystruct {
    // all variables are aligned to 16 bytes aligned address
    // regardress of its data size.
    int i; int pad0[3];
    __m128 a;
    __m128 b;
    __m128 c;
}  mystruct MUDA_ATTRIB_ALIGN(16);

mystruct s;

s.c = _mm_add_ps(s.a, s.b);

In the future, it would be a good idea to convert MUDA code directly to native asm code(to ensure alignment more robustly than C code),
but It would require deep knowledge of compiler backend technique(scheduling, register allocation, etc.)
I have no such a knowledge for now, thus MUDA -> C code is the shortest way to realize my idea.
# MUDA -> LLVM would be another possible solution.

– NOT a parallel language

MUDA is targetting to generate portable SIMD code more easily and does not consider automatic workload distribution over multi-core and multi-thread.

For now, MUDA is just one of my idea to code portable SIMD code more easily.
There is a risk that this idea doesn’t come true or accomplished because of my lackness of compiler skills ,
but… wouldn’t you think MUDA is a good idea?

[Ja]

MUDA とは?

2003 年から lucille を書いている間、ずーっと、SIMD 部分のコードをなるべくクロスプラットフォームに、gcc, vc どちらでもコンパイルできるようにし、そしてうまく SIMD エンジンの違いはマクロなどでラッピングして SIMD を使うコードはポータブルになるように、としてきました。そしてほとんどの lucille のコーディングの時間はレンダラのアルゴリズムを書くよりも SIMD 化にかけてきた気がします(SIMD 化しようとするとデータ構造から設計しなおしになりますし、アラインの保証もしなければなりません)。

が、正直もうめんどいです。こんなことをするのは生産的でありません。しかもいずれどうせ SIMD は一時的なもので、さらなる multicore 時代ではスカラに戻るでしょうから、直接 SIMD コードを書くのは将来のことを考えると得策ではありません。
(CPU のアーキティクチャを知るという意味では、SIMD コーディングは有益な経験でしたが)

しかも、VC では関数の引数に __m128 を含んだ構造体(or union)を値渡しできないので、ポインタで渡すしかありません。ri_vector_add みたいな単純な関数でもそれを呼んでいるコードの引数には`&’ がいっぱいです。
あまりコードがエレガントでありません。
(AltiVec とか float[4] でも使えるようにしたいので、ri_vector_t という union を定義して SIMD 型を隠蔽している)

そこで、LLVM, ANTLR, Elsa/Elkhound を一通り知った後、GLSL みたいなオレ仕様 vector 言語をつくって、そこから SIMD intrinsics を含んだ C コードを吐くコンパイラ(ジェネレータ)を作ればいいのでは、と思うようになりました。

そのオレ様仕様 vector 言語を MUDA と名付けることにしました。

ポータブルな SIMD のコードを出力に特化しているので、
*UDA みたいに自動でワークを並列化するとか GPU で走るとかはしません。

まだアイデア段階なので、実装するかどうかも怪しいですが(RSLtoLLVM もまだ完成してませんしね)、
vec4 -> __m128 にするとか構造体にアラインマクロとかつけるくらいなら、
プリプロセスレベルでそんなに労力もいらなそうなので(それにいまのところその程度の機能で十分じゃないかなと思っています)、
そこくらいまではやるかも。

Advertisements