spatail除了这些新增的语法,像一般过程式语言中的比如if then else, switch case, while , for 这些控制流,以及一般的加减程序算术运算,布尔运算,这些还仍然可以用吗。函数的话必须是纯函数吗?我spatial在scala里面定制和新加了一些东西,但是不知道对于既有scala的内容的使用有哪些限制和约束
非常好的问题!这涉及到 Spatial 语言的能力边界和与宿主语言 Scala 的关系。
Spatial 中的传统控制流和运算
✅ 完全支持的 Scala 特性
1. 基本控制流
scala
Accel {// if-else 完全支持Foreach(0 until N by 1) { i =>If (condition(i)) {output(i) = processA(input(i))}.Else {output(i) = processB(input(i))}}// 嵌套 if-elseIf (x > 0) {If (y > 0) {result = 1}.Else {result = 2}}.Else {result = 3}
}
2. 布尔运算和算术运算
scala
Accel {// 布尔运算val cond1 = a > b && c < dval cond2 = x == y || z != wval cond3 = !flag// 算术运算val sum = a + bval product = x * yval mod = value % divisor// 比较运算val isEqual = a === b // Spatial 推荐用法val isGreater = a > b
}
3. 函数定义和调用
scala
// 可以在 Accel 内部定义的纯函数
def sigmoid(x: FixPt[TRUE,_16,_16]): FixPt[TRUE,_16,_16] = {mux(x > 4.0, 1.0, mux(x < -4.0, 0.0, 1.0 / (1.0 + exp(-x))))
}Accel {Foreach(0 until N by 1) { i =>// 调用函数output(i) = sigmoid(input(i))}
}
⚠️ 受限的 Scala 特性
1. 循环结构的限制
scala
Accel {// ✅ 支持:Spatial 的并行循环Foreach(0 until N by 1) { i => ... }Reduce(...){ ... }{ ... }// ❌ 不支持:传统的 Scala for/while 循环(在 Accel 内)// for (i <- 0 until N) { ... } // 编译错误!// while (condition) { ... } // 编译错误!// ✅ 但可以用在主机代码中(Accel 外部)for (i <- 0 until 10) {println(s"Host iteration $i")}
}