Esempio n. 1
0
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;
   }
Esempio n. 2
0
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;
   }