sc/source/core/opencl/formulagroupcl.cxx | 79 +++++++++++++++++++++++++------ sc/source/core/opencl/opbase.hxx | 10 +++ 2 files changed, 74 insertions(+), 15 deletions(-)
New commits: commit d78a19131950c087706a376f68b7066b44bf2f86 Author: I-Jui (Ray) Sung <r...@multicorewareinc.com> Date: Wed Nov 27 18:40:49 2013 -0600 GPU Calc: fix typo in NAN macro Change-Id: I34299e0fc692c2ab43fe0c1fffaada348742d19f diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 699b193..4e48e04 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -36,7 +36,7 @@ namespace { static const unsigned long __nan[2] = {0xffffffff, 0x7fffffff}; } -#define NAN (*(const float *) __nan) +#define NAN (*(const double*) __nan) #endif #endif commit 1de71419351019097074913815e5c049437c9419 Author: I-Jui (Ray) Sung <r...@multicorewareinc.com> Date: Wed Nov 27 18:36:47 2013 -0600 GPU Calc: fix compilation failure on Windows due to missing NAN macro Change-Id: I0d53dcf147a06f831120c5489b2975e42ea6120b diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index c02cef7..699b193 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -31,6 +31,14 @@ #define REDUCE_THRESHOLD 4 // set to 4 for correctness testing. priority 1 #define UNROLLING_FACTOR 16 // set to 4 for correctness testing (if no reduce) #include "formulagroupcl_public.hxx" +#ifdef WIN32 +#ifndef NAN +namespace { +static const unsigned long __nan[2] = {0xffffffff, 0x7fffffff}; +} +#define NAN (*(const float *) __nan) +#endif +#endif #include <list> #include <map> commit 4e88456720a94e5e812d6b81c841e6839dca5836 Author: I-Jui (Ray) Sung <r...@multicorewareinc.com> Date: Wed Nov 27 17:44:46 2013 -0600 GPU Calc: fix regression caused by recent isValid() change Change-Id: I885a222bf8a7ca4275867585ccf067a1ba7822c7 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index c4290f4..c02cef7 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -72,8 +72,6 @@ size_t VectorRef::Marshal(cl_kernel k, int argno, int, cl_program) const formula::DoubleVectorRefToken* pDVR = dynamic_cast< const formula::DoubleVectorRefToken* >(ref); assert(pDVR); - if (pDVR->GetArrays()[mnIndex].mpNumericArray == NULL) - throw Unhandled(); pHostBuffer = const_cast<double*>( pDVR->GetArrays()[mnIndex].mpNumericArray); szHostBuffer = pDVR->GetArrayLength() * sizeof(double); @@ -84,12 +82,35 @@ size_t VectorRef::Marshal(cl_kernel k, int argno, int, cl_program) KernelEnv kEnv; OpenclDevice::setKernelEnv(&kEnv); cl_int err; - mpClmem = clCreateBuffer(kEnv.mpkContext, - (cl_mem_flags) CL_MEM_READ_ONLY|CL_MEM_USE_HOST_PTR, - szHostBuffer, - pHostBuffer, &err); - if (CL_SUCCESS != err) - throw OpenCLError(err); + if (pHostBuffer) + { + mpClmem = clCreateBuffer(kEnv.mpkContext, + (cl_mem_flags) CL_MEM_READ_ONLY|CL_MEM_USE_HOST_PTR, + szHostBuffer, + pHostBuffer, &err); + if (CL_SUCCESS != err) + throw OpenCLError(err); + } + else + { + if (szHostBuffer == 0) + szHostBuffer = sizeof(double); // a dummy small value + // Marshal as a buffer of NANs + mpClmem = clCreateBuffer(kEnv.mpkContext, + (cl_mem_flags) CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, + szHostBuffer, NULL, &err); + if (CL_SUCCESS != err) + throw OpenCLError(err); + double *pNanBuffer = (double*)clEnqueueMapBuffer( + kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0, + szHostBuffer, 0, NULL, NULL, &err); + if (CL_SUCCESS != err) + throw OpenCLError(err); + for (size_t i = 0; i < szHostBuffer/sizeof(double); i++) + pNanBuffer[i] = NAN; + err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem, + pNanBuffer, 0, NULL, NULL); + } err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem); if (CL_SUCCESS != err) @@ -1414,9 +1435,9 @@ public: KernelEnv kEnv; OpenclDevice::setKernelEnv(&kEnv); cl_int err; + DynamicKernelArgument *Arg = mvSubArguments[0].get(); DynamicKernelSlidingArgument<VectorRef> *slidingArgPtr = - dynamic_cast< DynamicKernelSlidingArgument<VectorRef> *> - (mvSubArguments[0].get()); + dynamic_cast< DynamicKernelSlidingArgument<VectorRef> *> (Arg); cl_mem mpClmem2; if (OpSumCodeGen->NeedReductionKernel()) @@ -1590,6 +1611,8 @@ DynamicKernelArgument *VectorRefFactory(const std::string &s, //Black lists ineligible classes here .. // SUMIFS does not perform parallel reduction at DoubleVectorRef level if (dynamic_cast<OpSumIfs*>(pCodeGen.get())) { + if (index == 0) // the first argument of OpSumIfs cannot be strings anyway + return new DynamicKernelSlidingArgument<VectorRef>(s, ft, pCodeGen, index); return new DynamicKernelSlidingArgument<Base>(s, ft, pCodeGen, index); } // AVERAGE is not supported yet @@ -1650,7 +1673,9 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments( assert(pDVR); for (size_t j = 0; j < pDVR->GetArrays().size(); ++j) { - if (pDVR->GetArrays()[j].mpNumericArray) + if (pDVR->GetArrays()[j].mpNumericArray || + (pDVR->GetArrays()[j].mpNumericArray == NULL && + pDVR->GetArrays()[j].mpStringArray == NULL )) mvSubArguments.push_back( SubArgument(VectorRefFactory<VectorRef>( ts, ft->Children[i], mpCodeGen, j))); @@ -1687,9 +1712,17 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments( SubArgument(new DynamicKernelStringArgument( ts, ft->Children[i]))); } + else if (pSVR->GetArray().mpStringArray == NULL && + pSVR->GetArray().mpNumericArray == NULL) + { + // Push as an array of NANs + mvSubArguments.push_back( + SubArgument(new VectorRef(ts, + ft->Children[i]))); + } else throw UnhandledToken(pChild, - "Got unhandled case here"); + "Got unhandled case here", __FILE__, __LINE__); } else if (pChild->GetType() == formula::svDouble) { mvSubArguments.push_back( SubArgument(new DynamicKernelConstantArgument(ts, @@ -2736,7 +2769,8 @@ DynamicKernel* DynamicKernel::create(ScDocument& /* rDoc */, } catch (const UnhandledToken &ut) { std::cerr << "\nDynamic formual compiler: unhandled token: "; - std::cerr << ut.mMessage << "\n"; + std::cerr << ut.mMessage << " at "; + std::cerr << ut.mFile << ":" << ut.mLineNumber << "\n"; #ifdef NO_FALLBACK_TO_SWINTERP assert(false); #else @@ -2840,6 +2874,17 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, return false; #endif } + catch (const Unhandled &uh) { + std::cerr << "Dynamic formula compiler: unhandled case:"; + std::cerr <<" at "; + std::cerr << uh.mFile << ":" << uh.mLineNumber << "\n"; +#ifdef NO_FALLBACK_TO_SWINTERP + assert(false); + return true; +#else + return false; +#endif + } catch (...) { std::cerr << "Dynamic formula compiler: unhandled compiler error\n"; #ifdef NO_FALLBACK_TO_SWINTERP diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx index 135ec4d..22a9316 100644 --- a/sc/source/core/opencl/opbase.hxx +++ b/sc/source/core/opencl/opbase.hxx @@ -30,9 +30,12 @@ class UnhandledToken { public: UnhandledToken(formula::FormulaToken *t, - const char *const m): mToken(t), mMessage(m) {} + const char *const m, std::string fn="", int ln=0): + mToken(t), mMessage(m), mFile(fn), mLineNumber(ln) {} formula::FormulaToken *mToken; std::string mMessage; + std::string mFile; + int mLineNumber; }; /// Failed in marshaling @@ -47,7 +50,10 @@ public: class Unhandled { public: - Unhandled() {} + Unhandled(std::string fn="", int ln=0): + mFile(fn), mLineNumber(ln) {} + std::string mFile; + int mLineNumber; }; typedef boost::shared_ptr<FormulaTreeNode> FormulaTreeNodeRef; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits