Skip to content

Commit

Permalink
Fat JAR that generates C code
Browse files Browse the repository at this point in the history
  • Loading branch information
Bastacyclop committed Mar 22, 2024
1 parent fc3423d commit 4211a82
Show file tree
Hide file tree
Showing 9 changed files with 99 additions and 1 deletion.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ modules.xml
*.pdf
*.gz
*.sc

float-safe-optimizer.jar
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,20 @@ The source code for the compiler is organised into sub-packages of the `shine` p

### Setup and Documentation
Please have a look at: https://rise-lang.org/doc/

### Float Safe Optimizer

This repository contains an optimizer executable that preserves floating-point semantics.
To build a Fat JAR executable:
```sh
sbt float_safe_optimizer/assembly
```
To optimize a Rise program and generate code:
```sh
java -Xss20m -Xms512m -Xmx4G -jar float-safe-optimizer.jar $function_name $rise_source_path $output_path
```
For example:
```sh
java -Xss20m -Xms512m -Xmx4G -jar float-safe-optimizer.jar add3 float-safe-optimizer/examples/add3Seq.rise float-safe-optimizer/examples/add3Seq.c
java -Xss20m -Xms512m -Xmx4G -jar float-safe-optimizer.jar add3 float-safe-optimizer/examples/add3.rise float-safe-optimizer/examples/add3.c
```
29 changes: 28 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,32 @@ clap := {
"echo y" #| (baseDirectory.value + "/lib/clap/buildClap.sh") !
}


lazy val float_safe_optimizer = (project in file("float-safe-optimizer"))
.dependsOn(riseAndShine)
.enablePlugins(AssemblyPlugin)
.settings(
excludeDependencies ++= Seq(
ExclusionRule("org.scala-lang.modules", s"scala-xml_${scalaBinaryVersion.value}"),
ExclusionRule("junit", "junit"),
ExclusionRule("com.novocode", "junit-interface"),
ExclusionRule("org.scalacheck", "scalacheck"),
ExclusionRule("org.scalatest", "scalatest"),
ExclusionRule("com.lihaoyi", s"os-lib_${scalaBinaryVersion.value}"),
ExclusionRule("com.typesafe.play", s"play-json_${scalaBinaryVersion.value}"),
ExclusionRule("org.rise-lang", s"opencl-executor_${scalaBinaryVersion.value}"),
ExclusionRule("org.rise-lang", "CUexecutor"),
ExclusionRule("org.elevate-lang", s"cuda-executor_${scalaBinaryVersion.value}"),
ExclusionRule("org.elevate-lang", s"meta_${scalaBinaryVersion.value}"),
),
name := "float-safe-optimizer",
javaOptions ++= Seq("-Xss20m", "-Xms512m", "-Xmx4G"),
assemblyOutputPath in assembly := file("float-safe-optimizer.jar"),
assemblyMergeStrategy in assembly := {
case PathList("fasterxml", xs @ _*) =>
MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
)

40 changes: 40 additions & 0 deletions float-safe-optimizer/Main.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package float_safe_optimizer

import util.gen
import rise.core.Expr
import rise.core.DSL.ToBeTyped

object Main {
def main(args: Array[String]): Unit = {
val name = args(0)
val exprSourcePath = args(1)
val outputPath = args(2)

val exprSource = util.readFile(exprSourcePath)
val untypedExpr = parseExpr(prefixImports(exprSource))
val typedExpr = untypedExpr.toExpr
val code = gen.openmp.function.asStringFromExpr(typedExpr)
util.writeToPath(outputPath, code)
}

def prefixImports(source: String): String =
s"""
|import rise.core.DSL._
|import rise.core.DSL.Type._
|import rise.core.DSL.HighLevelConstructs._
|import rise.core.primitives._
|import rise.core.types._
|import rise.core.types.DataType._
|import rise.openmp.DSL._
|import rise.openmp.primitives._
|$source
|""".stripMargin

def parseExpr(source: String): ToBeTyped[Expr] = {
import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox

val toolbox = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
toolbox.eval(toolbox.parse(source)).asInstanceOf[ToBeTyped[Expr]]
}
}
1 change: 1 addition & 0 deletions float-safe-optimizer/examples/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.c
3 changes: 3 additions & 0 deletions float-safe-optimizer/examples/add3.rise
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
depFun((n: Nat) => fun((n`.`i32) ->: (n`.`i32))(in =>
map(add(li32(3)))(in)
))
3 changes: 3 additions & 0 deletions float-safe-optimizer/examples/add3Seq.rise
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
depFun((n: Nat) => fun((n`.`i32) ->: (n`.`i32))(in =>
mapSeq(add(li32(3)))(in)
))
3 changes: 3 additions & 0 deletions float-safe-optimizer/examples/add3TypeError.rise
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
depFun((n: Nat) => fun((n`.`i32) ->: (n`.`f32))(in =>
map(add(li32(3)))(in)
))
2 changes: 2 additions & 0 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.0-RC1")
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.3.0")
addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.17")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0")
addDependencyTreePlugin

0 comments on commit 4211a82

Please sign in to comment.