2

Intel の River Trail プロジェクトを試しています。Firefox 拡張機能 (FFv19.02) をインストールしました。Windows用のopenCLもインストールしました。「combine」メソッドを除いて、すべての API メソッド (map、reduce、scan、scatter、flatten、partition) が機能しているようです。

var par_A = new ParallelArray([3,3], function(i,j) {return j});
console.log( par_A.combine(function(i) {return this.get(i) + 1} ) );

私は得る:

TypeError: par_A.combine is not a function 

問題が何であるか考えていますか?

アップデート:

したがって、1 つの結合で 2D 配列を反復処理できないため、上記の例は意味がありません。簡単にするために、1D の例を見てみましょう。

var par_A = new ParallelArray([1,2,3,4,5]);
console.log( par_A.combine(function(i) {return this.get(i) + 1} ) );

以下に示すように、Intel によって提案されたものとECMAscript ドラフトの 2 つの API メソッドがあります。ECMAscript ドラフトには「結合」メソッドはありませんが、「マップ」の 2 番目のパラメーターとしてインデックスを渡します。上記と同等のものは次のようになります。

var par_A = new ParallelArray([1,2,3.4.5]);
console.log( par_A.map(function(v, i) {return this.get(i) + 1} ) );
4

2 に答える 2

2

実際には 2 つの API があります。

  1. GitHub プロトタイプ ドキュメントに記載されている River Trail API
  2. ECMAScript 提案で説明されている Parallel JavaScript API

この 2 つはわずかに異なります。1 つの違いは、ECMAScript 提案には結合メソッドがなくなり、同じ機能を提供するマップのフレーバーを使用することです。もう 1 つの違いは、GitHub プロトタイプはインデックス ベクトルを使用するのに対し、提案バージョンは複数のスカラー インデックスを使用することです。プロトタイプの例は、次のように記述されます

var par_A = new ParallelArray([3,3], function(iv) {return iv[1]});
par_A.combine(2, function(i) {return this.get(i) + 1} );

提案バージョンでは、代わりに書く必要があります

var par_A = new ParallelArray([3,3], function(i,j) {return j});
par_A.map(2, function(e, i) { return this.get(i) + 1; });

残念ながら、多次元マップはまだ Firefox に実装されていません。Mozilla のバグ トラッカーでバグ 862897 を見ると、その進捗状況を確認できます。

提案の API の方が全体的に優れた設計であると考えていますが、技術的な理由からその API をプロトタイプに実装することはできません。そのため、プロトタイプを中途半端に進化させる代わりに、API を安定した状態に保つことにしました。

注意すべき重要な点の 1 つ: Firefox の Web コンソールは、特定の Web サイトで使用されているものではなく、組み込みバージョンの ParallelArray を常に使用しているようです。そのため、GitHub プロトタイプを試してみたい場合は、GitHub Web サイトのインタラクティブ シェルを使用するのが最適です。

これで混乱が解消されることを願っています。

于 2013-04-23T22:09:49.720 に答える
0

私は自分の結合方法を展開することになりました:

ParallelArray.prototype.combine_par = function ( fn) {
        var arr = this;
    var len = this.length;
    var indexes = [];

    //array to store the indexes [0,1,2...]
    for (var i=0;i<len;i++) {
        indexes.push(i);
    }

    indexes = new ParallelArray(indexes);

    return indexes.map(function(val) {
            //use fn.call to keep 'this' in context
            return fn.call(arr,val);
    });


}

次に、combine のように「combine_par」を呼び出すことができます。

var par_A = new ParallelArray([3,3,3,3]);
//returns < 0,1,2,3 >
console.log( par_A.combine_par(function(i) {return i} ) );

PS: firefox nightly でネイティブParallelArrayを試し、自分で拡張機能を構築しましたが、どちらの場合も「結合」メソッドはありませんでした

更新: 何らかの理由でthis.get(index)、combine_par コールバック関数内で使用できません。なのでthis[i]代わりに使っています。

于 2013-04-17T06:15:56.330 に答える