From ebf4e5a32ce2612ccc18002bf3afb746bec5643c Mon Sep 17 00:00:00 2001
From: Jammy Zhou <jammy.zhou@gmail.com>
Date: Fri, 19 Jan 2018 17:40:05 +0000
Subject: [PATCH] Additional mali target support (#794)

* Add Mali target support to tvm.target.create

* Add Mali target support in codegen
---
 include/tvm/build_module.h  |  3 +++
 python/tvm/target.py        |  3 +++
 src/codegen/build_module.cc | 12 +++++++++++-
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/include/tvm/build_module.h b/include/tvm/build_module.h
index 75062e819..ae7ca3ca6 100644
--- a/include/tvm/build_module.h
+++ b/include/tvm/build_module.h
@@ -73,6 +73,9 @@ EXPORT Target metal();
 /*! \return A target for rasp */
 EXPORT Target rasp();
 
+/*! \return A target for Mali */
+EXPORT Target mali();
+
 /*! \return A target for stackvm */
 EXPORT Target stackvm();
 
diff --git a/python/tvm/target.py b/python/tvm/target.py
index 3437e70e0..4584c1aa4 100644
--- a/python/tvm/target.py
+++ b/python/tvm/target.py
@@ -81,6 +81,7 @@ class Target(object):
     - :any:`tvm.target.rasp` create raspberry pi target
     - :any:`tvm.target.cuda` create CUDA target
     - :any:`tvm.target.rocm` create ROCM target
+    - :any:`tvm.target.mali` create Mali target
     """
     current = None
 
@@ -306,6 +307,8 @@ def create(target_str):
             device_name = item.split("=")[1]
     if device_name == "rasp":
         return rasp(arr[1:])
+    if device_name == "mali":
+        return mali(arr[1:])
     return Target(arr[0], arr[1:])
 
 
diff --git a/src/codegen/build_module.cc b/src/codegen/build_module.cc
index 2c419d43d..df71a4a41 100644
--- a/src/codegen/build_module.cc
+++ b/src/codegen/build_module.cc
@@ -70,7 +70,8 @@ Target Target::create(const std::string& target_str) {
 
   auto result = device_name == "rasp" ?
     target::rasp() :
-    TargetFromName(target_name);
+    (device_name == "mali" ? target::mali() :
+    TargetFromName(target_name));
 
   std::string item;
   while (ss >> item) {
@@ -116,6 +117,15 @@ Target rasp() {
   return Target("llvm", kDLCPU, 512, 1, keys, options);
 }
 
+Target mali() {
+  std::unordered_set<std::string> keys({ "rocm", "gpu" });
+  std::vector<std::string> options({
+    "-device=mali"
+  });
+  return Target("opencl", kDLOpenCL, 256, 1, keys, options);
+}
+
+
 Target stackvm() {
   std::unordered_set<std::string> keys({ "stackvm", "cpu" });
   std::vector<std::string> options;
-- 
GitLab