教堂 - 当前不支持使用类型为"range(int(64),bounded,false)"的边界定义的范围



标题"使用'range(int(64),bounded,false)'类型的边界定义的范围目前不支持"当我尝试编译这个5点模板基准代码时,显示为错误。是什么导致了这种情况?我使用的是chapel 1.8.2,仅在编译过程时它没有显示。

use Time;
use IO;
/* Use ./2dstencil --n=20000 --iterations=5 to run with different arguments. */
config const n: int = 10000;
config const iterations: int = 10;
const constants = [[0.0, 0.5, 0.0],
[0.5, 0.5, 0.5],
[0.0, 0.5, 0.0]];
proc relax(input: [1..n, 1..n] real)
{
var output: [1..n, 1..n] real;
/* Inner part */
forall i in [2..n - 1] do
forall j in [2..n - 1] do
output[i, j] = + reduce (input[i - 1..i + 1, j - 1..j + 1] * constants);
/* Boundary */
output[1, 1..n] = input[1, 1..n];
output[n, 1..n] = input[n, 1..n];
output[1..n, 1] = input[1..n, 1];
output[1..n, n] = input[1..n, n];
return output;
}
proc stencil(input: [1..n, 1..n] real)
{
var copy: [1..n, 1..n] real = input;
for t in [1..iterations] do
input = relax(input);
return input;
}
var input: [1..n, 1..n] real = 1;
var watch: Timer;
watch.start();
input = stencil(input);
watch.stop();
stderr.writeln('Anti-optimisation number: ', + reduce input, 'n');
stdout.writeln(watch.elapsed(), 'n');

这有点微妙,但问题的原因是以下循环:

forall i in [2..n - 1] do
forall j in [2..n - 1] do

具体来说,我相信你写这些是为了让I和j是从2到n-1循环的整数变量。为了获得这种行为,您需要从这些表达式中去掉方括号,原因如下:

Chapel中的语法[expr-list]表示一个数组文字,其元素是方括号之间的表达式。例如,forall i in [1, 3, 5, 4, 6]将遍历由该数组字面值表示的整数。在您的代码中,您正在循环一个范围值的1元素数组,其单个元素是范围2..n-1。因此,ij都是表示范围2..n-1的范围变量。

然后,在循环体中,当尝试对表达式i - 1..i + 1j - 1..j + 1求值时,编译器报错..操作符构造的范围的边界本身就是范围,而不是其他支持的类型(如整数或枚举)。

要查看此结果,请尝试以下代码:

forall i in [2..n-1] do
writeln(i, ": ", i.type:string);

输出:

2..99: range(int(64),bounded,false)

或者这个

config var n = 100;
var r = (1..n)..(1..n);

打印一个类似的错误。

这里发生的另一件事是,范围支持接受整数值的+/-操作符,这会导致范围的转换。因此,i + 1,其中i是单位步长范围,有效地变成了i.low+1..i.high+1

由于这种微妙,我打开了这个问题,询问Chapel是否应该在单元素数组字面量中要求尾随逗号,就像今天对单元素元组所做的那样。

相关内容

最新更新