def loadMatrix(self, mParams): src, dst = mParams['m'], mParams['nuM'] sL, sR = mParams['mL'], mParams['mR'] dL, dR = mParams['nuML'], mParams['nuMR'] M, N = mParams['M'], mParams['N'] nuMM, nuMN = mParams['nuMM'], mParams['nuMN'] mStruct, mAccess = mParams['struct'], mParams['access'] instructions = [] if IdentityMatrix.test(mStruct, mAccess, M, N): comm = Comment('%dx%d - %s' % (M, N, 'Identity')) instrs = [ Mov(V(1), ScaLoad(dst[dL.of(i), dR.of(i)])) for i in range(M) ] instructions.extend([comm] + instrs) if AllEntriesConstantMatrix.test(mStruct, mAccess, M, N): mat_type = mStruct.keys()[0] comm = Comment('%dx%d - %s' % (M, N, str(mat_type))) instrs = [] for i in range(M): for j in range(N): instrs.append( Mov(V(mat_type._const_value), ScaLoad(dst[dL.of(i), dR.of(j)]))) instructions.extend([comm] + instrs) return instructions
def Kro(self, s0Params, s1Params, dParams, opts): src0, src1, dst = s0Params['nuM'], s1Params['nuM'], dParams['nuM'] s0L, s0R = s0Params['nuML'], s0Params['nuMR'] s1L, s1R = s1Params['nuML'], s1Params['nuMR'] dL, dR = dParams['nuML'], dParams['nuMR'] M, K, N, P = s0Params['nuMM'], s0Params['nuMN'], s1Params[ 'nuMM'], s1Params['nuMN'] instructions = [] instructions += [ Comment("1-BLAC: " + str(M) + "x" + str(K) + " Kro " + str(N) + "x" + str(P)) ] for i in range(M): for k in range(K): for j in range(N): for p in range(P): instr = Mov( ScaMul(ScaLoad(src0[s0L.of(i), s0R.of(k)]), ScaLoad(src1[s1L.of(j), s1R.of(p)])), ScaLoad(dst[dL.of(i + j), dR.of(k + p)])) instructions += [instr] return instructions
def Neg(self, sParams, dParams, opts): src, dst = sParams['nuM'], dParams['nuM'] sL, sR = sParams['nuML'], sParams['nuMR'] dL, dR = dParams['nuML'], dParams['nuMR'] M, N = dParams['nuMM'], dParams['nuMN'] instructions = [] instructions += [Comment("1-BLAC: -(" + str(N) + "x" + str(M) + ")")] instr = Mov(ScaMul(V(-1), ScaLoad(src[sL.of(0), sR.of(0)])), ScaLoad(dst[dL.of(0), dR.of(0)])) instructions += [instr] return instructions
def T(self, sParams, dParams, opts): src, dst = sParams['nuM'], dParams['nuM'] sL, sR = sParams['nuML'], sParams['nuMR'] dL, dR = dParams['nuML'], dParams['nuMR'] M, N = dParams['nuMM'], dParams['nuMN'] instructions = [] instructions += [Comment("1-BLAC: (" + str(N) + "x" + str(M) + ")^T")] for i in range(M): for j in range(N): instr = Mov(ScaLoad(src[sL.of(j), sR.of(i)]), ScaLoad(dst[dL.of(i), dR.of(j)])) instructions += [instr] return instructions
def Copy(self, sParams, dParams, opts): sub, dst = sParams['nuM'], dParams['nuM'] subL, subR = sParams['nuML'], sParams['nuMR'] dL, dR = dParams['nuML'], dParams['nuMR'] M, N = sParams['nuMM'], sParams['nuMN'] instructions = [] instructions += [Comment("1-BLAC: Copy " + str(M) + "x" + str(N))] for i in range(M): for j in range(N): instr = Mov(ScaLoad(sub[subL.of(i), subR.of(j)]), ScaLoad(dst[dL.of(i), dR.of(j)])) instructions += [instr] return instructions
def Sub(self, s0Params, s1Params, dParams, opts): src0, src1, dst = s0Params['nuM'], s1Params['nuM'], dParams['nuM'] s0L, s0R = s0Params['nuML'], s0Params['nuMR'] s1L, s1R = s1Params['nuML'], s1Params['nuMR'] dL, dR = dParams['nuML'], dParams['nuMR'] M, N = dParams['nuMM'], dParams['nuMN'] instructions = [] instructions += [ Comment("1-BLAC: " + str(M) + "x" + str(N) + " - " + str(M) + "x" + str(N)) ] for i in range(M): for j in range(N): instr = Mov( ScaSub(ScaLoad(src0[s0L.of(i), s0R.of(j)]), ScaLoad(src1[s1L.of(i), s1R.of(j)])), ScaLoad(dst[dL.of(i), dR.of(j)])) instructions += [instr] return instructions # def LDiv(self, s0Params, s1Params, dParams, opts): # src0, src1, dst = s0Params['nuM'], s1Params['nuM'], dParams['nuM'] # s0L, s0R = s0Params['nuML'], s0Params['nuMR'] # s1L, s1R = s1Params['nuML'], s1Params['nuMR'] # dL, dR = dParams['nuML'], dParams['nuMR'] # M, N = s0Params['nuMM'], s1Params['nuMN'] # instructions = [] # # instructions += [ Comment("1-BLAC: " + str(M) + "x" + str(M) + " \ " + str(M) + "x" + str(N)) ] # # for j in range(N): # instr = Mov(ScaDiv(ScaLoad(src1[s1L.of(0),s1R.of(j)]), ScaLoad(src0[s0L.of(0),s0R.of(0)])), ScaLoad(dst[dL.of(0),dR.of(j)])) # instructions += [ instr ] # # for i in range(1, M): # # t0 = ScaMul(ScaLoad(src0[s0L.of(i),s0R.of(0)]), ScaLoad(dst[dL.of(0),dR.of(j)])) # # for k in range(1, i): # # t1 = ScaMul(ScaLoad(src0[s0L.of(i),s0R.of(k)]), ScaLoad(dst[dL.of(k),dR.of(j)])) # # t0 = ScaAdd(t0, t1) # # s = ScaSub(ScaLoad(src1[s1L.of(i),s1R.of(j)]), t0) # # instr = Mov(ScaDiv(s, ScaLoad(src0[s0L.of(i),s0R.of(i)])), ScaLoad(dst[dL.of(i),dR.of(j)])) # # instructions += [ instr ] return instructions
def Mul(self, s0Params, s1Params, dParams, opts): src0, src1, dst = s0Params['nuM'], s1Params['nuM'], dParams['nuM'] s0L, s0R = s0Params['nuML'], s0Params['nuMR'] s1L, s1R = s1Params['nuML'], s1Params['nuMR'] dL, dR = dParams['nuML'], dParams['nuMR'] M, K, N = s0Params['nuMM'], s0Params['nuMN'], s1Params['nuMN'] instructions = [] instructions += [ Comment("1-BLAC: " + str(M) + "x" + str(K) + " * " + str(K) + "x" + str(N)) ] for i in range(M): for j in range(N): instr = Mov( ScaMul(ScaLoad(src0[s0L.of(i), s0R.of(0)]), ScaLoad(src1[s1L.of(0), s1R.of(j)])), ScaLoad(dst[dL.of(i), dR.of(j)])) instructions += [instr] for k in range(1, K): for i in range(M): for j in range(N): t = ScaMul(ScaLoad(src0[s0L.of(i), s0R.of(k)]), ScaLoad(src1[s1L.of(k), s1R.of(j)])) instr = Mov(ScaAdd(ScaLoad(dst[dL.of(i), dR.of(j)]), t), ScaLoad(dst[dL.of(i), dR.of(j)])) instructions += [instr] return instructions
def Div(self, s0Params, s1Params, dParams, opts): src0, src1, dst = s0Params['nuM'], s1Params['nuM'], dParams['nuM'] s0L, s0R = s0Params['nuML'], s0Params['nuMR'] s1L, s1R = s1Params['nuML'], s1Params['nuMR'] dL, dR = dParams['nuML'], dParams['nuMR'] M, N = s0Params['nuMM'], s1Params['nuMN'] instructions = [] instructions += [ Comment("1-BLAC: " + str(M) + "x" + str(N) + " / " + str(N) + "x" + str(N)) ] for i in range(M): instr = Mov( ScaDiv(ScaLoad(src0[s0L.of(i), s0R.of(0)]), ScaLoad(src1[s1L.of(0), s1R.of(0)])), ScaLoad(dst[dL.of(i), dR.of(0)])) instructions += [instr] return instructions
def Zero(self, dParams, opts): dst = dParams['nuM'] dL, dR = dParams['nuML'], dParams['nuMR'] M, N = dParams['nuMM'], dParams['nuMN'] instructions = [] instructions += [Comment("1-BLAC: Zero " + str(M) + "x" + str(N))] for i in range(M): for j in range(N): instr = Mov(V(0), ScaLoad(dst[dL.of(i), dR.of(j)])) instructions.append(instr) return instructions