sc/Library_scopencl.mk | 1 sc/source/core/opencl/formulagroupcl.cxx | 44 ++++----- sc/source/core/opencl/op_financial.cxx | 5 - sc/source/core/opencl/op_math.cxx | 5 - sc/source/core/opencl/op_statistical.cxx | 5 - sc/source/core/opencl/opbase.cxx | 107 +++++++++++++++++++++++ sc/source/core/opencl/opbase.hxx | 141 ++++++++----------------------- 7 files changed, 173 insertions(+), 135 deletions(-)
New commits: commit 27de26f8bec9c6106fa92e4c50e05af6b1baa6e7 Author: Kohei Yoshida <[email protected]> Date: Tue Oct 29 16:54:30 2013 -0400 We don't need these headers. Change-Id: I8411b605edd27105bdc6cfc04acbd5cd9999e886 diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx index 04d505a..5ae04ff 100644 --- a/sc/source/core/opencl/op_financial.cxx +++ b/sc/source/core/opencl/op_financial.cxx @@ -16,12 +16,8 @@ #include "compiler.hxx" #include "interpre.hxx" #include "formula/vectortoken.hxx" -#include <list> -#include <iostream> #include <sstream> -#include <algorithm> -#include <memory> using namespace formula; namespace sc { namespace opencl { diff --git a/sc/source/core/opencl/op_math.cxx b/sc/source/core/opencl/op_math.cxx index 83f780a..33ca0e5 100644 --- a/sc/source/core/opencl/op_math.cxx +++ b/sc/source/core/opencl/op_math.cxx @@ -16,12 +16,8 @@ #include "compiler.hxx" #include "interpre.hxx" #include "formula/vectortoken.hxx" -#include <list> -#include <iostream> #include <sstream> -#include <algorithm> -#include <memory> using namespace formula; namespace sc { namespace opencl { diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index ec816c2..134a0ca 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -16,11 +16,7 @@ #include "compiler.hxx" #include "interpre.hxx" #include "formula/vectortoken.hxx" -#include <list> -#include <iostream> #include <sstream> -#include <algorithm> -#include <memory> using namespace formula; commit 4ab0aa496709bf4386caf0d3a6f0d7fd160b198d Author: Kohei Yoshida <[email protected]> Date: Tue Oct 29 16:52:01 2013 -0400 std::shared_ptr is C++11 specific. Use boost::shared_ptr instead. Change-Id: I8e6780ae5b5042a0521687f3a3535e74d7a35d23 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 665f822..1dd7c89 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -93,7 +93,7 @@ class ConstStringArgument: public DynamicKernelArgument { public: ConstStringArgument(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft): + boost::shared_ptr<FormulaTreeNode> ft): DynamicKernelArgument(s, ft) {} /// Generate declaration virtual void GenDecl(std::stringstream &ss) const @@ -151,7 +151,7 @@ class DynamicKernelConstantArgument: public DynamicKernelArgument { public: DynamicKernelConstantArgument(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft): + boost::shared_ptr<FormulaTreeNode> ft): DynamicKernelArgument(s, ft) {} /// Generate declaration virtual void GenDecl(std::stringstream &ss) const @@ -195,7 +195,7 @@ class DynamicKernelStringArgument: public DynamicKernelArgument { public: DynamicKernelStringArgument(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft): + boost::shared_ptr<FormulaTreeNode> ft): DynamicKernelArgument(s, ft) {} virtual void GenSlidingWindowFunction(std::stringstream &) {} @@ -268,7 +268,7 @@ class DynamicKernelSlidingArgument: public Base { public: DynamicKernelSlidingArgument(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft): + boost::shared_ptr<FormulaTreeNode> ft): Base(s, ft) { FormulaToken *t = ft->GetFormulaToken(); @@ -664,7 +664,7 @@ public: typedef std::unique_ptr<DynamicKernelArgument> SubArgument; DynamicKernelSoPArguments(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft); + boost::shared_ptr<FormulaTreeNode> ft); /// Create buffer and pass the buffer to a given kernel virtual size_t Marshal(cl_kernel k, int argno, int nVectorWidth) @@ -763,7 +763,7 @@ private: template <class Op> std::unique_ptr<DynamicKernelArgument> SoPHelper(const std::string &ts, - std::shared_ptr<FormulaTreeNode> ft) + boost::shared_ptr<FormulaTreeNode> ft) { return std::unique_ptr<DynamicKernelArgument>( new DynamicKernelSoPArguments<Op>(ts, ft)); @@ -771,7 +771,7 @@ std::unique_ptr<DynamicKernelArgument> SoPHelper(const std::string &ts, template <class Op> DynamicKernelSoPArguments<Op>::DynamicKernelSoPArguments(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft): + boost::shared_ptr<FormulaTreeNode> ft): DynamicKernelArgument(s, ft) { size_t nChildren = ft->Children.size(); @@ -1100,12 +1100,12 @@ DynamicKernelSoPArguments<Op>::DynamicKernelSoPArguments(const std::string &s, class SymbolTable { public: typedef std::map<const FormulaToken *, - std::shared_ptr<DynamicKernelArgument> > ArgumentMap; + boost::shared_ptr<DynamicKernelArgument> > ArgumentMap; // This avoids instability caused by using pointer as the key type - typedef std::list< std::shared_ptr<DynamicKernelArgument> > ArgumentList; + typedef std::list< boost::shared_ptr<DynamicKernelArgument> > ArgumentList; SymbolTable(void):mCurId(0) {} template <class T> - const DynamicKernelArgument *DeclRefArg(std::shared_ptr<FormulaTreeNode>); + const DynamicKernelArgument *DeclRefArg(boost::shared_ptr<FormulaTreeNode>); /// Used to generate sliding window helpers void DumpSlidingWindowFunctions(std::stringstream &ss) { @@ -1136,7 +1136,7 @@ void SymbolTable::Marshal(cl_kernel k, int nVectorWidth) /// Code generation class DynamicKernel { public: - DynamicKernel(std::shared_ptr<FormulaTreeNode> r):mpRoot(r), + DynamicKernel(boost::shared_ptr<FormulaTreeNode> r):mpRoot(r), mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL) {} /// Code generation in OpenCL std::string CodeGen() { @@ -1220,8 +1220,8 @@ public: ~DynamicKernel(); cl_mem GetResultBuffer(void) const { return mpResClmem; } private: - void TraverseAST(std::shared_ptr<FormulaTreeNode>); - std::shared_ptr<FormulaTreeNode> mpRoot; + void TraverseAST(boost::shared_ptr<FormulaTreeNode>); + boost::shared_ptr<FormulaTreeNode> mpRoot; SymbolTable mSyms; std::string mKernelSignature, mKernelHash; std::string mFullProgramSrc; @@ -1282,7 +1282,7 @@ void DynamicKernel::CreateKernel(void) // The template argument T must be a subclass of DynamicKernelArgument template <typename T> const DynamicKernelArgument *SymbolTable::DeclRefArg( - std::shared_ptr<FormulaTreeNode> t) + boost::shared_ptr<FormulaTreeNode> t) { FormulaToken *ref = t->GetFormulaToken(); ArgumentMap::iterator it = mSymbols.find(ref); @@ -1291,7 +1291,7 @@ const DynamicKernelArgument *SymbolTable::DeclRefArg( std::cerr << "DeclRefArg: Allocate a new symbol:"; std::stringstream ss; ss << "tmp"<< mCurId++; - std::shared_ptr<DynamicKernelArgument> new_arg(new T(ss.str(), t)); + boost::shared_ptr<DynamicKernelArgument> new_arg(new T(ss.str(), t)); mSymbols[ref] = new_arg; mParams.push_back(new_arg); std::cerr << ss.str() <<"\n"; @@ -1343,15 +1343,15 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, // Constructing "AST" FormulaTokenIterator aCode = rCode; std::list<FormulaToken *> list; - std::map<FormulaToken *, std::shared_ptr<FormulaTreeNode>> m_hash_map; + std::map<FormulaToken *, boost::shared_ptr<FormulaTreeNode>> m_hash_map; FormulaToken* pCur; while( (pCur = (FormulaToken*)(aCode.Next()) ) != NULL) { OpCode eOp = pCur->GetOpCode(); if ( eOp != ocPush ) { - std::shared_ptr<FormulaTreeNode> m_currNode = - std::shared_ptr<FormulaTreeNode>(new FormulaTreeNode(pCur)); + boost::shared_ptr<FormulaTreeNode> m_currNode = + boost::shared_ptr<FormulaTreeNode>(new FormulaTreeNode(pCur)); sal_uInt8 m_ParamCount = pCur->GetParamCount(); for(int i=0; i<m_ParamCount; i++) { @@ -1365,8 +1365,8 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, } else { - std::shared_ptr<FormulaTreeNode> m_ChildTreeNode = - std::shared_ptr<FormulaTreeNode>( + boost::shared_ptr<FormulaTreeNode> m_ChildTreeNode = + boost::shared_ptr<FormulaTreeNode>( new FormulaTreeNode(m_TempFormula)); m_currNode->Children.push_back(m_ChildTreeNode); } @@ -1378,8 +1378,8 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, list.push_back(pCur); } - std::shared_ptr<FormulaTreeNode> Root = - std::shared_ptr<FormulaTreeNode>(new FormulaTreeNode(NULL)); + boost::shared_ptr<FormulaTreeNode> Root = + boost::shared_ptr<FormulaTreeNode>(new FormulaTreeNode(NULL)); Root->Children.push_back(m_hash_map[list.back()]); // Code generation mpKernel = new DynamicKernel(Root); diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx index eef9eba..e7eae13 100644 --- a/sc/source/core/opencl/opbase.cxx +++ b/sc/source/core/opencl/opbase.cxx @@ -16,7 +16,7 @@ using namespace formula; namespace sc { namespace opencl { DynamicKernelArgument::DynamicKernelArgument(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft): + boost::shared_ptr<FormulaTreeNode> ft): mSymName(s), mFormulaTree(ft), mpClmem(NULL) {} /// Generate declaration diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx index 5f17d85..a982533 100644 --- a/sc/source/core/opencl/opbase.hxx +++ b/sc/source/core/opencl/opbase.hxx @@ -14,6 +14,8 @@ #include "formula/token.hxx" +#include <boost/shared_ptr.hpp> + #define ISNAN namespace sc { namespace opencl { @@ -49,7 +51,7 @@ public: { Children.reserve(8); } - std::vector<std::shared_ptr<FormulaTreeNode>> Children; + std::vector<boost::shared_ptr<FormulaTreeNode> > Children; formula::FormulaToken *GetFormulaToken(void) const { return mpCurrentFormula; @@ -66,7 +68,7 @@ private: class DynamicKernelArgument { public: - DynamicKernelArgument(const std::string &s, std::shared_ptr<FormulaTreeNode> ft); + DynamicKernelArgument(const std::string &s, boost::shared_ptr<FormulaTreeNode> ft); const std::string &GetNameAsString(void) const { return mSymName; } /// Generate declaration @@ -94,7 +96,7 @@ public: const std::string& GetName(void) const { return mSymName; } protected: const std::string mSymName; - std::shared_ptr<FormulaTreeNode> mFormulaTree; + boost::shared_ptr<FormulaTreeNode> mFormulaTree; // Used by marshaling cl_mem mpClmem; }; commit f53c5d8ca7f701be0683667e4941ad70ec44578b Author: Kohei Yoshida <[email protected]> Date: Tue Oct 29 16:40:57 2013 -0400 Properly split opbase.hxx into header and source files. Change-Id: I6ab5a792b5c31b44b8f302e45ec3511d3e2d6cdc diff --git a/sc/Library_scopencl.mk b/sc/Library_scopencl.mk index 0efe3cf..2fb8cfc 100644 --- a/sc/Library_scopencl.mk +++ b/sc/Library_scopencl.mk @@ -38,6 +38,7 @@ $(eval $(call gb_Library_use_libraries,scopencl,\ $(eval $(call gb_Library_add_exception_objects,scopencl,\ sc/source/core/opencl/formulagroupcl \ sc/source/core/opencl/openclwrapper \ + sc/source/core/opencl/opbase \ sc/source/core/opencl/op_financial \ sc/source/core/opencl/op_database \ sc/source/core/opencl/op_math \ diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx index a638530..04d505a 100644 --- a/sc/source/core/opencl/op_financial.cxx +++ b/sc/source/core/opencl/op_financial.cxx @@ -15,6 +15,7 @@ #include "tokenarray.hxx" #include "compiler.hxx" #include "interpre.hxx" +#include "formula/vectortoken.hxx" #include <list> #include <iostream> #include <sstream> diff --git a/sc/source/core/opencl/op_math.cxx b/sc/source/core/opencl/op_math.cxx index 03fc9d3..83f780a 100644 --- a/sc/source/core/opencl/op_math.cxx +++ b/sc/source/core/opencl/op_math.cxx @@ -15,6 +15,7 @@ #include "tokenarray.hxx" #include "compiler.hxx" #include "interpre.hxx" +#include "formula/vectortoken.hxx" #include <list> #include <iostream> #include <sstream> diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 221d241..ec816c2 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -15,6 +15,7 @@ #include "tokenarray.hxx" #include "compiler.hxx" #include "interpre.hxx" +#include "formula/vectortoken.hxx" #include <list> #include <iostream> #include <sstream> diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx new file mode 100644 index 0000000..eef9eba --- /dev/null +++ b/sc/source/core/opencl/opbase.cxx @@ -0,0 +1,107 @@ +/* -*- 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, + std::shared_ptr<FormulaTreeNode> ft): + mSymName(s), mFormulaTree(ft), mpClmem(NULL) {} + +/// Generate declaration +void DynamicKernelArgument::GenDecl(std::stringstream &ss) const +{ + ss << "__global double *"<<mSymName; +} + +/// When declared as input to a sliding window function +void DynamicKernelArgument::GenSlidingWindowDecl(std::stringstream &ss) const +{ + GenDecl(ss); +} + +/// When referenced in a sliding window function +std::string DynamicKernelArgument::GenSlidingWindowDeclRef(bool) const +{ + std::stringstream ss; + ss << mSymName << "[gid0]"; + return ss.str(); +} + +/// Generate use/references to the argument +void DynamicKernelArgument::GenDeclRef(std::stringstream &ss) const +{ + ss << mSymName; +} + +DynamicKernelArgument::~DynamicKernelArgument() +{ + //std::cerr << "~DynamicKernelArgument: " << mSymName <<"\n"; + if (mpClmem) { + //std::cerr << "\tFreeing cl_mem of " << mSymName <<"\n"; + cl_int ret = clReleaseMemObject(mpClmem); + if (ret != CL_SUCCESS) + throw OpenCLError(ret); + } +} + +FormulaToken* DynamicKernelArgument::GetFormulaToken(void) const +{ + return mFormulaTree->GetFormulaToken(); +} + +size_t DynamicKernelArgument::GetWindowSize(void) const +{ + FormulaToken *pCur = mFormulaTree->GetFormulaToken(); + assert(pCur); + if (auto *pCurDVR = + dynamic_cast<const formula::DoubleVectorRefToken *>(pCur)) + { + return pCurDVR->GetRefRowSize(); + } else if (dynamic_cast<const formula::SingleVectorRefToken *>(pCur)) + { + // Prepare intermediate results (on CPU for now) + return 1; + } else { + throw Unhandled(); + } + return 0; +} + +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 << "}"; +} + +}} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx index acde3a9..5f17d85 100644 --- a/sc/source/core/opencl/opbase.hxx +++ b/sc/source/core/opencl/opbase.hxx @@ -10,44 +10,34 @@ #ifndef SC_OPENCL_OPBASE_HXX #define SC_OPENCL_OPBASE_HXX -#include "formulagroup.hxx" -#include "document.hxx" -#include "formulacell.hxx" -#include "tokenarray.hxx" -#include "compiler.hxx" -#include "interpre.hxx" -#include "formula/vectortoken.hxx" - #include "clcc/clew.h" -#include <list> -#include <iostream> -#include <sstream> -#include <algorithm> +#include "formula/token.hxx" -#include <memory> #define ISNAN -using namespace formula; namespace sc { namespace opencl { /// Exceptions /// Failed in parsing -class UnhandledToken { +class UnhandledToken +{ public: - UnhandledToken(FormulaToken *t): mToken(t) {} - FormulaToken *mToken; + UnhandledToken(formula::FormulaToken *t): mToken(t) {} + formula::FormulaToken *mToken; }; /// Failed in marshaling -class OpenCLError { +class OpenCLError +{ public: OpenCLError(cl_int err): mError(err) {} cl_int mError; }; /// Inconsistent state -class Unhandled { +class Unhandled +{ public: Unhandled() {} }; @@ -55,17 +45,17 @@ public: class FormulaTreeNode { public: - FormulaTreeNode(FormulaToken *ft): mpCurrentFormula(ft) + FormulaTreeNode(formula::FormulaToken *ft): mpCurrentFormula(ft) { Children.reserve(8); } std::vector<std::shared_ptr<FormulaTreeNode>> Children; - FormulaToken *GetFormulaToken(void) const + formula::FormulaToken *GetFormulaToken(void) const { return mpCurrentFormula; } private: - FormulaToken *const mpCurrentFormula; + formula::FormulaToken *const mpCurrentFormula; }; /// Holds an input (read-only) argument reference to a SingleVectorRef. @@ -73,69 +63,33 @@ private: /// like SumOfProduct /// In most of the cases the argument is introduced /// by a Push operation in the given RPN. -class DynamicKernelArgument { +class DynamicKernelArgument +{ public: - DynamicKernelArgument(const std::string &s, - std::shared_ptr<FormulaTreeNode> ft): - mSymName(s), mFormulaTree(ft), mpClmem(NULL) {} + DynamicKernelArgument(const std::string &s, std::shared_ptr<FormulaTreeNode> ft); + const std::string &GetNameAsString(void) const { return mSymName; } /// Generate declaration - virtual void GenDecl(std::stringstream &ss) const - { - ss << "__global double *"<<mSymName; - } + virtual void GenDecl(std::stringstream &ss) const; + /// When declared as input to a sliding window function - virtual void GenSlidingWindowDecl(std::stringstream &ss) const - { - GenDecl(ss); - } + virtual void GenSlidingWindowDecl(std::stringstream &ss) const; + /// When referenced in a sliding window function - virtual std::string GenSlidingWindowDeclRef(bool=false) const - { - std::stringstream ss; - ss << mSymName << "[gid0]"; - return ss.str(); - } + virtual std::string GenSlidingWindowDeclRef(bool=false) const; + /// Generate use/references to the argument - virtual void GenDeclRef(std::stringstream &ss) const - { - ss << mSymName; - } + virtual void GenDeclRef(std::stringstream &ss) const; + /// Create buffer and pass the buffer to a given kernel virtual size_t Marshal(cl_kernel, int, int); - virtual ~DynamicKernelArgument() - { - //std::cerr << "~DynamicKernelArgument: " << mSymName <<"\n"; - if (mpClmem) { - //std::cerr << "\tFreeing cl_mem of " << mSymName <<"\n"; - cl_int ret = clReleaseMemObject(mpClmem); - if (ret != CL_SUCCESS) - throw OpenCLError(ret); - } - } - virtual void GenSlidingWindowFunction(std::stringstream &) {}; + + virtual ~DynamicKernelArgument(); + + virtual void GenSlidingWindowFunction(std::stringstream &) {} const std::string &GetSymName(void) const { return mSymName; } - FormulaToken *GetFormulaToken(void) const - { - return mFormulaTree->GetFormulaToken(); - } - virtual size_t GetWindowSize(void) const - { - FormulaToken *pCur = mFormulaTree->GetFormulaToken(); - assert(pCur); - if (auto *pCurDVR = - dynamic_cast<const formula::DoubleVectorRefToken *>(pCur)) - { - return pCurDVR->GetRefRowSize(); - } else if (dynamic_cast<const formula::SingleVectorRefToken *>(pCur)) - { - // Prepare intermediate results (on CPU for now) - return 1; - } else { - throw Unhandled(); - } - return 0; - } + formula::FormulaToken *GetFormulaToken(void) const; + virtual size_t GetWindowSize(void) const; virtual std::string DumpOpName(void) const { return std::string(""); } const std::string& GetName(void) const { return mSymName; } protected: @@ -147,7 +101,8 @@ protected: /// Abstract class for code generation -class SlidingFunctionBase { +class SlidingFunctionBase +{ public: typedef std::unique_ptr<DynamicKernelArgument> SubArgument; typedef std::vector<SubArgument> SubArguments; @@ -156,7 +111,8 @@ public: virtual ~SlidingFunctionBase() {}; }; -class OpBase { +class OpBase +{ public: typedef std::vector<std::string> ArgVector; typedef std::vector<std::string>::iterator ArgVectorIter; @@ -172,28 +128,9 @@ class Normal: public SlidingFunctionBase, public OpBase { public: virtual void 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 << "}"; - } + const std::string sSymName, SubArguments &vSubArguments); }; + }} #endif _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
