编译Chapel五点模板基准代码时遇range(int(64),bounded,false)不支持错误
问题原因与修复方案
错误根源
你代码里的核心问题是forall循环错误使用了数组字面量语法:
- 代码中写的
forall i in [2..n - 1]是创建了包含单个range元素的数组,而非直接使用range本身。这会让循环变量i的类型变成range,而非预期的int。 - 后续执行
input[i - 1..i + 1, j - 1..j + 1]时,用range类型变量计算新range,会生成Chapel 1.8.2不支持的range(int(64),bounded,false)类型,从而触发报错。
单独编译过程时,编译器未进行完整的调用链类型检查,所以没暴露问题;编译整个程序时,主程序调用了这些过程,触发全面类型校验,错误才显现。
另外你的stencil过程里定义了copy变量却未使用,反而尝试修改默认是const的输入参数,这也是逻辑错误。
修复后的代码
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 - 去掉range外的方括号 */ 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; /* 去掉range外的方括号,同时使用copy变量而非修改输入参数 */ for t in 1..iterations do copy = relax(copy); return copy; } 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');
关键修复点
- 所有循环范围的
[a..b]改为a..b:直接使用range表达式而非包含range的数组字面量,确保循环变量是int类型。 - 修复
stencil过程逻辑:使用定义好的copy变量进行迭代计算,避免修改默认不可变的输入参数。
内容的提问来源于stack exchange,提问作者asdfldsfdfjjfddjf
相关产品推荐
相关产品推荐

