This is an automated email from the ASF dual-hosted git repository.

markd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemds.git

commit d269cb905f057dff134256ac43c61e39308e91f6
Author: Mark Dokter <[email protected]>
AuthorDate: Fri Feb 5 02:09:22 2021 +0100

    [SYSTEMDS-2825] Avoid recompiling generated cuda operators
---
 .../apache/sysds/hops/codegen/SpoofCompiler.java   | 88 ++++++++++++++--------
 .../org/apache/sysds/hops/codegen/cplan/CNode.java |  6 +-
 .../apache/sysds/hops/codegen/cplan/CNodeCell.java |  8 +-
 .../apache/sysds/hops/codegen/cplan/CNodeTpl.java  |  2 +
 .../java/org/apache/sysds/lops/SpoofFused.java     | 12 ++-
 5 files changed, 77 insertions(+), 39 deletions(-)

diff --git a/src/main/java/org/apache/sysds/hops/codegen/SpoofCompiler.java 
b/src/main/java/org/apache/sysds/hops/codegen/SpoofCompiler.java
index 06bedbc..5cb0bdc 100644
--- a/src/main/java/org/apache/sysds/hops/codegen/SpoofCompiler.java
+++ b/src/main/java/org/apache/sysds/hops/codegen/SpoofCompiler.java
@@ -191,6 +191,22 @@ public class SpoofCompiler {
                        native_contexts = new HashMap<>();
 
                if(!native_contexts.containsKey(generator)) {
+                       String local_tmp = 
ConfigurationManager.getDMLConfig().getTextValue(DMLConfig.LOCAL_TMP_DIR);
+                       String jar_path = 
SpoofCompiler.class.getProtectionDomain().getCodeSource().getLocation().getPath();
+                       if(jar_path.contains(".jar")) {
+                               try {
+                                       extractCodegenSources(local_tmp, 
jar_path);
+                               }
+                               catch (IOException e){
+                                       LOG.error("Could not extract spoof 
files from jar: " + e);
+                                       API = GeneratorAPI.JAVA;
+                                       return;
+                               }
+                       }
+                       else {
+                               local_tmp = System.getProperty("user.dir") + 
"/src/main".replace("/", File.separator);
+                       }
+                       
                        if(generator == GeneratorAPI.CUDA) {
                                // init GPUs with jCuda to avoid double 
initialization problems
                                GPUContextPool.initializeGPU();
@@ -222,21 +238,7 @@ public class SpoofCompiler {
                                        isLoaded = 
NativeHelper.loadLibraryHelperFromResource(libName);
 
                                if(isLoaded) {
-                                       String local_tmp = 
ConfigurationManager.getDMLConfig().getTextValue(DMLConfig.LOCAL_TMP_DIR);
-                                       String jar_path = 
SpoofCompiler.class.getProtectionDomain().getCodeSource().getLocation().getPath();
-                                       if(jar_path.contains(".jar")) {
-                                               try {
-                                                       
extractCodegenSources(local_tmp, jar_path);
-                                               }
-                                               catch (IOException e){
-                                                       LOG.error("Could not 
extract spoof files from jar: " + e);
-                                                       API = GeneratorAPI.JAVA;
-                                                       return;
-                                               }
-                                       }
-                                       else {
-                                               local_tmp = 
System.getProperty("user.dir") + "/src/main".replace("/", File.separator);
-                                       }
+
 
                                        long ctx_ptr = 
initialize_cuda_context(0, local_tmp);
                                        if(ctx_ptr != 0) {
@@ -272,7 +274,8 @@ public class SpoofCompiler {
        
                        while (files_in_jar.hasMoreElements()) {
                                JarEntry in_file = files_in_jar.nextElement();
-                               if (in_file.getName().startsWith("cuda/") && 
!in_file.isDirectory()) {
+                               if ((in_file.getName().startsWith("cuda/") || 
in_file.getName().startsWith("java/")) &&
+                                               !in_file.isDirectory()) {
                                        File out_file = new File(resource_path, 
in_file.getName());
                                        out_file.deleteOnExit();
                                        File parent = out_file.getParentFile();
@@ -512,20 +515,24 @@ public class SpoofCompiler {
                                
                                if( cla == null ) {
                                        String src = "";
+                                       String src_cuda = "";
                                        boolean native_compiled_successfully = 
false;
+                                       src = tmp.getValue().codegen(false, 
GeneratorAPI.JAVA);
+                                       cla = 
CodegenUtils.compileClass("codegen."+ tmp.getValue().getClassname(), src);
 
-                                       if(API == GeneratorAPI.CUDA && 
tmp.getValue().isSupported(API)) {
-                                               src = 
tmp.getValue().codegen(false, GeneratorAPI.CUDA);
-                                               native_compiled_successfully = 
compile_cuda(tmp.getValue().getVarname(), src);
-                                               if 
(native_compiled_successfully)
-                                                       
CodegenUtils.putNativeOpData(new SpoofCUDA(tmp.getValue()));
+                                       if(API == GeneratorAPI.CUDA) {
+                                               
if(tmp.getValue().isSupported(API)) {
+                                                       src_cuda = 
tmp.getValue().codegen(false, GeneratorAPI.CUDA);
+                                                       
native_compiled_successfully = compile_cuda(tmp.getValue().getVarname(), 
src_cuda);
+                                                       
if(native_compiled_successfully)
+                                                               
CodegenUtils.putNativeOpData(new SpoofCUDA(tmp.getValue()));
+                                                       else {
+                                                               LOG.warn("CUDA 
compilation failed, falling back to JAVA");
+                                                               
tmp.getValue().setGeneratorAPI(GeneratorAPI.JAVA);
+                                                       }
+                                               }
                                                else
-                                                       LOG.warn("CUDA 
compilation failed, falling back to JAVA");
-                                       }
-
-                                       if(API == GeneratorAPI.JAVA || 
!native_compiled_successfully) {
-                                                       src = 
tmp.getValue().codegen(false, GeneratorAPI.JAVA);
-                                                       cla = 
CodegenUtils.compileClass("codegen."+ tmp.getValue().getClassname(), src);
+                                                       LOG.warn("CPlan " + 
tmp.getValue().getVarname() + " not supported by SPOOF CUDA");
                                        }
 
                                        //explain debug output cplans or 
generated source code
@@ -536,9 +543,16 @@ public class SpoofCompiler {
                                                        + 
Explain.explainCPlan(cplan.getValue().getValue()));
                                        }
                                        if( LOG.isTraceEnabled() || 
DMLScript.EXPLAIN.isRuntimeType(recompile) ) {
-                                               LOG.info("Codegen EXPLAIN 
(generated code for HopID: " + cplan.getKey() + 
+                                               LOG.info("JAVA Codegen EXPLAIN 
(generated code for HopID: " + cplan.getKey() +
                                                        ", line 
"+tmp.getValue().getBeginLine() + ", hash="+tmp.getValue().hashCode()+"):");
-                                               LOG.info(src);
+                                               
LOG.info(CodegenUtils.printWithLineNumber(src));
+                                               
+                                               if(API == GeneratorAPI.CUDA) {
+                                                       LOG.info("CUDA Codegen 
EXPLAIN (generated code for HopID: " + cplan.getKey() +
+                                                                       ", line 
" + tmp.getValue().getBeginLine() + ", hash=" + tmp.getValue().hashCode() + 
"):");
+
+                                                       
LOG.info(CodegenUtils.printWithLineNumber(src_cuda));
+                                               }
                                        }
 
                                        //maintain plan cache
@@ -550,8 +564,20 @@ public class SpoofCompiler {
                                }
                                
                                //make class available and maintain hits
-                               if(cla != null || API != GeneratorAPI.JAVA)
-                                       clas.put(cplan.getKey(), new 
Pair<Hop[],Class<?>>(tmp.getKey(),cla));
+                               if(cla != null) {
+                                       
if(CodegenUtils.getNativeOpData(cla.getName()) != null) {
+                                               if(tmp.getValue().getVarname() 
== null) {
+                                                       
tmp.getValue().setVarName(cla.getName());
+                                                       
if(tmp.getValue().getGeneratorAPI() != 
CodegenUtils.getNativeOpData(cla.getName())
+                                                               
.getCNodeTemplate().getGeneratorAPI())
+                                                       {
+                                                               
tmp.getValue().setGeneratorAPI(CodegenUtils.getNativeOpData(cla.getName())
+                                                                       
.getCNodeTemplate().getGeneratorAPI());
+                                                       }
+                                               }
+                                       }
+                                       clas.put(cplan.getKey(), new 
Pair<Hop[], Class<?>>(tmp.getKey(), cla));
+                               }
                                if( DMLScript.STATISTICS )
                                        
Statistics.incrementCodegenOpCacheTotal();
                        }
diff --git a/src/main/java/org/apache/sysds/hops/codegen/cplan/CNode.java 
b/src/main/java/org/apache/sysds/hops/codegen/cplan/CNode.java
index 6cdd225..bbe5454 100644
--- a/src/main/java/org/apache/sysds/hops/codegen/cplan/CNode.java
+++ b/src/main/java/org/apache/sysds/hops/codegen/cplan/CNode.java
@@ -73,7 +73,8 @@ public abstract class CNode
        }
        
        public String createVarname() {
-               _genVar = "TMP"+_seqVar.getNextID();
+               if(_genVar == null)
+                       _genVar = "TMP"+_seqVar.getNextID();
                return _genVar; 
        }
        
@@ -83,7 +84,6 @@ public abstract class CNode
 
        public String getVarname(GeneratorAPI api) { return getVarname(); }
 
-
        public String getVectorLength() {
                if( getVarname().startsWith("a") )
                        return "len";
@@ -264,4 +264,6 @@ public abstract class CNode
        }
 
        public abstract boolean isSupported(GeneratorAPI api);
+       
+       public void setVarName(String name) { _genVar = name; }
 }
diff --git a/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeCell.java 
b/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeCell.java
index 99fcbdc..74292b6 100644
--- a/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeCell.java
+++ b/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeCell.java
@@ -124,8 +124,12 @@ public class CNodeCell extends CNodeTpl
                //generate dense/sparse bodies
                String tmpDense = _output.codegen(false, api);
                _output.resetGenerated();
-
-               tmp = tmp.replace("%TMP%", createVarname());
+               
+               if(getVarname() == null)
+                       tmp = tmp.replace("%TMP%", createVarname());
+               else
+                       tmp = tmp.replace("%TMP%", getVarname());
+               
                tmp = tmp.replace("%BODY_dense%", tmpDense);
                
                //return last TMP
diff --git a/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeTpl.java 
b/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeTpl.java
index 2026eb3..552b951 100644
--- a/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeTpl.java
+++ b/src/main/java/org/apache/sysds/hops/codegen/cplan/CNodeTpl.java
@@ -236,4 +236,6 @@ public abstract class CNodeTpl extends CNode implements 
Cloneable
        }
 
        public GeneratorAPI getGeneratorAPI() { return api; }
+       
+       public void setGeneratorAPI(GeneratorAPI _api) { api = _api; }
 }
diff --git a/src/main/java/org/apache/sysds/lops/SpoofFused.java 
b/src/main/java/org/apache/sysds/lops/SpoofFused.java
index 0795f8f..b114f4d 100644
--- a/src/main/java/org/apache/sysds/lops/SpoofFused.java
+++ b/src/main/java/org/apache/sysds/lops/SpoofFused.java
@@ -34,7 +34,7 @@ public class SpoofFused extends Lop
        private final int _numThreads;
        private final String _genVarName;
 
-       private GeneratorAPI _api;
+       private final GeneratorAPI _api;
        public SpoofFused(ArrayList<Lop> inputs, DataType dt, ValueType vt, 
Class<?> cla, GeneratorAPI api,
                                          String genVarName, int k, ExecType 
etype) {
                super(Type.SpoofFused, dt, vt);
@@ -110,10 +110,14 @@ public class SpoofFused extends Lop
                sb.append( OPERAND_DELIMITOR );
                sb.append( _api);
                sb.append( OPERAND_DELIMITOR );
-               if(_class != null)
-                       sb.append( _class.getName() );
+               if(_api == GeneratorAPI.CUDA)
+                       if(_genVarName.contains("codegen"))
+                               sb.append(_genVarName);
+                       else
+                               sb.append("codegen.").append(_genVarName);
                else
-                       sb.append("codegen." + _genVarName);
+                       sb.append( _class.getName() );
+                       
 
 
                for(int i=0; i < inputs.length; i++) {

Reply via email to