2

我正在试验英特尔的 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 

知道问题可能是什么吗?

更新:

所以上面的例子没有意义,因为你不能用一个组合来迭代一个二维数组。为简化起见,让我们仅举一个 1D 示例:

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

如下所述,有两种 API 方法,一种由 Intel 提出,另一种是ECMAscript 草案。ECMAscript 草稿没有“组合”方法,但将索引作为第二个参数传递给“地图”。上面的等价物是:

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

实际上有两个API:

  1. GitHub 原型文档中描述的 River Trail API
  2. ECMAScript 提案中描述的并行 JavaScript API

两者略有不同,一个不同之处在于 ECMAScript 提案不再有 combine 方法,而是使用了一种提供相同功能的 map 风格。另一个区别是 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 稳定,而不是中途改进原型。

需要注意的一件重要事情是:Firefox 中的 Web 控制台似乎总是使用 ParallelArray 的内置版本,而不是特定网站使用的版本。因此,如果您想使用 GitHub 原型,最好使用我们 GitHub 网站上的交互式 shell。

希望这能消除混乱。

于 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 回答