広い質問のお詫び!私はWASMを学んだし、Cでマンデルブロアルゴリズムを作成しました:WebAssemblyの機能がJavaScriptの機能よりも遅いのはなぜですか?
int iterateEquation(float x0, float y0, int maxiterations) {
float a = 0, b = 0, rx = 0, ry = 0;
int iterations = 0;
while (iterations < maxiterations && (rx * rx + ry * ry <= 4.0)) {
rx = a * a - b * b + x0;
ry = 2.0 * a * b + y0;
a = rx;
b = ry;
iterations++;
}
return iterations;
}
void mandelbrot(int *buf, float width, float height) {
for(float x = 0.0; x < width; x++) {
for(float y = 0.0; y < height; y++) {
// map to mandelbrot coordinates
float cx = (x - 150.0)/100.0;
float cy = (y - 75.0)/100.0;
int iterations = iterateEquation(cx, cy, 1000);
int loc = ((x + y * width) * 4);
// set the red and alpha components
*(buf + loc) = iterations > 100 ? 255 : 0;
*(buf + (loc+3)) = 255;
}
}
}
(明確にするために省略ファイル名入力/出力)を次のように私はWASMにコンパイルしてい
clang -emit-llvm -O3 --target=wasm32 ...
llc -march=wasm32 -filetype=asm ...
s2wasm --initial-memory 6553600 ...
wat2wasm ...
を私はロードしています
instance.exports.mandelbrot(0, 300, 150)
出力がキャンバスにコピーされているため、正しく実行されていることを確認できます。私のコンピュータ上では、上記の機能は約120msかかる。
しかし、ここでは、JavaScriptのと同等です:
const iterateEquation = (x0, y0, maxiterations) => {
let a = 0, b = 0, rx = 0, ry = 0;
let iterations = 0;
while (iterations < maxiterations && (rx * rx + ry * ry <= 4)) {
rx = a * a - b * b + x0;
ry = 2 * a * b + y0;
a = rx;
b = ry;
iterations++;
}
return iterations;
}
const mandelbrot = (data) => {
for (var x = 0; x < 300; x++) {
for (var y = 0; y < 150; y++) {
const cx = (x - 150)/100;
const cy = (y - 75)/100;
const res = iterateEquation(cx, cy, 1000);
const idx = (x + y * 300) * 4;
data[idx] = res > 100 ? 255 : 0;
data[idx+3] = 255;
}
}
}
のみ〜実行する62msかかります。
今私はWebAssemblyが非常に新しく、ひどく最適化されていないことを知っています。しかし、私はそれがこれより速くなければならないと感じるのを助けることができません!
私は見逃したかもしれない何かを明白に見つけられますか?
また、私のCコードは '0'から始まるメモリに直接書き込みます - これが安全かどうか疑問に思っていますか?スタックはページ・リニア・メモリにどこに格納されていますか?私はそれを上書きする危険性がありますか?ここで
を説明するためのフィドルです:
https://wasdk.github.io/WasmFiddle/?jvoh5
を実行すると、それは(そしてWASM JavaScriptの)2つの等価な実装のタイミングを記録します
jsfiddleのリンクのようなものを試してみることはできますか?どのブラウザでテストしていますか?あなたのスタックに関する質問はこちら(https://stackoverflow.com/a/43644387/3983557)、WebAssemblyでは0を使用しても安全ですが、WebAssemblyにコンパイルするとC++は不幸になることがあります。 –
私はWasmFiddleでこれを動作させることに縛りつけています。私が管理するとすぐに質問を更新します。ブラウザはChrome 61です。スタック回答へのリンクをありがとう。 – ColinE
@JFBastien - 私はフィドルを追加しました:-) – ColinE