This is an automated email from the ASF dual-hosted git repository.
mboehm7 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemds.git
The following commit(s) were added to refs/heads/master by this push:
new f398899 [SYSTEMDS-2785] Initial design document for LLVM codegen
backend
f398899 is described below
commit f3988996fbe7c6baad3ddc2e9db31f9b0ba7a838
Author: FraCorti <[email protected]>
AuthorDate: Mon Jan 4 11:39:34 2021 +0100
[SYSTEMDS-2785] Initial design document for LLVM codegen backend
DIA project WS2020/21, part I
Closes #1138.
---
.../llvm-codegen-backend/llvm-codegen-design.md | 74 ++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/scripts/staging/llvm-codegen-backend/llvm-codegen-design.md
b/scripts/staging/llvm-codegen-backend/llvm-codegen-design.md
new file mode 100644
index 0000000..d45235c
--- /dev/null
+++ b/scripts/staging/llvm-codegen-backend/llvm-codegen-design.md
@@ -0,0 +1,74 @@
+<!--
+{% comment %}
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+{% end comment %}
+-->
+
+# LLVM Code Generator - Design Document
+
+## Introduction
+This document describes the initial design of the LLVM-based code generator
backend.
+
+The LLVM generator reuses the existing operator fusion optimizer. It has to
compile LLVM IR and execute from C++ based operator templates. I will add the
support for cellwise operation for dense matrices.
+
+## General Design
+
+### C++ design
+I will add a folder to put the LLVM header files and the jni_bridge files
(header and cpp) to interact through JNI in src/main/llvm, also I will use the
already written helper functions GET/RELEASE_ARRAY to handle input arrays from
java code.
+However, eventually only a native proxy shared library will be added to the
repository to avoid unnecessary dependencies, while LLVM libraries will be
loaded from the native library path similar to native BLAS libraries.
+
+The following method will be exposed:
+- initialize_llvm_context(): handle the creation of the LLVMContext and
retrieve the hardware specification (LLVM api);
+- compile_llvm(string: spoofLLVM) that take as input the generated spoof code
and add to the LLVM runtime;
+- execute_ir that pass the matrices and compute the cellwise operation and
return the result to continue the computation flow.
+
+I will add CMakeLists.txt to support the compilation and linking pass as it
was done for the CUDA files. Following the [LLVM
documentation](https://llvm.org/doxygen/) I've made a simple example (10.0.0
version) of the usage of the LLVM api that can be found
[here](https://github.com/FraCorti/llvm10.0.0-example/blob/main/main.cpp).
Technical note: I don't know which [LLVM version](https://releases.llvm.org/)
will be better to use since it has changed every two months the last year and
the [...]
+
+The SpoofLLVMContext class will have the following structure:
+
+```
+class SpoofLLVMContext{
+private:
+ std::unique_ptr<LLVMContext> context;
+ std::unique_ptr<SMDiagnostic> error;
+ std::string targetTriple; // target hardware specification
+ std::map<std::string, Module> loadedModules; // store the spoof operator
+ std::unique_ptr<ExecutionEngine> executionEngine; // runtime executor
+public:
+ bool loadModule(const std::string& modulePath);
+ GenericValue executeModuleFunction(std::string& functionName,
GenericValue* params); // execute operation
+};
+```
+
+I will add the needed LLVM header manually through Maven to handle the build
process ,as it was done for the CUDA files.
+
+### Java design
+I will introduce the new GeneratorAPI value "LLVM" inside the SpoofCompiler
class.
+After that I will add:
+ - in SpoofCompiler loadNativeCodeGenerator() an initilization of the LLVM
context through a native call;
+ - in SpoofCompiler optimize() a native call for compile LLVM IR retrieved
from the
+ - in CNode getLanguageTemplateClass() the call to the LLVM creation API.
+
+I will create a folder llvm inside the cplan folder hops/codegen/cplan/llvm
and I will create a CellWise class that follows the structure of the
java/CellWise but will return LLVM IR code as a template when the
getTemplate(SpoofCellwise.CellType ct) method is called.
+Then, following the CUDA implemented structure I will create a SpoofLLVM class
that store the name of the CNodeTpl generated. This SpoofLLVMs will be stored
inside CodeGenUtils new HashMap<String, SpoofLLVM> data structure. The
SpoofLLVM will have a native method for passing the operands and execute the
computation.
+
+## Steps
+I will first implement the syntactic part and then the runtime part. I will
follow the following steps:
+1. Add LLVM to GeneratorAPI in SpoofCompiler and manage it in the SystemDS
flow, then create the llvm/Cellwise class;
+2. Integrate LLVM header through Maven (but for tests only), and create the
JNI interface to interact with it;
+3. Creation of the SpoofLLVMContext C++ class and SpoofLLVM java class;
+4. Port SpoofCellWise.java to C++ and call it inside the generated LLVM IR
spoof template.
+
\ No newline at end of file