From c16f8fe6d317cc30f30f4662c3f6ac42d33c53b0 Mon Sep 17 00:00:00 2001
From: Maria Kotsifakou <kotsifa2@illinois.edu>
Date: Tue, 11 Nov 2014 17:29:16 +0000
Subject: [PATCH] dfrg2llvm_nvptx pass provides information about the kernel
 name, local and global sizes.

---
 .../DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp         | 41 +++++++++++++++++--
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp
index fda7a18f1c..4fc3934246 100644
--- a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp
+++ b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp
@@ -72,6 +72,12 @@ namespace {
     Module &KernelM;
     BuildDFG &DFG;
     DFNode * KernelLaunchNode;
+    struct { Function * KF;
+             unsigned gridDim;
+             unsigned blockDim;
+             std::vector<Value*> localWGSize;
+             std::vector<Value*> globalWGSize;
+           } kernel;
 
     // Map from Old function associated with DFNode to new cloned function with
     // extra index and dimension arguments. This map also serves to find out if
@@ -614,8 +620,10 @@ namespace {
       insertRuntimeCalls(N, getKernelsModuleName(M), "matrixMul");
 
     } else {
-      DEBUG(errs() << "Found intermediate node. Generating device code.\n");
-      //TODO
+      DEBUG(errs() << "Found intermediate node. Getting size parameters.\n");
+      //TODO : Check that the arguments order of root to intermediate matches
+      // the intermediate to leaf.
+
     }
 
   }
@@ -633,10 +641,34 @@ namespace {
     int pLevel = PNode->getLevel();
     int pReplFactor = PNode->getNumOfDim();
 
-    if (!pLevel || !pReplFactor)
+    if (!pLevel || !pReplFactor) {
       KernelLaunchNode = PNode;
-    else
+      // TODO: Find a better way of choosing parameters
+      kernel.gridDim = N->getNumOfDim();
+      kernel.blockDim = N->getNumOfDim();
+      kernel.globalWGSize = N->getDimLimits();
+      IntegerType* IntTy = Type::getInt32Ty(KernelM.getContext());
+      // TODO: How to choose the div factor;
+      ConstantInt* divFactor = ConstantInt::getSigned(IntTy, (int64_t) 16);
+      std::vector<Value*> tmp(kernel.gridDim, divFactor);
+      for (unsigned i = 0; i < kernel.gridDim; i++) {
+        BinaryOperator* SDivInst = BinaryOperator::CreateSDiv(kernel.globalWGSize[i],tmp[i]);
+        kernel.localWGSize.push_back(SDivInst);
+      }
+    }
+    else {
       KernelLaunchNode = PNode->getParent();
+      kernel.gridDim = PNode->getNumOfDim();
+      kernel.blockDim = N->getNumOfDim();
+      // TODO: Handle different number of dimensions
+      assert((kernel.gridDim == kernel.blockDim) && "Dimension number must match");
+      std::vector<Value*> numOfBlocks = PNode->getDimLimits();
+      kernel.localWGSize = N->getDimLimits();
+      for (unsigned i = 0; i < kernel.gridDim; i++) {
+        BinaryOperator* MulInst = BinaryOperator::CreateMul(kernel.localWGSize[i],numOfBlocks[i]);
+        kernel.globalWGSize.push_back(MulInst);
+      }
+    }
 
     std::vector<IntrinsicInst *> IItoRemove;
     BuildDFG::HandleToDFNode Leaf_HandleToDFNodeMap;
@@ -890,6 +922,7 @@ namespace {
       (*ri)->eraseFromParent();
 
     addCLMetadata(F_nvptx);
+    kernel.KF = F_nvptx;
     DEBUG(errs() << KernelM);
 
     return;
-- 
GitLab