我正在试验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
没有工作。
答案 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;