Hatena::ブログ(Diary)

最速チュパカブラ研究会

 | 

2009年11月16日 Goroutine でピクセルシェーダもどき

前回試さなかった goroutine を使ってポリゴンラスタライザとか書いてみました。 並列化といえばシェーダだよね? ということでシェーダ対応です(というのはちょっと詐欺。理由は後で)

f:id:gyuque:20091116174258p:image

こんな感じで、ポリゴンに法線マッピングを施して出力します。

複数の出力をつなげて動画にしたもの→ http://www.youtube.com/watch?v=XwB16g3vNBk&fmt=22

ベンチマーク

まずは、goroutine を使わない場合(計測のため、同じ処理を50回ループしています)

$ ./main 
 start
 10169 ms
done

次に、ポリゴンの描画処理を goroutine として呼び出してみます。ポリゴン単位で分散させてるのが「ちょっと詐欺」の理由です(描画順を指定できないので実用にならない)

$ ./main 
 start
 9838 ms
done

あれ、あんまり……

大丈夫。こうすると Go さんが本気を出してくれるらしいです。

$ GOMAXPROCS=2 ./main 
 start
 6917 ms
done

けっこう速くなった!(こんなもんか、という感じも)

f:id:gyuque:20091116180647p:image

CPU利用率も100%超に。

その他

複数個の返り値が気持ちいい。

vec3.X, vec3.Y, vec3.Z, _ = func_returns_vec4();

とかして、関数から返ってきた4次元ベクトルを(4要素目は捨てて)3次元ベクトルにそのままつっこんだり

func (v *Vec3) Components() (float, float, float) {
	return v.X, v.Y, v.Z;
}

としておいて

calcLength(0.0, 1.0, 2.0);
calcLength(vec3.Components()); // ← そのままパラメータ

とか。でも、

calcLength(vec2.Components(), 0); // ← これはダメ

これはできないみたい

よくわかってないこと

同期の方法。go した数だけ chan 空読みしかないの?

source code: http://github.com/gyuque/shadergo

 |