/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "opbase.hxx" #include "formula/vectortoken.hxx" using namespace formula; namespace sc { namespace opencl { DynamicKernelArgument::DynamicKernelArgument(const std::string &s, FormulaTreeNodeRef ft): mSymName(s), mFormulaTree(ft) {} /// Generate use/references to the argument void DynamicKernelArgument::GenDeclRef(std::stringstream &ss) const { ss << mSymName; } FormulaToken* DynamicKernelArgument::GetFormulaToken(void) const { return mFormulaTree->GetFormulaToken(); } VectorRef::VectorRef(const std::string &s, FormulaTreeNodeRef ft, int idx): DynamicKernelArgument(s, ft), mpClmem(NULL), mnIndex(idx) { if (mnIndex) { std::stringstream ss; ss << mSymName << "s" << mnIndex; mSymName = ss.str(); } } VectorRef::~VectorRef() { if (mpClmem) { cl_int ret = clReleaseMemObject(mpClmem); if (ret != CL_SUCCESS) throw OpenCLError(ret); } } /// Generate declaration void VectorRef::GenDecl(std::stringstream &ss) const { ss << "__global double *"<(DynamicKernelArgument::GetFormulaToken()); if (pSVR) ss << "(gid0 < " << pSVR->GetArrayLength() << "?"; ss << mSymName << "[gid0]"; if (pSVR) ss << ":NAN)"; return ss.str(); } size_t VectorRef::GetWindowSize(void) const { FormulaToken *pCur = mFormulaTree->GetFormulaToken(); assert(pCur); if (const formula::DoubleVectorRefToken* pCurDVR = dynamic_cast(pCur)) { return pCurDVR->GetRefRowSize(); } else if (dynamic_cast(pCur)) { // Prepare intermediate results (on CPU for now) return 1; } else { throw Unhandled(); } } void Normal::GenSlidingWindowFunction( std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments) { ArgVector argVector; ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; for (unsigned i = 0; i < vSubArguments.size(); i++) { if (i) ss << ","; vSubArguments[i]->GenSlidingWindowDecl(ss); argVector.push_back(vSubArguments[i]->GenSlidingWindowDeclRef()); } ss << ") {\n\t"; ss << "double tmp = " << GetBottom() <<";\n\t"; ss << "int gid0 = get_global_id(0);\n\t"; ss << "tmp = "; ss << Gen(argVector); ss << ";\n\t"; ss << "return tmp;\n"; ss << "}"; } void CheckVariables::GenTmpVariables( std::stringstream & ss, SubArguments & vSubArguments) { for(unsigned i=0;iGetFormulaToken()->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*pTmpDVR1= dynamic_cast(vSubArguments[i]->GetFormulaToken()); ss<< " if(singleIndex>="; ss<< pTmpDVR1->GetArrayLength(); ss<<" ||"; } if(vSubArguments[i]->GetFormulaToken()->GetType() == formula::svDoubleVectorRef) { const formula::DoubleVectorRefToken*pTmpDVR2= dynamic_cast(vSubArguments[i]->GetFormulaToken()); ss<< " if(doubleIndex>="; ss<< pTmpDVR2->GetArrayLength(); ss<<" ||"; } if(vSubArguments[i]->GetFormulaToken()->GetType() == formula::svDouble || vSubArguments[i]->GetFormulaToken()->GetOpCode() != ocPush) { ss<< " if("; } ss<< "isNan("; ss<< vSubArguments[i]->GenSlidingWindowDeclRef(); ss<<"))\n"; ss<< " tmp"; ss<< i; ss <<"=0;\n else \n"; #endif ss <<" tmp"; ss <GetFormulaToken()->GetType() == formula::svDouble) { ss <<" tmp"; ss <GenDeclRef(ss); if(vSubArguments[i]->GetFormulaToken()->GetType() == formula::svDoubleVectorRef) ss<<"["<< p.c_str()<< "]"; else if(vSubArguments[i]->GetFormulaToken()->GetType() == formula::svSingleVectorRef) ss<<"[get_group_id(1)]"; ss<<", 0);\n"; #else ss <<" tmp"; ss <GetFormulaToken()->GetType() == formula::svSingleVectorRef) ss<<"[get_group_id(1)]"; ss<<";\n"; #endif } void CheckVariables::CheckAllSubArgumentIsNan( std::stringstream & ss, SubArguments & vSubArguments) { ss<<" int k = gid0;\n"; for(unsigned i=0;i