Kaydet (Commit) c942ed15 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Make these non-inline, for consistency.

Change-Id: I9cc8f18dfa552c9bc12f70b158b0445046e51fd9
üst a1f2b878
......@@ -3305,17 +3305,65 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(
class DynamicKernel : public CompiledFormula
{
public:
DynamicKernel( const FormulaTreeNodeRef& r, int nResultSize ) :
DynamicKernel( const FormulaTreeNodeRef& r, int nResultSize );
virtual ~DynamicKernel();
static DynamicKernel* create( ScTokenArray& rCode, int nResultSize );
/// OpenCL code generation
void CodeGen();
/// Produce kernel hash
std::string GetMD5();
/// Create program, build, and create kerenl
/// TODO cache results based on kernel body hash
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void CreateKernel();
/// Prepare buffers, marshal them to GPU, and launch the kernel
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void Launch( size_t nr );
cl_mem GetResultBuffer() const { return mpResClmem; }
private:
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;
int mnResultSize;
};
DynamicKernel::DynamicKernel( const FormulaTreeNodeRef& r, int nResultSize ) :
mpRoot(r),
mpProgram(NULL),
mpKernel(NULL),
mpResClmem(NULL),
mnResultSize(nResultSize) {}
static DynamicKernel* create( ScTokenArray& rCode, int nResultSize );
/// OpenCL code generation
void CodeGen()
DynamicKernel::~DynamicKernel()
{
if (mpResClmem)
{
clReleaseMemObject(mpResClmem);
}
if (mpKernel)
{
clReleaseKernel(mpKernel);
}
// mpProgram is not going to be released here -- it's cached.
}
void DynamicKernel::CodeGen()
{
// Travese the tree of expression and declare symbols used
const DynamicKernelArgument* DK = mSyms.DeclRefArg<DynamicKernelSoPArguments>(mpRoot, new OpNop(mnResultSize), mnResultSize);
......@@ -3358,10 +3406,10 @@ public:
area << "sc.opencl.source." << mKernelSignature;
SAL_INFO(area.str().c_str(), "Program to be compiled:\n" << linenumberify(mFullProgramSrc));
#endif
}
/// Produce kernel hash
std::string GetMD5()
{
}
std::string DynamicKernel::GetMD5()
{
#ifdef MD5_KERNEL
if (mKernelHash.empty())
{
......@@ -3382,69 +3430,8 @@ public:
#else
return "";
#endif
}
/// Create program, build, and create kerenl
/// TODO cache results based on kernel body hash
/// TODO: abstract OpenCL part out into OpenCL wrapper.
void CreateKernel();
/// 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
::opencl::KernelEnv kEnv;
::opencl::setKernelEnv(&kEnv);
cl_int err;
// The results
mpResClmem = clCreateBuffer(kEnv.mpkContext,
(cl_mem_flags)CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
nr * sizeof(double), NULL, &err);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
err = clSetKernelArg(mpKernel, 0, sizeof(cl_mem), (void*)&mpResClmem);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
// The rest of buffers
mSyms.Marshal(mpKernel, nr, mpProgram);
size_t global_work_size[] = { nr };
err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, mpKernel, 1, NULL,
global_work_size, NULL, 0, NULL, NULL);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
err = clFinish(kEnv.mpkCmdQueue);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
}
virtual ~DynamicKernel();
cl_mem GetResultBuffer() const { return mpResClmem; }
private:
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;
int mnResultSize;
};
DynamicKernel::~DynamicKernel()
{
if (mpResClmem)
{
clReleaseMemObject(mpResClmem);
}
if (mpKernel)
{
clReleaseKernel(mpKernel);
}
// mpProgram is not going to be released here -- it's cached.
}
/// Build code
void DynamicKernel::CreateKernel()
{
......@@ -3554,6 +3541,34 @@ void DynamicKernel::CreateKernel()
if (err != CL_SUCCESS)
throw OpenCLError(err, __FILE__, __LINE__);
}
void DynamicKernel::Launch( size_t nr )
{
// Obtain cl context
::opencl::KernelEnv kEnv;
::opencl::setKernelEnv(&kEnv);
cl_int err;
// The results
mpResClmem = clCreateBuffer(kEnv.mpkContext,
(cl_mem_flags)CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
nr * sizeof(double), NULL, &err);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
err = clSetKernelArg(mpKernel, 0, sizeof(cl_mem), (void*)&mpResClmem);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
// The rest of buffers
mSyms.Marshal(mpKernel, nr, mpProgram);
size_t global_work_size[] = { nr };
err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, mpKernel, 1, NULL,
global_work_size, NULL, 0, NULL, NULL);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
err = clFinish(kEnv.mpkCmdQueue);
if (CL_SUCCESS != err)
throw OpenCLError(err, __FILE__, __LINE__);
}
// Symbol lookup. If there is no such symbol created, allocate one
// kernel with argument with unique name and return so.
// The template argument T must be a subclass of DynamicKernelArgument
......
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