[igt-dev] [PATCH i-g-t 4/5] gen_opencl_kernel: add script to dynamically create OpenCL kernels
Mauro Carvalho Chehab
mauro.chehab at linux.intel.com
Mon Mar 27 13:41:18 UTC 2023
From: Mauro Carvalho Chehab <mchehab at kernel.org>
Compute tests can be produced by using OpenCL, by calling ocloc.
While this can be part of IGT building system, for now, let's add
a script for such purpose.
Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>
---
opencl/README | 11 +++++
opencl/gen_opencl_kernel | 86 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 97 insertions(+)
create mode 100644 opencl/README
create mode 100755 opencl/gen_opencl_kernel
diff --git a/opencl/README b/opencl/README
new file mode 100644
index 000000000000..5d0df2ad6c33
--- /dev/null
+++ b/opencl/README
@@ -0,0 +1,11 @@
+This directory contains some OpenCL compute files, and a script to be used
+to produce a header file containing the binaries for the CL against
+multiple platforms.
+
+For instance, to generate compute square Kernel binaries for TGL and ADL
+variants, use this:
+
+ opencl/gen_opencl_kernel xe_compute_square opencl/compute_square_kernel.cl \
+ xe_compute_square_kernels.c build/opencl tgllp adl-s adl-p adl-n
+
+ cp build/opencl/xe_compute_square_kernels.c lib/xe/
diff --git a/opencl/gen_opencl_kernel b/opencl/gen_opencl_kernel
new file mode 100755
index 000000000000..8bbc62a20cde
--- /dev/null
+++ b/opencl/gen_opencl_kernel
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+trap 'catch $LINENO' ERR
+
+catch() {
+ echo "error in line $1"
+ exit 1
+}
+
+
+# Parse arguments
+if [ $# -lt 5 ]; then
+ echo -e 'Usage:\n\t$0: <Kernel name> <kernel.cl> <header name> <dest_dir> <GPU models>' >&2
+ echo -e "Example:\n\t$0 kernel_foo kernel.cl kernels.c ../build/opencl tgllp rkl\n" >&2
+ exit 1
+fi
+
+kernel_name=$1
+shift
+
+kernel_cl=$1
+shift
+
+output_fname=$1
+shift
+
+dest_dir=$1
+shift
+
+mkdir -p $dest_dir
+
+args=( "$@" )
+
+echo $args
+
+out_files=""
+for i in "${args[@]}"; do
+ name="$dest_dir/${i}_${kernel_name}"
+ out="$name.h"
+ echo "Generating $out"
+ ocloc compile -q -file ${kernel_cl} -device ${i} -output ${name}_bin -output_no_suffix
+ xxd -n "${i}_${kernel_name}" -i ${name}_bin >$out
+ sed "s, ,\t,;s,.*unsigned int.*,,;s,\-,_,g;s,unsigned,static const unsigned," -i $out
+ sed "1 i// Match ID: $(ocloc ids $i|grep -v "Matched ids:")" -i $out
+ out_files+=" $out"
+done
+
+output_fname="$dest_dir/$output_fname"
+echo "Generating $output_fname"
+
+cat << PREFIX >$output_fname
+/* SPDX-License-Identifier: MIT */
+/*
+ * This file is auto-generated from $kernel_cl:
+ *
+PREFIX
+
+cat $kernel_cl |sed s,"^"," * ," >>$output_fname
+
+cat << INCLUDES >>$output_fname
+ */
+
+#include "intel_chipset.h"
+#include "lib/xe/xe_compute.h"
+
+INCLUDES
+
+cat $out_files >>$output_fname
+
+echo "const struct xe_compute_kernels ${kernel_name}_kernels[] = {" >>$output_fname
+
+for i in "${args[@]}"; do
+ out="$dest_dir/${i}_${kernel_name}.h"
+ echo -e "\t{" >>$output_fname; \
+ grep "Match ID:" $out|sed -E "s/.*\s([0-9]+)\.([0-9]+).*/\t\t.ip_ver = IP_VER(\1, \2),/" >>$output_fname;
+ grep unsigned $out|sed -E "s/.*\s+([_a-zA-Z0-9]+)\[\].*/\t\t.size = sizeof(\1),/" >>$output_fname;
+ grep unsigned $out|sed -E "s/.*\s+([_a-zA-Z0-9]+)\[\].*/\t\t.kernel = \1,/" >>$output_fname;
+ echo -e "\t}," >>$output_fname;
+done
+
+cat << SUFFIX >>$output_fname
+ {}
+};
+SUFFIX
+
+echo "Done."
--
2.39.2
More information about the igt-dev
mailing list