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

Split the wait-for-result part and push-result-to-doc part.

Change-Id: I496fa9274922603f4c7efdcab90e66a23df741fa
üst 1dd1dfc1
......@@ -3659,28 +3659,31 @@ class CLInterpreterResult
SCROW mnGroupLength;
cl_mem mpCLResBuf;
double* mpResBuf;
public:
CLInterpreterResult() : mpKernel(NULL), mnGroupLength(0) {}
CLInterpreterResult() : mpKernel(NULL), mnGroupLength(0), mpCLResBuf(NULL), mpResBuf(NULL) {}
CLInterpreterResult( DynamicKernel* pKernel, SCROW nGroupLength ) :
mpKernel(pKernel), mnGroupLength(nGroupLength) {}
mpKernel(pKernel), mnGroupLength(nGroupLength), mpCLResBuf(NULL), mpResBuf(NULL) {}
bool isValid() const { return mpKernel != NULL; }
bool pushResultToDocument( ScDocument& rDoc, const ScAddress& rTopPos )
void waitForResult()
{
if (!isValid())
return false;
return;
// Map results back
cl_mem res = mpKernel->GetResultBuffer();
mpCLResBuf = mpKernel->GetResultBuffer();
// Obtain cl context
::opencl::KernelEnv kEnv;
::opencl::setKernelEnv(&kEnv);
cl_int err;
double* resbuf = (double*)clEnqueueMapBuffer(kEnv.mpkCmdQueue,
res,
mpResBuf = (double*)clEnqueueMapBuffer(kEnv.mpkCmdQueue,
mpCLResBuf,
CL_TRUE, CL_MAP_READ, 0,
mnGroupLength * sizeof(double), 0, NULL, NULL,
&err);
......@@ -3688,12 +3691,22 @@ public:
if (err != CL_SUCCESS)
{
SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err);
return false;
mpResBuf = NULL;
}
}
bool pushResultToDocument( ScDocument& rDoc, const ScAddress& rTopPos )
{
if (!mpResBuf)
return false;
rDoc.SetFormulaResults(rTopPos, resbuf, mnGroupLength);
rDoc.SetFormulaResults(rTopPos, mpResBuf, mnGroupLength);
err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, res, resbuf, 0, NULL, NULL);
// Obtain cl context
::opencl::KernelEnv kEnv;
::opencl::setKernelEnv(&kEnv);
cl_int err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL);
if (err != CL_SUCCESS)
{
SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err);
......@@ -3826,6 +3839,8 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
if (!aRes.isValid())
return false;
aRes.waitForResult();
return aRes.pushResultToDocument(rDoc, rTopPos);
}
......
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