From 4182fa2967f437f3f15d467cdcf95048cad3588e Mon Sep 17 00:00:00 2001 From: Aaron Gutierrez Date: Tue, 18 Apr 2017 22:28:48 -0400 Subject: [PATCH] python regex-based preprocessor proof of concept --- .gitignore | 3 + prepro.py | 189 ++++++++++++++++++++++++++++++++++++++++ tests_ispcpp/hello.cpp | 23 +++++ tests_ispcpp/hello.ispc | 11 +++ 4 files changed, 226 insertions(+) create mode 100644 prepro.py create mode 100644 tests_ispcpp/hello.cpp create mode 100644 tests_ispcpp/hello.ispc diff --git a/.gitignore b/.gitignore index 55f655f0..92dcee5b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,9 @@ docs/doxygen docs/*.html tests*/*cpp tests*/*run +tests*/*.o +tests_ispcpp/*.h +tests_ispcpp/*pre* logs/ notify_log.log alloy_results_* diff --git a/prepro.py b/prepro.py new file mode 100644 index 00000000..3fa16032 --- /dev/null +++ b/prepro.py @@ -0,0 +1,189 @@ +import re +import sys + +def floating2float(function, idx): + typ = 'floating<' + str(idx) + '>' + return function.replace(typ, 'float') + +def floating2double(function, idx): + typ = 'floating<' + str(idx) + '>' + return function.replace(typ, 'double') + +def number2float(function, idx): + typ = 'number<' + str(idx) + '>' + return function.replace(typ, 'float') + +def number2double(function, idx): + typ = 'number<' + str(idx) + '>' + return function.replace(typ, 'double') + +def number2int(function, idx): + typ = 'number<' + str(idx) + '>' + return function.replace(typ, 'int') + +def number2long(function, idx): + typ = 'number<' + str(idx) + '>' + return function.replace(typ, 'long') + +def number2short(function, idx): + typ = 'number<' + str(idx) + '>' + return function.replace(typ, 'short') + +def number2char(function, idx): + typ = 'number<' + str(idx) + '>' + return function.replace(typ, 'char') + +def integer2int(function, idx): + typ = 'integer<' + str(idx) + '>' + return function.replace(typ, 'int') + +def integer2long(function, idx): + typ = 'integer<' + str(idx) + '>' + return function.replace(typ, 'long') + +def integer2short(function, idx): + typ = 'integer<' + str(idx) + '>' + return function.replace(typ, 'short') + +def integer2char(function, idx): + typ = 'integer<' + str(idx) + '>' + return function.replace(typ, 'char') + +def strip_types(fun, i): + return fun.replace('export', '').replace('void', '').replace('float', '') \ + .replace('double', '').replace('char','').replace('short','') \ + .replace('int','').replace('long','').replace('[]','') \ + .replace('*','').replace('(','_' + str(i) + '(') \ + .replace('uniform','') + +if __name__ == '__main__': + if (len(sys.argv) != 2): + print 'usage:\n\tpython ', + print sys.argv[0], + print '[file.ispc]' + exit(1) + + f = open(sys.argv[1], 'r') + function = f.read() + fun_def = re.findall(r'export [^{]*\)', function)[0] + print fun_def + f.close() + + floating = 0 + number = 0 + integer = 0 + + while ('floating<' + str(floating) + '>' in function): + floating += 1 + + while ('number<' + str(number) + '>' in function): + number += 1 + + while ('integer<' + str(integer) + '>' in function): + integer += 1 + + for i in range(len(re.findall(r'floating[\s+]', function))): + function = function.replace('floating ', + 'floating<' + str(floating) + '> ', 1) + fun_def = fun_def.replace('floating ', + 'floating<' + str(floating) + '> ', 1) + floating += 1 + + for i in range(len(re.findall(r'number[\s+]', function))): + function = function.replace('number ', + 'number<' + str(number) + '> ', 1) + fun_def = fun_def.replace('number ', + 'number<' + str(number) + '> ', 1) + number += 1 + + for i in range(len(re.findall(r'integer[\s+]', function))): + function = function.replace('integer ', + 'integer<' + str(integer) + '> ', 1) + fun_def = fun_def.replace('integer ', + 'integer<' + str(integer) + '> ', 1) + integer += 1 + + floats = [[(fun_def, function)]] + + for i in range(floating): + floats.append([]) + for (h, f) in floats[i]: + floats[i+1].append((floating2float(h, i), + floating2float(f, i) + )) + floats[i+1].append((floating2double(h, i), + floating2double(f, i) + )) + + numbers = [[]] + + for f in floats[floating]: + numbers[0].append(f) + + for i in range(number): + numbers.append([]) + for (h, f) in numbers[i]: + numbers[i+1].append((number2float(h, i), + number2float(f, i) + )) + numbers[i+1].append((number2double(h, i), + number2double(f, i) + )) + numbers[i+1].append((number2int(h, i), + number2int(f, i) + )) + numbers[i+1].append((number2long(h, i), + number2long(f, i) + )) + numbers[i+1].append((number2short(h, i), + number2short(f, i) + )) + numbers[i+1].append((number2char(h, i), + number2char(f, i) + )) + + integers = [[]] + + for f in numbers[number]: + integers[0].append(f) + + for i in range(integer): + integers.append([]) + for (h, f) in integers[i]: + integers[i+1].append((integer2int(h, i), + integer2int(f, i) + )) + integers[i+1].append((integer2long(h, i), + integer2long(f, i) + )) + integers[i+1].append((integer2short(h, i), + integer2short(f, i) + )) + integers[i+1].append((integer2char(h, i), + integer2char(f, i) + )) + + o = open(sys.argv[1] + '.pre.ispc', 'w') + hdr = open(sys.argv[1] + '.h', 'w') + + hdr.write('#include "' + '.'.join(sys.argv[1].split('.')[:-1]) + '.h"\n\n') + hdr.write('#ifndef _' + sys.argv[1].upper().replace('.', '_') + '_H_\n') + hdr.write('#define _' + sys.argv[1].upper().replace('.', '_') + '_H_\n') + hdr.write('namespace ispc {\n') + + fun_name = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*\(', function)[0][:-1] + + i = 0 + for (h, f) in integers[integer]: + o.write(f.replace(fun_name, fun_name+'_'+str(i), 1)) + hdr.write(h.replace('uniform','').replace('export','') \ + + '\n{\n\treturn ' + strip_types(h, i) + ';\n}\n\n') + + i += 1 + + o.close() + hdr.write('}\n') + hdr.write('#endif\n') + hdr.close() + + exit(0) diff --git a/tests_ispcpp/hello.cpp b/tests_ispcpp/hello.cpp new file mode 100644 index 00000000..219c7da8 --- /dev/null +++ b/tests_ispcpp/hello.cpp @@ -0,0 +1,23 @@ +#include +#include + +#include "hello.ispc.h" + +int main() { + float A[100]; + float B[100]; + double result[100]; + + for (int i=0; i<100; i++) { + A[i] = 100 - i; + B[i] = i*i; + } + + ispc::saxpy(100, 3.1415926535, (float*)&A, (float*)&B, (double*)&result); + + for (int i=0; i<100; i++) { + printf("%.6f\n", result[i]); + } + + return 0; +} diff --git a/tests_ispcpp/hello.ispc b/tests_ispcpp/hello.ispc new file mode 100644 index 00000000..7ded8820 --- /dev/null +++ b/tests_ispcpp/hello.ispc @@ -0,0 +1,11 @@ +export void saxpy(uniform int N, + uniform floating<0> scale, + uniform floating<1> X[], + uniform floating<1> Y[], + uniform floating<2> result[]) +{ + foreach (i = 0 ... N) { + floating<2> tmp = scale * X[i] + Y[i]; + result[i] = tmp; + } +}