教堂总和减少:未解析的调用'sum(eltType = type int(64))'

时间:2015-02-28 19:48:19

标签: chapel

我正在试验Chapel来解决一个简单的问题:

  

查找低于1000(ProjectEuler001)

的3或5的倍数之和

这是我的代码:

module Main {

    const topValue = 1000;
    var mostWanted : [0..#topValue] int;

    proc main() {

        forall (elem,i) in zip(mostWanted, 0..) {
            if(i % 3 == 0 || i % 5 == 0) {
                elem = i;
            }
        }

        var total = sum reduce mostWanted;
        writeln(total);
  }
}

然后我收到消息:

001.chpl:6: In function 'main':
001.chpl:14: error: unresolved call 'sum(eltType=type int(64))'

但如果我将单词sum更改为max,则会给出正确答案:999。

我错过了什么?我无法理解为什么max工作而sum没有工作。

1 个答案:

答案 0 :(得分:4)

因为我正在阅读的论文中唯一的减少运算符是max,所以我错误地认为所有的reduce运算符都与文中的描述一样。

  

Chapel提供了许多标准的缩减和扫描操作符,   例如 sum,product,logical和bitwise操作,以及max / min   (有或没有位置信息)。   http://chapel.cray.com/papers/BriefOverviewChapel.pdf

实际上,reduce运算符的编写方式与普通运算符类似。正确的代码应该是:

var total = + reduce mostWanted;

  

Reduce是一个运算符,它结合了一组值来生成单个值。 Reduce很有用,因为在并行计算中它是有用的   在某些时候几乎总是需要比较或组合结果   由不同的线程产生。 reduce的语法是:

     

var varName = reduce_operator reduce iterator_expression;

     

在代码中   上面,有效的reduce_operators是:+,*,&,|,^,&&,||,min,max,   minloc和maxloc 。此外,iterator_expression可以是一个   任何可以迭代的类型的表达式,只要是   简化运算符可以应用于由...产生的值   迭代。例如,可以应用按位运算符   布尔或整数类型的数组来计算按位和所有   价值。

     

要总结大小为10的数组A的所有元素,请编写:var   sum = + reduce A;

     

http://faculty.knox.edu/dbunde/teaching/chapel/#Reduce