Kaydet (Commit) b3ecd33b authored tarafından Tor Lillqvist's avatar Tor Lillqvist Kaydeden (comit) Michael Meeks

DynamicKernel isn't needed outside formulagroupcl.cxx after all

So put it back there.

Change-Id: I7c78719c95123e33e4506ace912ff056df56b247
üst 0c7e7043
/* -*- 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/.
*/
#ifndef INCLUDED_SC_SOURCE_CORE_INC_DYNAMICKERNEL_HXX
#define INCLUDED_SC_SOURCE_CORE_INC_DYNAMICKERNEL_HXX
#include <config_features.h>
#include "formulagroup.hxx"
#if !HAVE_FEATURE_OPENCL
namespace sc { namespace opencl {
class DynamikcKernel : public CompiledFormula
{
}
} // namespace opencl
} // namespace sc
#else
#include "clew.h"
#include "document.hxx"
#include "opbase.hxx"
namespace sc { namespace opencl {
class DynamicKernelArgument;
class SlidingFunctionBase;
/// Holds the symbol table for a given dynamic kernel
class SymbolTable {
public:
typedef std::map<const formula::FormulaToken *,
boost::shared_ptr<DynamicKernelArgument> > ArgumentMap;
// This avoids instability caused by using pointer as the key type
typedef std::list< boost::shared_ptr<DynamicKernelArgument> > ArgumentList;
SymbolTable(void):mCurId(0) {}
template <class T>
const DynamicKernelArgument *DeclRefArg(FormulaTreeNodeRef, SlidingFunctionBase* pCodeGen);
/// Used to generate sliding window helpers
void DumpSlidingWindowFunctions(std::stringstream &ss);
/// Memory mapping from host to device and pass buffers to the given kernel as
/// arguments
void Marshal(cl_kernel, int, cl_program);
private:
unsigned int mCurId;
ArgumentMap mSymbols;
ArgumentList mParams;
};
class DynamicKernel : public CompiledFormula
{
public:
DynamicKernel(FormulaTreeNodeRef r):mpRoot(r),
mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL), mpCode(NULL) {}
static DynamicKernel *create(ScDocument& rDoc,
const ScAddress& rTopPos,
ScTokenArray& rCode);
/// OpenCL code generation
void CodeGen();
/// Produce kernel hash
std::string GetMD5(void);
/// Create program, build, and create kerenl
/// TODO cache results based on kernel body hash
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void CreateKernel(void);
/// Prepare buffers, marshal them to GPU, and launch the kernel
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void Launch(size_t nr);
~DynamicKernel();
cl_mem GetResultBuffer(void) const { return mpResClmem; }
void SetPCode(ScTokenArray *pCode) { mpCode = pCode; }
private:
void TraverseAST(FormulaTreeNodeRef);
FormulaTreeNodeRef mpRoot;
SymbolTable mSyms;
std::string mKernelSignature, mKernelHash;
std::string mFullProgramSrc;
cl_program mpProgram;
cl_kernel mpKernel;
cl_mem mpResClmem; // Results
std::set<std::string> inlineDecl;
std::set<std::string> inlineFun;
ScTokenArray *mpCode;
};
}
}
#endif // HAVE_FEATURE_OPENCL
#endif // INCLUDED_SC_SOURCE_CORE_INC_DYNAMICKERNEL_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include "formula/vectortoken.hxx" #include "formula/vectortoken.hxx"
#include "scmatrix.hxx" #include "scmatrix.hxx"
#include "dynamickernel.hxx"
#include "openclwrapper.hxx" #include "openclwrapper.hxx"
#include "op_financial.hxx" #include "op_financial.hxx"
...@@ -2375,15 +2374,33 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments( ...@@ -2375,15 +2374,33 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(
} }
} }
/// Used to generate sliding window helpers /// Holds the symbol table for a given dynamic kernel
void SymbolTable::DumpSlidingWindowFunctions(std::stringstream &ss) class SymbolTable {
{ public:
typedef std::map<const formula::FormulaToken *,
boost::shared_ptr<DynamicKernelArgument> > ArgumentMap;
// This avoids instability caused by using pointer as the key type
typedef std::list< boost::shared_ptr<DynamicKernelArgument> > ArgumentList;
SymbolTable(void):mCurId(0) {}
template <class T>
const DynamicKernelArgument *DeclRefArg(FormulaTreeNodeRef, SlidingFunctionBase* pCodeGen);
/// Used to generate sliding window helpers
void DumpSlidingWindowFunctions(std::stringstream &ss)
{
for(ArgumentList::iterator it = mParams.begin(), e= mParams.end(); it!=e; for(ArgumentList::iterator it = mParams.begin(), e= mParams.end(); it!=e;
++it) { ++it) {
(*it)->GenSlidingWindowFunction(ss); (*it)->GenSlidingWindowFunction(ss);
ss << "\n"; ss << "\n";
} }
} }
/// Memory mapping from host to device and pass buffers to the given kernel as
/// arguments
void Marshal(cl_kernel, int, cl_program);
private:
unsigned int mCurId;
ArgumentMap mSymbols;
ArgumentList mParams;
};
void SymbolTable::Marshal(cl_kernel k, int nVectorWidth, cl_program pProgram) void SymbolTable::Marshal(cl_kernel k, int nVectorWidth, cl_program pProgram)
{ {
...@@ -2394,9 +2411,16 @@ void SymbolTable::Marshal(cl_kernel k, int nVectorWidth, cl_program pProgram) ...@@ -2394,9 +2411,16 @@ void SymbolTable::Marshal(cl_kernel k, int nVectorWidth, cl_program pProgram)
} }
} }
/// OpenCL code generation class DynamicKernel : public CompiledFormula
void DynamicKernel::CodeGen()
{ {
public:
DynamicKernel(FormulaTreeNodeRef r):mpRoot(r),
mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL), mpCode(NULL) {}
static DynamicKernel *create(ScDocument& rDoc,
const ScAddress& rTopPos,
ScTokenArray& rCode);
/// OpenCL code generation
void CodeGen() {
// Travese the tree of expression and declare symbols used // Travese the tree of expression and declare symbols used
const DynamicKernelArgument *DK= mSyms.DeclRefArg< const DynamicKernelArgument *DK= mSyms.DeclRefArg<
DynamicKernelSoPArguments>(mpRoot, new OpNop); DynamicKernelSoPArguments>(mpRoot, new OpNop);
...@@ -2432,11 +2456,10 @@ void DynamicKernel::CodeGen() ...@@ -2432,11 +2456,10 @@ void DynamicKernel::CodeGen()
#if 1 #if 1
std::cerr<< "Program to be compiled = \n" << mFullProgramSrc << "\n"; std::cerr<< "Program to be compiled = \n" << mFullProgramSrc << "\n";
#endif #endif
} }
/// Produce kernel hash
/// Produce kernel hash std::string GetMD5(void)
std::string DynamicKernel::GetMD5(void) {
{
#ifdef MD5_KERNEL #ifdef MD5_KERNEL
if (mKernelHash.empty()) { if (mKernelHash.empty()) {
std::stringstream md5s; std::stringstream md5s;
...@@ -2455,12 +2478,15 @@ std::string DynamicKernel::GetMD5(void) ...@@ -2455,12 +2478,15 @@ std::string DynamicKernel::GetMD5(void)
#else #else
return ""; return "";
#endif #endif
} }
/// Create program, build, and create kerenl
/// Prepare buffers, marshal them to GPU, and launch the kernel /// TODO cache results based on kernel body hash
/// TODO: abstract OpenCL part out into OpenCL wrapper. /// TODO: abstract OpenCL part out into OpenCL wrapper.
void DynamicKernel::Launch(size_t nr) void CreateKernel(void);
{ /// Prepare buffers, marshal them to GPU, and launch the kernel
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void Launch(size_t nr)
{
// Obtain cl context // Obtain cl context
KernelEnv kEnv; KernelEnv kEnv;
OpenclDevice::setKernelEnv(&kEnv); OpenclDevice::setKernelEnv(&kEnv);
...@@ -2481,7 +2507,24 @@ void DynamicKernel::Launch(size_t nr) ...@@ -2481,7 +2507,24 @@ void DynamicKernel::Launch(size_t nr)
global_work_size, NULL, 0, NULL, NULL); global_work_size, NULL, 0, NULL, NULL);
if (CL_SUCCESS != err) if (CL_SUCCESS != err)
throw OpenCLError(err); throw OpenCLError(err);
} }
~DynamicKernel();
cl_mem GetResultBuffer(void) const { return mpResClmem; }
void SetPCode(ScTokenArray *pCode) { mpCode = pCode; }
private:
void TraverseAST(FormulaTreeNodeRef);
FormulaTreeNodeRef mpRoot;
SymbolTable mSyms;
std::string mKernelSignature, mKernelHash;
std::string mFullProgramSrc;
cl_program mpProgram;
cl_kernel mpKernel;
cl_mem mpResClmem; // Results
std::set<std::string> inlineDecl;
std::set<std::string> inlineFun;
ScTokenArray *mpCode;
};
DynamicKernel::~DynamicKernel() DynamicKernel::~DynamicKernel()
{ {
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include "compiler.hxx" #include "compiler.hxx"
#include "interpre.hxx" #include "interpre.hxx"
#include "scmatrix.hxx" #include "scmatrix.hxx"
#include "dynamickernel.hxx"
#include "formula/vectortoken.hxx" #include "formula/vectortoken.hxx"
#include "rtl/bootstrap.hxx" #include "rtl/bootstrap.hxx"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment