summaryrefslogtreecommitdiff
path: root/scripts/generator
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2017-10-11 23:16:57 +0200
committerCedric Nugteren <web@cedricnugteren.nl>2017-10-11 23:16:57 +0200
commitb901809345848b44442c787380b13db5e5156df0 (patch)
tree0f14f5e38c08b604a96304abda427fe6ce3f64d6 /scripts/generator
parent9224da19ef384c1a7986587a682035905f63cf55 (diff)
Added first (untested) version of a CUDA API
Diffstat (limited to 'scripts/generator')
-rwxr-xr-xscripts/generator/generator.py12
-rw-r--r--scripts/generator/generator/cpp.py22
-rw-r--r--scripts/generator/generator/routine.py28
3 files changed, 47 insertions, 15 deletions
diff --git a/scripts/generator/generator.py b/scripts/generator/generator.py
index 0d34d7fe..520e3fc8 100755
--- a/scripts/generator/generator.py
+++ b/scripts/generator/generator.py
@@ -12,6 +12,8 @@
# clblast.cpp
# clblast_c.h
# clblast_c.cpp
+# clblast_cuda.h
+# clblast_cuda.cpp
# clblast_netlib_c.h
# clblast_netlib_c.cpp
# wrapper_clblas.h
@@ -41,9 +43,11 @@ FILES = [
"/test/wrapper_cublas.hpp",
"/include/clblast_netlib_c.h",
"/src/clblast_netlib_c.cpp",
+ "/include/clblast_cuda.h",
+ "/src/clblast_cuda.cpp",
]
-HEADER_LINES = [122, 21, 126, 24, 29, 41, 29, 65, 32]
-FOOTER_LINES = [25, 3, 27, 38, 6, 6, 6, 9, 2]
+HEADER_LINES = [122, 21, 126, 24, 29, 41, 29, 65, 32, 94, 21]
+FOOTER_LINES = [25, 3, 27, 38, 6, 6, 6, 9, 2, 25, 3]
HEADER_LINES_DOC = 0
FOOTER_LINES_DOC = 63
@@ -224,6 +228,10 @@ def main(argv):
if i == 8:
if not routine.batched:
body += cpp.clblast_netlib_c_cc(routine)
+ if i == 9:
+ body += cpp.clblast_h(routine, cuda=True)
+ if i == 10:
+ body += cpp.clblast_cc(routine, cuda=True)
f.write("".join(file_header))
f.write(body)
f.write("".join(file_footer))
diff --git a/scripts/generator/generator/cpp.py b/scripts/generator/generator/cpp.py
index 5fef3083..f1ee1959 100644
--- a/scripts/generator/generator/cpp.py
+++ b/scripts/generator/generator/cpp.py
@@ -36,19 +36,19 @@ HEADER = NL + SEPARATOR + """
""" + SEPARATOR + NL
-def clblast_h(routine):
+def clblast_h(routine, cuda=False):
"""The C++ API header (.h)"""
result = NL + "// " + routine.description + ": " + routine.short_names() + NL
- result += routine.routine_header_cpp(12, " = nullptr") + ";" + NL
+ result += routine.routine_header_cpp(12, " = nullptr", cuda) + ";" + NL
return result
-def clblast_cc(routine):
+def clblast_cc(routine, cuda=False):
"""The C++ API implementation (.cpp)"""
indent1 = " " * (15 + routine.length())
result = NL + "// " + routine.description + ": " + routine.short_names() + NL
if routine.implemented:
- result += routine.routine_header_cpp(12, "") + " {" + NL
+ result += routine.routine_header_cpp(12, "", cuda) + " {" + NL
result += " try {" + NL
result += " auto queue_cpp = Queue(*queue);" + NL
result += " auto routine = X" + routine.plain_name() + "<" + routine.template.template + ">(queue_cpp, event);" + NL
@@ -60,14 +60,22 @@ def clblast_cc(routine):
result += " return StatusCode::kSuccess;" + NL
result += " } catch (...) { return DispatchException(); }" + NL
else:
- result += routine.routine_header_type_cpp(12) + " {" + NL
+ result += routine.routine_header_type_cpp(12, cuda) + " {" + NL
result += " return StatusCode::kNotImplemented;" + NL
result += "}" + NL
for flavour in routine.flavours:
indent2 = " " * (34 + routine.length() + len(flavour.template))
result += "template StatusCode PUBLIC_API " + routine.capitalized_name() + "<" + flavour.template + ">("
- result += ("," + NL + indent2).join([a for a in routine.arguments_type(flavour)])
- result += "," + NL + indent2 + "cl_command_queue*, cl_event*);" + NL
+ arguments = routine.arguments_type(flavour)
+ if cuda:
+ arguments = [a.replace("cl_mem", "CUdeviceptr") for a in arguments]
+ result += ("," + NL + indent2).join([a for a in arguments])
+ result += "," + NL + indent2
+ if cuda:
+ result += "CUstream*"
+ else:
+ result += "cl_command_queue*, cl_event*"
+ result += ");" + NL
return result
diff --git a/scripts/generator/generator/routine.py b/scripts/generator/generator/routine.py
index cef7db87..c3c1f775 100644
--- a/scripts/generator/generator/routine.py
+++ b/scripts/generator/generator/routine.py
@@ -802,22 +802,38 @@ class Routine:
"""Retrieves a list of routine requirements for documentation"""
return self.requirements
- def routine_header_cpp(self, spaces, default_event):
+ def routine_header_cpp(self, spaces, default_event, cuda=False):
"""Retrieves the C++ templated definition for a routine"""
indent = " " * (spaces + self.length())
+ arguments = self.arguments_def(self.template)
+ if cuda:
+ arguments = [a.replace("cl_mem", "CUdeviceptr") for a in arguments]
result = "template <" + self.template.name + ">\n"
result += "StatusCode " + self.capitalized_name() + "("
- result += (",\n" + indent).join([a for a in self.arguments_def(self.template)])
- result += ",\n" + indent + "cl_command_queue* queue, cl_event* event" + default_event + ")"
+ result += (",\n" + indent).join([a for a in arguments])
+ result += ",\n" + indent
+ if cuda:
+ result += "CUstream* stream"
+ else:
+ result += "cl_command_queue* queue, cl_event* event" + default_event
+ result += ")"
return result
- def routine_header_type_cpp(self, spaces):
+ def routine_header_type_cpp(self, spaces, cuda=False):
"""As above, but now without variable names"""
indent = " " * (spaces + self.length())
+ arguments = self.arguments_type(self.template)
+ if cuda:
+ arguments = [a.replace("cl_mem", "CUdeviceptr") for a in arguments]
result = "template <" + self.template.name + ">\n"
result += "StatusCode " + self.capitalized_name() + "("
- result += (",\n" + indent).join([a for a in self.arguments_type(self.template)])
- result += ",\n" + indent + "cl_command_queue*, cl_event*)"
+ result += (",\n" + indent).join([a for a in arguments])
+ result += ",\n" + indent
+ if cuda:
+ result += "CUstream* stream"
+ else:
+ result += "cl_command_queue*, cl_event*"
+ result += ")"
return result
def routine_header_c(self, flavour, spaces, extra_qualifier):