diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 91f9060..b44e6ca 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -24,6 +24,6 @@ ], "workspaceMount": "source=${localWorkspaceFolder},target=/sledge,type=bind,consistency=cached", "workspaceFolder": "/sledge", - "postCreateCommand": "make -C /sledge install && make -B -C /sledge/runtime/tests clean all", + "postCreateCommand": "make -C /sledge install && make -B -C /sledge/applications clean all", "containerUser": "dev", } diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index abb6e00..7040ced 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -101,7 +101,7 @@ jobs: uses: actions/cache@v2 with: path: ./runtime/bin/gocr_wasm.so - key: ${{ runner.os }}-gocr2-${{ hashFiles('./runtime/tests/Makefile', './runtime/tests/gocr/**', './runtime/compiletime/**') }} + key: ${{ runner.os }}-gocr2-${{ hashFiles('./applications/Makefile', './applications/gocr/**', './runtime/compiletime/**') }} if: success() || failure() - name: Hyde run: | @@ -138,7 +138,7 @@ jobs: uses: actions/cache@v2 with: path: ./runtime/bin/ekf_wasm.so - key: ${{ runner.os }}-gocr2-${{ hashFiles('./runtime/tests/Makefile', './runtime/tests/TinyEKF/**', './runtime/compiletime/**') }} + key: ${{ runner.os }}-gocr2-${{ hashFiles('./applications/Makefile', './applications/TinyEKF/**', './runtime/compiletime/**') }} if: success() || failure() - name: EKF one iteration run: | diff --git a/.gitignore b/.gitignore index 2adb446..9c078b4 100644 --- a/.gitignore +++ b/.gitignore @@ -52,10 +52,10 @@ dkms.conf runtime/tags runtime/bin -runtime/tests/tmp/ -runtime/tests/**/*.csv -runtime/tests/**/*.txt -runtime/tests/**/*.xlsx +applications/tmp/ +applications/**/*.csv +applications/**/*.txt +applications/**/*.xlsx # Swap Files *.swp diff --git a/.gitmodules b/.gitmodules index 5d1119b..ba212eb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,22 +12,22 @@ url = https://github.com/gwsystems/ck.git path = runtime/thirdparty/jsmn url = https://github.com/gwsystems/jsmn.git [submodule "runtime/tests/gocr"] -path = runtime/tests/gocr + path = applications/wasmception_apps/gocr url = https://github.com/gwsystems/gocr.git branch = sledge [submodule "runtime/tests/TinyEKF"] -path = runtime/tests/TinyEKF + path = applications/wasmception_apps/TinyEKF url = https://github.com/gwsystems/TinyEKF.git branch = sledge [submodule "runtime/tests/CMSIS_5_NN"] -path = runtime/tests/CMSIS_5_NN + path = applications/wasmception_apps/CMSIS_5_NN url = https://github.com/gwsystems/CMSIS_5_NN.git branch = sledge [submodule "runtime/tests/sod"] -path = runtime/tests/sod + path = applications/wasmception_apps/sod url = https://github.com/gwsystems/sod.git branch = sledge [submodule "runtime/tests/speechtotext"] -path = runtime/tests/speechtotext + path = applications/wasmception_apps/speechtotext url = https://github.com/gwsystems/speechtotext.git branch = sledge diff --git a/README.md b/README.md index ae1742e..931149f 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,10 @@ cd /sledge/runtime make clean all ``` -There are a set of benchmarking applications in the `/sledge/runtime/tests` directory. Run the following to compile all benchmarks runtime tests using the aWsm compiler and then copy all resulting `_wasm.so` files to /sledge/runtime/bin. +There are a set of benchmarking applications in the `/sledge/applications` directory. Run the following to compile all benchmarks runtime tests using the aWsm compiler and then copy all resulting `_wasm.so` files to /sledge/runtime/bin. ```bash -cd /sledge/runtime/tests/ +cd /sledge/applications/ make clean all ``` @@ -85,7 +85,7 @@ From the root project directory of the host environment (not the Docker containe cd runtime/bin/ ``` -Now run the sledgert binary, passing the JSON file of the serverless function we want to serve. Because serverless functions are loaded by SLEdge as shared libraries, we want to add the `runtime/tests/` directory to LD_LIBRARY_PATH. +Now run the sledgert binary, passing the JSON file of the serverless function we want to serve. Because serverless functions are loaded by SLEdge as shared libraries, we want to add the `applications/` directory to LD_LIBRARY_PATH. ```bash LD_LIBRARY_PATH="$(pwd):$LD_LIBRARY_PATH" ./sledgert ../tests/test_fibonacci.json diff --git a/runtime/tests/.gitignore b/applications/.gitignore similarity index 100% rename from runtime/tests/.gitignore rename to applications/.gitignore diff --git a/applications/Makefile b/applications/Makefile new file mode 100644 index 0000000..bf6c29b --- /dev/null +++ b/applications/Makefile @@ -0,0 +1,123 @@ +AWSMCC=awsm +CC=clang + +# Used by aWsm when compiling the *.wasm to *.bc +AWSMFLAGS= --inline-constant-globals --runtime-globals + +# Used by clang when compiling the *.so module +# --whole-archive causes the symbols in the listed static archive to be exported from the resulting *.so +# https://stackoverflow.com/questions/805555/ld-linker-question-the-whole-archive-option +CFLAGS=-O3 -flto +LDFLAGS=-fPIC -Wl +# LDFLAGS=-flto -fvisibility=hidden + +# Compiletime Components to link into *.so +SLEDGE_BASE_DIR=../ +SLEDGE_RT_DIR=${SLEDGE_BASE_DIR}/runtime/ +SLEDGE_COMPILETIME_INC=${SLEDGE_RT_DIR}/include +SLEDGE_COMPILETIME_SRC=${SLEDGE_RT_DIR}/compiletime/*.c + +.PHONY: all +all: \ + cifar10.install \ + empty.install \ + ekf.install \ + fibonacci.install \ + gocr.install \ + lpd.install \ + resize.install + +.PHONY: clean +clean: + @make clean -C ./wasmception_apps/fibonacci + @make clean -C ./wasmception_apps/empty + @make clean -C ./wasmception_apps/TinyEKF/extras/c/ -f wasm.mk + @make clean -C ./wasmception_apps/CMSIS_5_NN/ -f Makefile + @make clean -C ./wasmception_apps/gocr/src/ -f wasm.mk + @make clean -C ./wasmception_apps/sod/ + @rm -f *.wasm + @rm -rf dist + @rm -f ../runtime/bin/*.so + +dist: + mkdir -p dist + +%.bc: %.wasm dist + ${AWSMCC} ${AWSMFLAGS} $< -o $@ + +%_wasm.so: %.bc ${SLEDGE_COMPILETIME_SRC} + mkdir -p dist + ${CC} --shared -fPIC ${OPTFLAGS} -I${SLEDGE_COMPILETIME_INC} $^ -o $@ + +../runtime/bin/%_wasm.so: dist/%_wasm.so + cp $^ $@ + +# Fibonacci +./wasmception_apps/fibonacci/fibonacci.wasm: + @make fibonacci.wasm -C ./wasmception_apps/fibonacci + +dist/fibonacci.wasm: ./wasmception_apps/fibonacci/fibonacci.wasm dist + @cp ./wasmception_apps/fibonacci/fibonacci.wasm dist/fibonacci.wasm + +.PHONY: fibonacci.install +fibonacci.install: ../runtime/bin/fibonacci_wasm.so + +# Empty +./wasmception_apps/empty/empty.wasm: + @make empty.wasm -C ./wasmception_apps/empty + +dist/empty.wasm: ./wasmception_apps/empty/empty.wasm dist + @cp ./wasmception_apps/empty/empty.wasm dist/empty.wasm + +.PHONY: empty.install +empty.install: ../runtime/bin/empty_wasm.so + +# EKF +./wasmception_apps/TinyEKF/extras/c/gps_ekf_fn.wasm: + @make gps_ekf_fn.wasm -C ./wasmception_apps/TinyEKF/extras/c/ -f wasm.mk + +dist/ekf.wasm: ./wasmception_apps/TinyEKF/extras/c/gps_ekf_fn.wasm dist + @cp ./wasmception_apps/TinyEKF/extras/c/gps_ekf_fn.wasm dist/ekf.wasm + +.PHONY: ekf.install +ekf.install: ../runtime/bin/ekf_wasm.so + +# CIFAR10 +./wasmception_apps/CMSIS_5_NN/cifar10.wasm: + @make cifar10.wasm -C ./wasmception_apps/CMSIS_5_NN/ -f Makefile + +dist/cifar10.wasm: ./wasmception_apps/CMSIS_5_NN/cifar10.wasm dist + @cp ./wasmception_apps/CMSIS_5_NN/cifar10.wasm dist/cifar10.wasm + +.PHONY: cifar10.install +cifar10.install: ../runtime/bin/cifar10_wasm.so + +# GOCR +./wasmception_apps/gocr/src/gocr.wasm: + @make gocr.wasm -C ./wasmception_apps/gocr/src/ -f wasm.mk + +dist/gocr.wasm: ./wasmception_apps/gocr/src/gocr.wasm dist + @cp ./wasmception_apps/gocr/src/gocr.wasm dist/gocr.wasm + +.PHONY: gocr.install +gocr.install: ../runtime/bin/gocr_wasm.so + +# LPD +./wasmception_apps/sod/bin/license_plate_detection.wasm: + @make dir license_plate_detection.wasm -C ./wasmception_apps/sod/ + +dist/lpd.wasm: ./wasmception_apps/sod/bin/license_plate_detection.wasm dist + @cp ./wasmception_apps/sod/bin/license_plate_detection.wasm dist/lpd.wasm + +.PHONY: lpd.install +lpd.install: ../runtime/bin/lpd_wasm.so + +# Resize +./wasmception_apps/sod/bin/resize_image.wasm: + @make dir resize_image.wasm -C ./wasmception_apps/sod/ + +dist/resize.wasm: ./wasmception_apps/sod/bin/resize_image.wasm dist + @cp ./wasmception_apps/sod/bin/resize_image.wasm dist/resize.wasm + +.PHONY: resize.install +resize.install: ../runtime/bin/resize_wasm.so diff --git a/runtime/tests/CMSIS_5_NN b/applications/wasmception_apps/CMSIS_5_NN similarity index 100% rename from runtime/tests/CMSIS_5_NN rename to applications/wasmception_apps/CMSIS_5_NN diff --git a/runtime/tests/TinyEKF b/applications/wasmception_apps/TinyEKF similarity index 100% rename from runtime/tests/TinyEKF rename to applications/wasmception_apps/TinyEKF diff --git a/runtime/tests/empty/Makefile b/applications/wasmception_apps/empty/Makefile similarity index 100% rename from runtime/tests/empty/Makefile rename to applications/wasmception_apps/empty/Makefile diff --git a/runtime/tests/empty/main.c b/applications/wasmception_apps/empty/main.c similarity index 100% rename from runtime/tests/empty/main.c rename to applications/wasmception_apps/empty/main.c diff --git a/runtime/tests/empty/wasmception_hack.c b/applications/wasmception_apps/empty/wasmception_hack.c similarity index 100% rename from runtime/tests/empty/wasmception_hack.c rename to applications/wasmception_apps/empty/wasmception_hack.c diff --git a/runtime/tests/fibonacci/Makefile b/applications/wasmception_apps/fibonacci/Makefile similarity index 100% rename from runtime/tests/fibonacci/Makefile rename to applications/wasmception_apps/fibonacci/Makefile diff --git a/runtime/tests/fibonacci/main.c b/applications/wasmception_apps/fibonacci/main.c similarity index 100% rename from runtime/tests/fibonacci/main.c rename to applications/wasmception_apps/fibonacci/main.c diff --git a/runtime/tests/fibonacci/wasmception_hack.c b/applications/wasmception_apps/fibonacci/wasmception_hack.c similarity index 100% rename from runtime/tests/fibonacci/wasmception_hack.c rename to applications/wasmception_apps/fibonacci/wasmception_hack.c diff --git a/runtime/tests/gocr b/applications/wasmception_apps/gocr similarity index 100% rename from runtime/tests/gocr rename to applications/wasmception_apps/gocr diff --git a/runtime/tests/sod b/applications/wasmception_apps/sod similarity index 100% rename from runtime/tests/sod rename to applications/wasmception_apps/sod diff --git a/runtime/tests/speechtotext b/applications/wasmception_apps/speechtotext similarity index 100% rename from runtime/tests/speechtotext rename to applications/wasmception_apps/speechtotext diff --git a/format.sh b/format.sh index 6585bd1..6115c93 100755 --- a/format.sh +++ b/format.sh @@ -43,14 +43,14 @@ help() { dry_run() { find runtime \ - \( -path "runtime/thirdparty" -o -path "runtime/tests/gocr" -o -path "runtime/tests/TinyEKF" -o -path "runtime/tests/CMSIS_5_NN" -o -path "runtime/tests/sod" -o -path "runtime/tests/**/thirdparty" \) -prune -false -o \ + \( -path "runtime/thirdparty" -o -path "applications/gocr" -o -path "applications/TinyEKF" -o -path "applications/CMSIS_5_NN" -o -path "applications/sod" -o -path "applications/**/thirdparty" \) -prune -false -o \ -type f \( -iname \*.h -o -iname \*.c -o -iname \*.s \) -print \ | xargs clang-format -Werror -n -ferror-limit=0 } format() { find runtime \ - \( -path "runtime/thirdparty" -o -path "runtime/tests/gocr" -o -path "runtime/tests/TinyEKF" -o -path "runtime/tests/CMSIS_5_NN" -o -path "runtime/tests/sod" -o -path "runtime/tests/**/thirdparty" \) -prune -false -o \ + \( -path "runtime/thirdparty" -o -path "applications/gocr" -o -path "applications/TinyEKF" -o -path "applications/CMSIS_5_NN" -o -path "applications/sod" -o -path "applications/**/thirdparty" \) -prune -false -o \ -type f \( -iname \*.h -o -iname \*.c -o -iname \*.s \) -print \ | xargs clang-format -i } diff --git a/runtime/experiments/applications/ekf/by_iteration/README.md b/runtime/experiments/applications/ekf/by_iteration/README.md index cb9a60b..6357974 100644 --- a/runtime/experiments/applications/ekf/by_iteration/README.md +++ b/runtime/experiments/applications/ekf/by_iteration/README.md @@ -8,7 +8,7 @@ The `rust.sh` script stores per-run results to temporary files suffixed with `*. In order to be compatible with the stdin/stdout model of serverless, the input and output files are binary concatenations of various C structs. -See `main()` in `runtime/tests/TinyEKF/extras/c/gps_ekf_fn.c` for specifics. +See `main()` in `applications/TinyEKF/extras/c/gps_ekf_fn.c` for specifics. ## Useful parsing of the log diff --git a/runtime/experiments/applications/ekf/one_iteration/README.md b/runtime/experiments/applications/ekf/one_iteration/README.md index 20079c5..cf1a0bc 100644 --- a/runtime/experiments/applications/ekf/one_iteration/README.md +++ b/runtime/experiments/applications/ekf/one_iteration/README.md @@ -4,6 +4,6 @@ Executes TinyEKF as shows by [You Chong's GPS example](http://www.mathworks.com/ In order to be compatible with the stdin/stdout model of serverless, the input and output files are binary concatenations of various C structs. -See `main()` in `runtime/tests/TinyEKF/extras/c/gps_ekf_fn.c` for specifics. +See `main()` in `applications/TinyEKF/extras/c/gps_ekf_fn.c` for specifics. This test executes multiple iterations, comparing the binary result against a known memoized result stored at `expected_result.dat`. diff --git a/runtime/experiments/applications/imageresize/test/run.sh b/runtime/experiments/applications/imageresize/test/run.sh index 6b929eb..48d6d3f 100755 --- a/runtime/experiments/applications/imageresize/test/run.sh +++ b/runtime/experiments/applications/imageresize/test/run.sh @@ -60,7 +60,7 @@ validate_dependencies curl compare # Copy Flower Image if not here if [[ ! -f "./flower.jpg" ]]; then - cp "$__run_sh__project_base_absolute_path/runtime/tests/sod/bin/flower.jpg" ./flower.jpg + cp "$__run_sh__project_base_absolute_path/applications/sod/bin/flower.jpg" ./flower.jpg fi framework_init "$@" diff --git a/runtime/tests/Makefile b/runtime/tests/Makefile deleted file mode 100644 index 69fbb7f..0000000 --- a/runtime/tests/Makefile +++ /dev/null @@ -1,103 +0,0 @@ -AWSMCC=awsm -CC=clang - -OPTFLAGS=-O3 -flto - -# Compiletime Components to link into *.so -SLEDGE_BASE_DIR=../../ -SLEDGE_RT_DIR=${SLEDGE_BASE_DIR}/runtime/ -SLEDGE_COMPILETIME_INC=${SLEDGE_RT_DIR}/include -SLEDGE_COMPILETIME_SRC=${SLEDGE_RT_DIR}/compiletime/*.c - -.PHONY: all -all: fibonacci.install empty.install ekf.install cifar10.install gocr.install lpd.install resize.install - -.PHONY: clean -clean: - @make clean -C ./fibonacci - @make clean -C ./empty - @make clean -C ./TinyEKF/extras/c/ -f wasm.mk - @make clean -C ./CMSIS_5_NN/ -f Makefile - @make clean -C ./gocr/src/ -f wasm.mk - @make clean -C ./sod/ - @rm -f *.wasm - @rm -f ../../runtime/bin/*.so - -%.bc: %.wasm - ${AWSMCC} --inline-constant-globals --runtime-globals $^ -o $@ - -%_wasm.so: %.bc ${SLEDGE_COMPILETIME_SRC} - ${CC} --shared -fPIC ${OPTFLAGS} -I${SLEDGE_COMPILETIME_INC} $^ -o $@ - -../../runtime/bin/%.so: %.so - cp $^ $@ - -# Fibonacci -./fibonacci/fibonacci.wasm: - @make fibonacci.wasm -C ./fibonacci - -fibonacci.wasm: ./fibonacci/fibonacci.wasm - @cp ./fibonacci/fibonacci.wasm fibonacci.wasm - -.PHONY: fibonacci.install -fibonacci.install: ../../runtime/bin/fibonacci_wasm.so - -# Empty -./empty/empty.wasm: - @make empty.wasm -C ./empty - -empty.wasm: ./empty/empty.wasm - @cp ./empty/empty.wasm empty.wasm - -.PHONY: empty.install -empty.install: ../../runtime/bin/empty_wasm.so - -# EKF -./TinyEKF/extras/c/gps_ekf_fn.wasm: - @make gps_ekf_fn.wasm -C ./TinyEKF/extras/c/ -f wasm.mk - -ekf.wasm: ./TinyEKF/extras/c/gps_ekf_fn.wasm - @cp ./TinyEKF/extras/c/gps_ekf_fn.wasm ekf.wasm - -.PHONY: ekf.install -ekf.install: ../../runtime/bin/ekf_wasm.so - -# CIFAR10 -./CMSIS_5_NN/cifar10.wasm: - @make cifar10.wasm -C ./CMSIS_5_NN/ -f Makefile - -cifar10.wasm: ./CMSIS_5_NN/cifar10.wasm - @cp ./CMSIS_5_NN/cifar10.wasm cifar10.wasm - -.PHONY: cifar10.install -cifar10.install: ../../runtime/bin/cifar10_wasm.so - -# GOCR -./gocr/src/gocr.wasm: - @make gocr.wasm -C ./gocr/src/ -f wasm.mk - -gocr.wasm: ./gocr/src/gocr.wasm - @cp ./gocr/src/gocr.wasm gocr.wasm - -.PHONY: gocr.install -gocr.install: ../../runtime/bin/gocr_wasm.so - -# LPD -./sod/bin/license_plate_detection.wasm: - @make dir license_plate_detection.wasm -C ./sod/ - -lpd.wasm: ./sod/bin/license_plate_detection.wasm - @cp ./sod/bin/license_plate_detection.wasm lpd.wasm - -.PHONY: lpd.install -lpd.install: ../../runtime/bin/lpd_wasm.so - -# Resize -./sod/bin/resize_image.wasm: - @make dir resize_image.wasm -C ./sod/ - -resize.wasm: ./sod/bin/resize_image.wasm - @cp ./sod/bin/resize_image.wasm resize.wasm - -.PHONY: resize.install -resize.install: ../../runtime/bin/resize_wasm.so diff --git a/test.mk b/test.mk index a911568..b4494f7 100644 --- a/test.mk +++ b/test.mk @@ -5,7 +5,7 @@ # gocr - GNU Optical Character Recognition ./runtime/bin/gocr_wasm.so: - make gocr.install -C ./runtime/tests + make gocr.install -C ./applications PHONY: gocr__by_dpi gocr__by_dpi: ./runtime/bin/gocr_wasm.so @@ -43,7 +43,7 @@ gocr__all: \ # Extended Kalman Filter applied to binary GPS data ./runtime/bin/ekf_wasm.so: - make ekf.install -C ./runtime/tests + make ekf.install -C ./applications PHONY: ekf__by_iteration ekf__by_iteration: ./runtime/bin/ekf_wasm.so @@ -60,7 +60,7 @@ ekf__all: \ # CIFAR10-based Image Classification ./runtime/bin/cifar10_wasm.so: - make cifar10.install -C ./runtime/tests + make cifar10.install -C ./applications PHONY: cifar10__image_classification cifar10__image_classification: ./runtime/bin/cifar10_wasm.so @@ -75,7 +75,7 @@ cifar10__all: \ # SOD - Image Resize ./runtime/bin/resize_wasm.so: - make resize.install -C ./runtime/tests + make resize.install -C ./applications # Commented out command installs imagemagick. Requires password for sudo to install PHONY: sod__image_resize__test @@ -90,7 +90,7 @@ sod__image_resize__by_resolution: ./runtime/bin/resize_wasm.so # SOD - License Plate Detection ./runtime/bin/lpd_wasm.so: - make lpd.install -C ./runtime/tests + make lpd.install -C ./applications PHONY: sod__lpd__by_plate_count sod__lpd__by_plate_count: ./runtime/bin/lpd_wasm.so @@ -101,14 +101,14 @@ sod__all: sod__image_resize__test sod__image_resize__by_resolution sod__lpd__by_ # Scheduler Experiments with synthetic workloads ./runtime/bin/fibonacci_wasm.so: - make fibonacci.install -C ./runtime/tests + make fibonacci.install -C ./applications PHONY: fibonacci__bimodal fibonacci__bimodal: ./runtime/bin/fibonacci_wasm.so cd ./runtime/experiments/bimodal/ && ./run.sh ./runtime/bin/empty_wasm.so: - make empty.install -C ./runtime/tests + make empty.install -C ./applications PHONY: empty__concurrency empty__concurrency: ./runtime/bin/empty_wasm.so