From 8dc0ea33f541eda14ac8735b2eb44b53183c6fa4 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Mon, 7 Dec 2015 18:38:47 -0600
Subject: [PATCH] Support choosing target from the command line

---
 bin/loopy                | 22 ++++++++++++++++++----
 loopy/__init__.py        | 27 +++++++++++++++++++++++++++
 loopy/kernel/creation.py | 12 +++---------
 3 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/bin/loopy b/bin/loopy
index ef4be0744..31551c16d 100644
--- a/bin/loopy
+++ b/bin/loopy
@@ -63,7 +63,8 @@ def main():
     parser.add_argument("outfile", default="-", metavar="OUTPUT_FILE",
             help="Defaults to stdout ('-').", nargs='?')
     parser.add_argument("--lang", metavar="LANGUAGE", help="loopy|fortran")
-    parser.add_argument("--target")
+    parser.add_argument("--target", choices=("opencl", "ispc", "c", "cuda"),
+            default="opencl")
     parser.add_argument("--name")
     parser.add_argument("--transform")
     parser.add_argument("--edit-code", action="store_true")
@@ -72,9 +73,22 @@ def main():
     parser.add_argument("--print-ir", action="store_true")
     args = parser.parse_args()
 
-    if args.target is not None:
-        from warnings import warn
-        warn("--target option is deprecated and ignored")
+    if args.target == "opencl":
+        from loopy.target.opencl import OpenCLTarget
+        target = OpenCLTarget()
+    elif args.target == "ispc":
+        from loopy.target.ispc import ISPCTarget
+        target = ISPCTarget()
+    elif args.target == "c":
+        from loopy.target.c import CTarget
+        target = CTarget()
+    elif args.target == "cuda":
+        from loopy.target.cuda import CudaTarget
+        target = CudaTarget()
+    else:
+        raise ValueError("unknown target: %s" % target)
+
+    lp.set_default_target(target)
 
     lang = None
     if args.infile == "-":
diff --git a/loopy/__init__.py b/loopy/__init__.py
index 66fc351ee..86a5ce09c 100644
--- a/loopy/__init__.py
+++ b/loopy/__init__.py
@@ -354,4 +354,31 @@ def make_copy_kernel(new_dim_tags, old_dim_tags=None):
 # }}}
 
 
+# {{{ default target
+
+_DEFAULT_TARGET = None
+
+
+def _set_up_default_target():
+    try:
+        import pyopencl  # noqa
+    except ImportError:
+        from loopy.target.opencl import OpenCLTarget
+        target = OpenCLTarget()
+    else:
+        from loopy.target.pyopencl import PyOpenCLTarget
+        target = PyOpenCLTarget()
+
+    set_default_target(target)
+
+
+def set_default_target(target):
+    # deliberately undocumented for now
+    global _DEFAULT_TARGET
+    _DEFAULT_TARGET = target
+
+
+# }}}
+
+
 # vim: foldmethod=marker
diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py
index 4683ca905..9a0d5905a 100644
--- a/loopy/kernel/creation.py
+++ b/loopy/kernel/creation.py
@@ -1071,7 +1071,7 @@ def make_kernel(domains, instructions, kernel_data=["..."], **kwargs):
     :arg options: an instance of :class:`loopy.Options` or an equivalent
         string representation
     :arg target: an instance of :class:`loopy.target.TargetBase`, or *None*,
-        to use an OpenCL target.
+        to use the default target. (see :func:`loopy.set_default_target`)
     """
 
     defines = kwargs.pop("defines", {})
@@ -1083,14 +1083,8 @@ def make_kernel(domains, instructions, kernel_data=["..."], **kwargs):
     target = kwargs.pop("target", None)
 
     if target is None:
-        try:
-            import pyopencl  # noqa
-        except ImportError:
-            from loopy.target.opencl import OpenCLTarget
-            target = OpenCLTarget()
-        else:
-            from loopy.target.pyopencl import PyOpenCLTarget
-            target = PyOpenCLTarget()
+        from loopy import _DEFAULT_TARGET
+        target = _DEFAULT_TARGET
 
     if flags is not None:
         if options is not None:
-- 
GitLab