bool MatMult::buildIL() { // marking all locals as defined allows remaining locals to be temps // which enables further optimization opportunities particularly for // floating point types AllLocalsHaveBeenDefined(); OMR::JitBuilder::IlValue *i, *j, *k; OMR::JitBuilder::IlValue *A_ik, *B_kj; OMR::JitBuilder::IlValue *A = Load("A"); OMR::JitBuilder::IlValue *B = Load("B"); OMR::JitBuilder::IlValue *C = Load("C"); OMR::JitBuilder::IlValue *N = Load("N"); OMR::JitBuilder::IlValue *zero = ConstInt32(0); OMR::JitBuilder::IlValue *one = ConstInt32(1); OMR::JitBuilder::IlBuilder *iloop=NULL, *jloop=NULL, *kloop=NULL; ForLoopUp("i", &iloop, zero, N, one); { i = iloop->Load("i"); iloop->ForLoopUp("j", &jloop, zero, N, one); { j = jloop->Load("j"); jloop->Store("sum", jloop-> ConstDouble(0.0)); jloop->ForLoopUp("k", &kloop, zero, N, one); { k = kloop->Load("k"); A_ik = Load2D(kloop, A, i, k, N); B_kj = Load2D(kloop, B, k, j, N); kloop->Store("sum", kloop-> Add( kloop-> Load("sum"), kloop-> Mul(A_ik, B_kj))); } Store2D(jloop, C, i, j, N, jloop->Load("sum")); } } Return(); return true; }
bool VectorMatMult::buildIL() { // marking all locals as defined allows remaining locals to be temps // which enables further optimization opportunities particularly for // floating point types AllLocalsHaveBeenDefined(); TR::IlValue *i, *j, *k; TR::IlValue *A_ik, *B_kj; TR::IlValue *A = Load("A"); TR::IlValue *B = Load("B"); TR::IlValue *C = Load("C"); TR::IlValue *N = Load("N"); TR::IlValue *zero = ConstInt32(0); TR::IlValue *one = ConstInt32(1); TR::IlValue *two = ConstInt32(2); TR::IlBuilder *iloop=NULL, *jloop=NULL, *kloop=NULL; ForLoopUp("i", &iloop, zero, N, one); { i = iloop->Load("i"); // vectorizing loop j iloop->ForLoopUp("j", &jloop, zero, N, two); { j = jloop->Load("j"); jloop->VectorStore("sum", // sum is a vector jloop-> ConstDouble(0.0)); jloop->ForLoopUp("k", &kloop, zero, N, one); { k = kloop->Load("k"); A_ik = Load2D(kloop, A, i, k, N); // A[i,k] is scalar over j B_kj = VectorLoad2D(kloop, B, k, j, N); // B[k,j] is vector over j kloop->VectorStore("sum", kloop-> Add( kloop-> VectorLoad("sum"), kloop-> Mul(A_ik, B_kj))); } VectorStore2D(jloop, C, i, j, N, jloop->Load("sum")); // C[i,j] is vector over j } } Return(); return true; }