From e7c3ae27f2b8c9f20828f04dfd2125176911a9f6 Mon Sep 17 00:00:00 2001 From: Maria Kotsifakou <kotsifa2@illinois.edu> Date: Tue, 25 Nov 2014 23:02:10 +0000 Subject: [PATCH] Computing the local and global sizes for the two-level hierarchy case in dfg2llvm-nvptx. --- .../DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp index 6140b97c42..93059ccde2 100644 --- a/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp +++ b/llvm/lib/Transforms/DFG2LLVM_NVPTX/DFG2LLVM_NVPTX.cpp @@ -54,12 +54,12 @@ public: // calls class Kernel { public: - Kernel(Function* _KF, unsigned _gridDim = 0, std::vector<Value*> - _globalWGSize = std::vector<Value*>(), - std::vector<unsigned>* _inArgMap = NULL, unsigned _blockDim = 0, + Kernel(Function* _KF, std::vector<unsigned>* _inArgMap = NULL, + unsigned _gridDim = 0, std::vector<Value*> + _globalWGSize = std::vector<Value*>(), unsigned _blockDim = 0, std::vector<Value*> _localWGSize = std::vector<Value*>()) - : KernelFunction(_KF), - gridDim(_gridDim), globalWGSize(_globalWGSize), inArgMap(_inArgMap), + : KernelFunction(_KF), inArgMap(_inArgMap), + gridDim(_gridDim), globalWGSize(_globalWGSize), blockDim(_blockDim), localWGSize(_localWGSize) { assert(gridDim == globalWGSize.size() @@ -69,11 +69,11 @@ public: } Function* KernelFunction; + std::vector<unsigned>* inArgMap; unsigned gridDim; unsigned blockDim; std::vector<Value*> globalWGSize; std::vector<Value*> localWGSize; - std::vector<unsigned>* inArgMap; }; // Helper function declarations @@ -716,8 +716,8 @@ void CodeGenTraversal::codeGen(DFLeafNode* N) { if (!pLevel || !pReplFactor) { KernelLaunchNode = PNode; - kernel = new Kernel(NULL, N->getNumOfDim(), N->getDimLimits(), N->getInArgMap()); - // TODO: Find a better way of choosing parameters + kernel = new Kernel(NULL, N->getInArgMap(), N->getNumOfDim(), N->getDimLimits()); + // TODO: Find a good way of choosing parameters - is this required? //kernel->gridDim = N->getNumOfDim(); //kernel->blockDim = N->getNumOfDim(); //kernel->globalWGSize = N->getDimLimits(); @@ -736,17 +736,19 @@ void CodeGenTraversal::codeGen(DFLeafNode* N) { errs() << "*************** Entering else part **************\n"; KernelLaunchNode = PNode->getParent(); assert((PNode->getNumOfDim() == N->getNumOfDim()) && "Dimension number must match"); - /* - KernelLaunchNode = PNode->getParent(); - kernel->gridDim = PNode->getNumOfDim(); - kernel->blockDim = N->getNumOfDim(); - 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); - }*/ + // Contains the instructions generating the kernel configuration parameters + std::vector<Value*> globalWGSizeInsts; + for (unsigned i = 0; i < PNode->getNumOfDim(); i++) { + BinaryOperator* MulInst = BinaryOperator::CreateMul(PNode->getDimLimits()[i],N->getDimLimits()[i]); + globalWGSizeInsts.push_back(MulInst); + } + kernel = new Kernel(NULL, // kernel function + N->getInArgMap(), // kenel argument mapping + PNode->getNumOfDim(), // gridDim + globalWGSizeInsts, // grid size + N->getNumOfDim(), // blockDim + N->getDimLimits()); // block size + } std::vector<IntrinsicInst *> IItoRemove; -- GitLab