4

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

求 1000 以下 3 或 5 的倍数之和 (ProjectEuler001)

这是我的代码:

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))'

但是如果我把这个词改成summax它会给我正确的答案:999。

我错过了什么?我不明白为什么max工作和sum不工作。

4

1 回答 1

4

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

Chapel 提供了许多标准的归约和扫描运算符,例如求和、乘积、逻辑和按位运算,以及最大/最小值 (有或没有位置信息)。 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

于 2015-02-28T20:12:19.310 回答