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