void CPPCUDAHostSubroutineDirectLoop::createKernelFunctionCallStatement ( SgScopeStatement * scope) { using namespace SageInterface; using namespace SageBuilder; using namespace OP2VariableNames; using namespace OP2::RunTimeVariableNames; Debug::getInstance ()->debugMessage ( "Creating statement to call CUDA kernel", Debug::FUNCTION_LEVEL, __FILE__, __LINE__); SgExprListExp * actualParameters = buildExprListExp (); for (unsigned int i = 1; i <= parallelLoop->getNumberOfOpDatArgumentGroups (); ++i) { if (parallelLoop->isDuplicateOpDat (i) == false) { if (parallelLoop->isDirect (i) || parallelLoop->isReductionRequired (i)) { SgDotExp * dotExpression = buildDotExp ( variableDeclarations->getReference (getOpDatName (i)), buildOpaqueVarRefExp (data_d, subroutineScope)); SgCastExp * castExpression = buildCastExp (dotExpression, buildPointerType (parallelLoop->getOpDatBaseType (i))); actualParameters->append_expression (castExpression); } } } actualParameters->append_expression (variableDeclarations->getReference ( sharedMemoryOffset)); SgArrowExp * arrowExpression = buildArrowExp ( variableDeclarations->getReference (getOpSetName ()), buildOpaqueVarRefExp (size, subroutineScope)); actualParameters->append_expression (arrowExpression); SgCudaKernelExecConfig * kernelConfiguration = new SgCudaKernelExecConfig ( RoseHelper::getFileInfo (), variableDeclarations->getReference ( CUDA::blocksPerGrid), variableDeclarations->getReference ( CUDA::threadsPerBlock), variableDeclarations->getReference ( CUDA::sharedMemorySize)); kernelConfiguration->set_endOfConstruct (RoseHelper::getFileInfo ()); SgCudaKernelCallExp * kernelCallExpression = new SgCudaKernelCallExp ( RoseHelper::getFileInfo (), buildFunctionRefExp ( calleeSubroutine->getSubroutineName (), subroutineScope), actualParameters, kernelConfiguration); kernelCallExpression->set_endOfConstruct (RoseHelper::getFileInfo ()); appendStatement (buildExprStatement (kernelCallExpression), scope); }
void FortranCUDAHostSubroutineDirectLoop::createKernelFunctionCallStatement ( SgScopeStatement * scope) { using namespace SageInterface; using namespace SageBuilder; using namespace OP2VariableNames; using namespace ReductionVariableNames; using namespace OP2::RunTimeVariableNames; Debug::getInstance ()->debugMessage ( "Creating statement to call CUDA kernel", Debug::FUNCTION_LEVEL, __FILE__, __LINE__); SgExprListExp * actualParameters = buildExprListExp (); actualParameters->append_expression (variableDeclarations->getReference ( opDatDimensions)); actualParameters->append_expression (variableDeclarations->getReference ( opDatCardinalities)); for (unsigned int i = 1; i <= parallelLoop->getNumberOfOpDatArgumentGroups (); ++i) { if (parallelLoop->isDuplicateOpDat (i) == false) { if (parallelLoop->isReductionRequired (i)) { actualParameters->append_expression ( variableDeclarations->getReference (getReductionArrayDeviceName (i))); } else if (parallelLoop->isDirect (i)) { /* Carlo: no more opDatNDevice as arguments */ /* actualParameters->append_expression ( moduleDeclarations->getDeclarations()->getReference (getOpDatDeviceName (i) + parallelLoop->getUserSubroutineName () + postfixName));*/ } else if (parallelLoop->isRead (i)) { if (parallelLoop->isArray (i)) { actualParameters->append_expression ( variableDeclarations->getReference (getOpDatDeviceName (i))); } else { actualParameters->append_expression ( variableDeclarations->getReference (getOpDatHostName (i))); } } } } SgExpression * dotExpression = buildDotExp ( variableDeclarations->getReference (getOpSetName ()), buildDotExp ( buildOpaqueVarRefExp (Fortran::setPtr, scope), buildOpaqueVarRefExp (size, scope))); actualParameters->append_expression (dotExpression); actualParameters->append_expression (variableDeclarations->getReference ( warpSize)); actualParameters->append_expression (variableDeclarations->getReference ( sharedMemoryOffset)); SgCudaKernelExecConfig * kernelConfiguration = new SgCudaKernelExecConfig ( RoseHelper::getFileInfo (), variableDeclarations->getReference ( CUDA::blocksPerGrid), variableDeclarations->getReference ( CUDA::threadsPerBlock), variableDeclarations->getReference ( CUDA::sharedMemorySize), buildNullExpression ()); kernelConfiguration->set_endOfConstruct (RoseHelper::getFileInfo ()); SgCudaKernelCallExp * kernelCallExpression = new SgCudaKernelCallExp ( RoseHelper::getFileInfo (), buildFunctionRefExp ( calleeSubroutine->getSubroutineName (), subroutineScope), actualParameters, kernelConfiguration); kernelCallExpression->set_endOfConstruct (RoseHelper::getFileInfo ()); appendStatement (buildExprStatement (kernelCallExpression), scope); }