import numpy as np from gimmik import generate_mm from glob import glob matfiles = glob('./*.txt') f = open('gimmik_cpu.c','w') f.write('#include "cblas.h"\n\n') f.write('#ifndef _NO_GIMMIK\n'); kernels_b0 = [] kernels_b1 = [] ids = [] for fname in matfiles: kid = int(open(fname,'r').readline()) mat = np.loadtxt(fname, skiprows=1) kname0 = 'gimmik_mm_cpu_'+str(kid)+'_b0' kname1 = 'gimmik_mm_cpu_'+str(kid)+'_b1' ids.append(kid) kernels_b0.append(kname0) kernels_b1.append(kname1) src0 = generate_mm(mat, np.float64, platform='c-omp', alpha=1.0, beta=0.0, funcn=kname0) src1 = generate_mm(mat, np.float64, platform='c-omp', alpha=1.0, beta=1.0, funcn=kname1) src = src0+'\n'+src1 f.write(src) f.write('\n') header = ('void gimmik_mm_cpu(int m, int n, int k, const double alpha,\n' ' const double* restrict a, int lda,\n' ' const double* restrict b, int ldb,\n' ' const double beta, const double* restrict c, int ldc,\n' ' unsigned long id)\n' '{\n\n' ' if (beta == 0.0)\n {\n switch(id)\n {\n') f.write(header) fcall = '(n, b, ldb, c, ldc); break;\n' cblas = 'cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc);' default = '\n default:\n '+cblas+' break;\n }\n }\n' for (kname,kid) in zip(kernels_b0,ids): f.write(' case '+str(kid)+':\n') f.write(' '+kname+fcall) f.write(default) f.write(' else if (beta == 1.0)\n {\n switch(id)\n {\n') for (kname,kid) in zip(kernels_b1,ids): f.write(' case '+str(kid)+':\n') f.write(' '+kname+fcall) f.write(default) f.write(' else\n {\n') f.write(' '+cblas+'\n') f.write(' }\n}\n') f.write('#endif\n\n') f.write('#ifdef _NO_GIMMIK\n') f.write('void gimmik_mm_cpu(int m, int n, int k, const double alpha,\n' ' const double* restrict a, int lda,\n' ' const double* restrict b, int ldb,\n' ' const double beta, const double* restrict c, int ldc,\n' ' unsigned long id)\n' '{\n cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc);\n}\n') f.write('#endif\n') f.close()