Parallel javascript (River Trail)并不是一个函数

Parallel javascript (River Trail) combine is not a function

本文关键字:一个 函数 并不是 River Trail Parallel javascript      更新时间:2023-09-26

我正在尝试英特尔的River Trail项目。我安装了Firefox扩展(FFv19.02)。我还为Windows安装了openCL。所有的API方法似乎都在工作(map, reduce, scan, scatter, flatten, partition),除了"combine"方法:

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 

你知道是什么问题吗?

更新:

所以上面的例子没有意义,因为你不能用一个组合来迭代一个2D数组。为了简化,让我们举一个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草案中没有'combine'方法,但是将索引作为第二个参数传递给'map'。与上述等价的是:

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

实际上有两个api:

  1. River Trail API, GitHub原型文档
  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的bug tracker上关注bug 862897,了解这方面的进展。

尽管我们认为提案中的API总体上是更好的设计,但由于技术原因,我们无法在原型中实现该API。因此,我们决定保持其API的稳定,而不是中途发展原型。

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

我最终滚动了我自己的组合方法:

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_par',如combine:

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中尝试了本地的ParallelArray,并自己构建扩展,但在这两种情况下都没有"组合"方法

更新:由于某种原因,我不能在combine_par回调函数中使用this.get(index)。所以我用this[i]代替