include/opencl/openclwrapper.hxx | 6 opencl/source/openclwrapper.cxx | 58 + sc/source/core/opencl/formulagroupcl.cxx | 186 ++- sc/source/core/opencl/op_addin.cxx | 16 sc/source/core/opencl/op_financial.cxx | 601 ----------- sc/source/core/opencl/op_logical.cxx | 12 sc/source/core/opencl/op_math.cxx | 233 ---- sc/source/core/opencl/op_statistical.cxx | 1680 ------------------------------- sc/source/core/opencl/opbase.cxx | 87 - sc/source/core/opencl/opbase.hxx | 7 10 files changed, 186 insertions(+), 2700 deletions(-)
New commits: commit 641835ec3234da3744a4ea3c15ff3c4e3aef1528 Author: Tor Lillqvist <[email protected]> Date: Fri Feb 6 02:32:15 2015 +0200 Report errors from clRelease*() APIs Change-Id: Id30afe5bf954e26515bf8cca6f1ee8bc018fb835 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index d508141..9804c72 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -1062,7 +1062,9 @@ public: { if (mpClmem2) { - clReleaseMemObject(mpClmem2); + cl_int err; + err = clReleaseMemObject(mpClmem2); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err)); mpClmem2 = NULL; } } @@ -1571,7 +1573,8 @@ public: SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err)); if (mpClmem2) { - clReleaseMemObject(mpClmem2); + err = clReleaseMemObject(mpClmem2); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err)); mpClmem2 = NULL; } mpClmem2 = clCreateBuffer(kEnv.mpkContext, @@ -1592,7 +1595,9 @@ public: { if (mpClmem2) { - clReleaseMemObject(mpClmem2); + cl_int err; + err = clReleaseMemObject(mpClmem2); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err)); mpClmem2 = NULL; } } @@ -2314,10 +2319,14 @@ public: global_work_size, local_work_size, 0, NULL, NULL); if (CL_SUCCESS != err) throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__); + err = clFinish(kEnv.mpkCmdQueue); if (CL_SUCCESS != err) throw OpenCLError("clFinish", err, __FILE__, __LINE__); - clReleaseKernel(redKernel); + + err = clReleaseKernel(redKernel); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseKernel failed: " << ::opencl::errorString(err)); + // Pass mpClmem2 to the "real" kernel SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem2); err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem2); @@ -2431,7 +2440,9 @@ public: { if (mpClmem2) { - clReleaseMemObject(mpClmem2); + cl_int err; + err = clReleaseMemObject(mpClmem2); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err)); mpClmem2 = NULL; } } @@ -3597,13 +3608,16 @@ DynamicKernel::DynamicKernel( const FormulaTreeNodeRef& r, int nResultSize ) : DynamicKernel::~DynamicKernel() { + cl_int err; if (mpResClmem) { - clReleaseMemObject(mpResClmem); + err = clReleaseMemObject(mpResClmem); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err)); } if (mpKernel) { - clReleaseKernel(mpKernel); + err = clReleaseKernel(mpKernel); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseKernel failed: " << ::opencl::errorString(err)); } // mpProgram is not going to be released here -- it's cached. } @@ -3706,7 +3720,8 @@ void DynamicKernel::CreateKernel() if (lastSecondProgram) { - clReleaseProgram(lastSecondProgram); + err = clReleaseProgram(lastSecondProgram); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseProgram failed: " << ::opencl::errorString(err)); } if (::opencl::buildProgramFromBinary("", &::opencl::gpuEnv, KernelHash.c_str(), 0)) diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx index 671987e..ac97249 100644 --- a/sc/source/core/opencl/opbase.cxx +++ b/sc/source/core/opencl/opbase.cxx @@ -107,7 +107,9 @@ VectorRef::~VectorRef() { if (mpClmem) { - clReleaseMemObject(mpClmem); + cl_int err; + err = clReleaseMemObject(mpClmem); + SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err)); } } commit e0f78c7faf6a9d1fd30944d77a3f93102a652939 Author: Tor Lillqvist <[email protected]> Date: Fri Feb 6 02:12:30 2015 +0200 Unmap the host buffer only after done accessing it Most likely 64c479e9da02f724e1870649c99fac92f5f27cd3 accidentally made the code unmap the host buffer before it is accessed, but the code continued to work by accident in many (most?) cases. Either because in the case of OpenCL devices that share memory with the CPU, the host buffer *is* the OpenCL buffer, so even if the host buffer is "unmapped", it still exists. In the case of GPU device with separate memory, using the host buffer after unmapping corresponds simply to a case of use after free of a heap-allocated buffer, which often happens to work. Found by code reading. Change-Id: I9e2b4574077a267938702c0f81c4b1cba9c9a183 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 381fb1d..d508141 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -3965,13 +3965,6 @@ public: mpResBuf = NULL; return; } - - err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL); - if (err != CL_SUCCESS) - { - SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err)); - mpResBuf = NULL; - } } bool pushResultToDocument( ScDocument& rDoc, const ScAddress& rTopPos ) @@ -3980,6 +3973,20 @@ public: return false; rDoc.SetFormulaResults(rTopPos, mpResBuf, mnGroupLength); + + // Obtain cl context + ::opencl::KernelEnv kEnv; + ::opencl::setKernelEnv(&kEnv); + + cl_int err; + err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL); + + if (err != CL_SUCCESS) + { + SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err)); + return false; + } + return true; } }; commit 6a2576150b5152244dc3f8c31b745fa634b31a47 Author: Tor Lillqvist <[email protected]> Date: Fri Feb 6 00:15:04 2015 +0200 Improve OpenCL error messages Add the name of the function that failed to the OpenCLError class. Log OpenCL failure in a couple of more places (where OpenCLError is not thrown). Print OpenCL errors symbolically instead of numerically where applicable. Change-Id: I60f910e9ea7b75af7ec506553d7a73ad99ba4366 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 18aed00..381fb1d 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -169,7 +169,7 @@ size_t VectorRef::Marshal( cl_kernel k, int argno, int, cl_program ) szHostBuffer, pHostBuffer, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer << " using host buffer " << pHostBuffer); } else @@ -181,24 +181,28 @@ size_t VectorRef::Marshal( cl_kernel k, int argno, int, cl_program ) (cl_mem_flags)CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, szHostBuffer, NULL, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer); 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, __FILE__, __LINE__); + throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__); + for (size_t i = 0; i < szHostBuffer / sizeof(double); i++) pNanBuffer[i] = NAN; err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem, pNanBuffer, 0, NULL, NULL); + // FIXME: Is it intentional to not throw an OpenCLError even if the clEnqueueUnmapMemObject() fails? + if (CL_SUCCESS != err) + SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err)); } SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem); err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); return 1; } @@ -257,7 +261,7 @@ public: SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_uint: " << hashCode); cl_int err = clSetKernelArg(k, argno, sizeof(cl_uint), (void*)&hashCode); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); return 1; } }; @@ -307,7 +311,7 @@ public: SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": double: " << tmp); cl_int err = clSetKernelArg(k, argno, sizeof(double), (void*)&tmp); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); return 1; } }; @@ -347,7 +351,7 @@ public: SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": double: " << tmp); cl_int err = clSetKernelArg(k, argno, sizeof(double), (void*)&tmp); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); return 1; } }; @@ -707,7 +711,7 @@ threefry2x32 (threefry2x32_ctr_t in, threefry2x32_key_t k)\n\ SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_int: " << seed); cl_int err = clSetKernelArg(k, argno, sizeof(cl_int), (void*)&seed); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); return 1; } }; @@ -767,14 +771,14 @@ size_t DynamicKernelStringArgument::Marshal( cl_kernel k, int argno, int, cl_pro (cl_mem_flags)CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, szHostBuffer, NULL, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer); pHashBuffer = (cl_uint*)clEnqueueMapBuffer( kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0, szHostBuffer, 0, NULL, NULL, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__); for (size_t i = 0; i < nStrings; i++) { @@ -798,14 +802,14 @@ size_t DynamicKernelStringArgument::Marshal( cl_kernel k, int argno, int, cl_pro (cl_mem_flags)CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, szHostBuffer, NULL, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer); pHashBuffer = (cl_uint*)clEnqueueMapBuffer( kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0, szHostBuffer, 0, NULL, NULL, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__); for (size_t i = 0; i < szHostBuffer / sizeof(cl_int); i++) pHashBuffer[i] = 0; @@ -813,12 +817,12 @@ size_t DynamicKernelStringArgument::Marshal( cl_kernel k, int argno, int, cl_pro err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem, pHashBuffer, 0, NULL, NULL); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueUnmapMemObject", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem); err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); return 1; } @@ -1449,7 +1453,7 @@ public: CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(double) * w, NULL, NULL); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpClmem2 << " size " << sizeof(double) << "*" << w << "=" << (sizeof(double)*w)); // reproduce the reduction function name @@ -1460,7 +1464,7 @@ public: kernelName = Base::GetName() + "_sum_reduction"; cl_kernel redKernel = clCreateKernel(mpProgram, kernelName.c_str(), &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__); // set kernel arg of reduction kernel // TODO(Wei Wei): use unique name for kernel cl_mem buf = Base::GetCLBuffer(); @@ -1468,22 +1472,22 @@ public: err = clSetKernelArg(redKernel, 0, sizeof(cl_mem), (void*)&buf); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 1 << ": cl_mem: " << mpClmem2); err = clSetKernelArg(redKernel, 1, sizeof(cl_mem), (void*)&mpClmem2); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 2 << ": cl_int: " << nInput); err = clSetKernelArg(redKernel, 2, sizeof(cl_int), (void*)&nInput); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 3 << ": cl_int: " << nCurWindowSize); err = clSetKernelArg(redKernel, 3, sizeof(cl_int), (void*)&nCurWindowSize); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); // set work group size and execute size_t global_work_size[] = { 256, (size_t)w }; @@ -1492,10 +1496,10 @@ public: err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__); err = clFinish(kEnv.mpkCmdQueue); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clFinish", err, __FILE__, __LINE__); if (dynamic_cast<OpAverage*>(mpCodeGen.get())) { /*average need more reduction kernel for count computing*/ @@ -1506,40 +1510,40 @@ public: sizeof(double) * w, 0, NULL, NULL, &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__); for (int i = 0; i < w; i++) pAllBuffer[i] = resbuf[i]; err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem2, resbuf, 0, NULL, NULL); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueUnmapMemObject", err, __FILE__, __LINE__); kernelName = Base::GetName() + "_count_reduction"; redKernel = clCreateKernel(mpProgram, kernelName.c_str(), &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__); // set kernel arg of reduction kernel buf = Base::GetCLBuffer(); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 0 << ": cl_mem: " << buf); err = clSetKernelArg(redKernel, 0, sizeof(cl_mem), (void*)&buf); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 1 << ": cl_mem: " << mpClmem2); err = clSetKernelArg(redKernel, 1, sizeof(cl_mem), (void*)&mpClmem2); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 2 << ": cl_int: " << nInput); err = clSetKernelArg(redKernel, 2, sizeof(cl_int), (void*)&nInput); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 3 << ": cl_int: " << nCurWindowSize); err = clSetKernelArg(redKernel, 3, sizeof(cl_int), (void*)&nCurWindowSize); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); // set work group size and execute size_t global_work_size1[] = { 256, (size_t)w }; @@ -1548,20 +1552,23 @@ public: err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL, global_work_size1, local_work_size1, 0, NULL, NULL); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__); err = clFinish(kEnv.mpkCmdQueue); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clFinish", err, __FILE__, __LINE__); resbuf = (double*)clEnqueueMapBuffer(kEnv.mpkCmdQueue, mpClmem2, CL_TRUE, CL_MAP_READ, 0, sizeof(double) * w, 0, NULL, NULL, &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__); for (int i = 0; i < w; i++) pAllBuffer[i + w] = resbuf[i]; err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem2, resbuf, 0, NULL, NULL); + // FIXME: Is it intentional to not throw an OpenCLError even if the clEnqueueUnmapMemObject() fails? + if (CL_SUCCESS != err) + SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err)); if (mpClmem2) { clReleaseMemObject(mpClmem2); @@ -1571,14 +1578,14 @@ public: (cl_mem_flags)CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, w * sizeof(double) * 2, pAllBuffer.get(), &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpClmem2 << " size " << w << "*" << sizeof(double) << "=" << (w*sizeof(double)) << " copying host buffer " << pAllBuffer.get()); } // set kernel arg SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem2); err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&(mpClmem2)); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); return 1; } ~ParallelReductionVectorRef() @@ -2192,13 +2199,13 @@ public: pClmem2 = clCreateBuffer(kEnv.mpkContext, CL_MEM_READ_WRITE, sizeof(double) * nVectorWidth, NULL, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << pClmem2 << " size " << sizeof(double) << "*" << nVectorWidth << "=" << (sizeof(double)*nVectorWidth)); std::string kernelName = "GeoMean_reduction"; cl_kernel redKernel = clCreateKernel(pProgram, kernelName.c_str(), &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__); // set kernel arg of reduction kernel for (size_t j = 0; j < vclmem.size(); j++) { @@ -2207,12 +2214,12 @@ public: vclmem[j] ? sizeof(cl_mem) : sizeof(double), (void*)&vclmem[j]); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); } SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << vclmem.size() << ": cl_mem: " << pClmem2); err = clSetKernelArg(redKernel, vclmem.size(), sizeof(cl_mem), (void*)&pClmem2); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); // set work group size and execute size_t global_work_size[] = { 256, (size_t)nVectorWidth }; @@ -2221,16 +2228,16 @@ public: err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__); err = clFinish(kEnv.mpkCmdQueue); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clFinish", err, __FILE__, __LINE__); // Pass pClmem2 to the "real" kernel SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << pClmem2); err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&pClmem2); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); } } if (OpSumIfs* OpSumCodeGen = dynamic_cast<OpSumIfs*>(mpCodeGen.get())) @@ -2263,13 +2270,13 @@ public: mpClmem2 = clCreateBuffer(kEnv.mpkContext, CL_MEM_READ_WRITE, sizeof(double) * nVectorWidth, NULL, &err); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpClmem2 << " size " << sizeof(double) << "*" << nVectorWidth << "=" << (sizeof(double)*nVectorWidth)); std::string kernelName = mvSubArguments[0]->GetName() + "_SumIfs_reduction"; cl_kernel redKernel = clCreateKernel(pProgram, kernelName.c_str(), &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__); // set kernel arg of reduction kernel for (size_t j = 0; j < vclmem.size(); j++) @@ -2283,22 +2290,22 @@ public: vclmem[j].mCLMem ? (void*)&vclmem[j].mCLMem : (void*)&vclmem[j].mConst); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); } SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << vclmem.size() << ": cl_mem: " << mpClmem2); err = clSetKernelArg(redKernel, vclmem.size(), sizeof(cl_mem), (void*)&mpClmem2); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << (vclmem.size() + 1) << ": cl_int: " << nInput); err = clSetKernelArg(redKernel, vclmem.size() + 1, sizeof(cl_int), (void*)&nInput); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << (vclmem.size() + 2) << ": cl_int: " << nCurWindowSize); err = clSetKernelArg(redKernel, vclmem.size() + 2, sizeof(cl_int), (void*)&nCurWindowSize); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); // set work group size and execute size_t global_work_size[] = { 256, (size_t)nVectorWidth }; size_t local_work_size[] = { 256, 1 }; @@ -2306,16 +2313,16 @@ public: err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__); err = clFinish(kEnv.mpkCmdQueue); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clFinish", err, __FILE__, __LINE__); clReleaseKernel(redKernel); // Pass mpClmem2 to the "real" kernel SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem2); err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem2); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); } } return i; @@ -3712,7 +3719,7 @@ void DynamicKernel::CreateKernel() mpProgram = clCreateProgramWithSource(kEnv.mpkContext, 1, &src, NULL, &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateProgramWithSource", err, __FILE__, __LINE__); err = clBuildProgram(mpProgram, 1, ::opencl::gpuEnv.mpArryDevsID, "", NULL, NULL); if (err != CL_SUCCESS) @@ -3729,7 +3736,7 @@ void DynamicKernel::CreateKernel() e != CL_SUCCESS, "sc.opencl", "after CL_BUILD_PROGRAM_FAILURE," " clGetProgramBuildInfo(CL_PROGRAM_BUILD_STATUS)" - " fails with " << e); + " fails with " << ::opencl::errorString(e)); if (e == CL_SUCCESS) { size_t n; @@ -3740,7 +3747,7 @@ void DynamicKernel::CreateKernel() e != CL_SUCCESS || n == 0, "sc.opencl", "after CL_BUILD_PROGRAM_FAILURE," " clGetProgramBuildInfo(CL_PROGRAM_BUILD_LOG)" - " fails with " << e << ", n=" << n); + " fails with " << ::opencl::errorString(e) << ", n=" << n); if (e == CL_SUCCESS && n != 0) { std::vector<char> log(n); @@ -3751,7 +3758,7 @@ void DynamicKernel::CreateKernel() e != CL_SUCCESS || n == 0, "sc.opencl", "after CL_BUILD_PROGRAM_FAILURE," " clGetProgramBuildInfo(" - "CL_PROGRAM_BUILD_LOG) fails with " << e); + "CL_PROGRAM_BUILD_LOG) fails with " << ::opencl::errorString(e)); if (e == CL_SUCCESS) SAL_WARN( "sc.opencl", @@ -3761,7 +3768,7 @@ void DynamicKernel::CreateKernel() } } #endif - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clBuildProgram", err, __FILE__, __LINE__); } // Generate binary out of compiled kernel. ::opencl::generatBinFromKernelSource(mpProgram, @@ -3774,7 +3781,7 @@ void DynamicKernel::CreateKernel() } mpKernel = clCreateKernel(mpProgram, kname.c_str(), &err); if (err != CL_SUCCESS) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__); } void DynamicKernel::Launch( size_t nr ) @@ -3788,13 +3795,13 @@ void DynamicKernel::Launch( size_t nr ) (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__); + throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__); SAL_INFO("sc.opencl", "Created buffer " << mpResClmem << " size " << nr << "*" << sizeof(double) << "=" << (nr*sizeof(double))); SAL_INFO("sc.opencl", "Kernel " << mpKernel << " arg " << 0 << ": cl_mem: " << mpResClmem); err = clSetKernelArg(mpKernel, 0, sizeof(cl_mem), (void*)&mpResClmem); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__); // The rest of buffers mSyms.Marshal(mpKernel, nr, mpProgram); size_t global_work_size[] = { nr }; @@ -3802,10 +3809,10 @@ void DynamicKernel::Launch( size_t nr ) err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, mpKernel, 1, NULL, global_work_size, NULL, 0, NULL, NULL); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__); err = clFlush(kEnv.mpkCmdQueue); if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); + throw OpenCLError("clFlush", err, __FILE__, __LINE__); } // Symbol lookup. If there is no such symbol created, allocate one @@ -3954,7 +3961,7 @@ public: if (err != CL_SUCCESS) { - SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err); + SAL_WARN("sc.opencl", "clEnqueueMapBuffer failed:: " << ::opencl::errorString(err)); mpResBuf = NULL; return; } @@ -3962,7 +3969,7 @@ public: err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL); if (err != CL_SUCCESS) { - SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err); + SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err)); mpResBuf = NULL; } } @@ -4023,7 +4030,7 @@ public: } catch (const OpenCLError& oce) { - SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << oce.mError << " at " << oce.mFile << ":" << oce.mLineNumber); + SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error from " << oce.mFunction << ": " << ::opencl::errorString(oce.mError) << " at " << oce.mFile << ":" << oce.mLineNumber); return CLInterpreterResult(); } catch (const Unhandled& uh) @@ -4088,6 +4095,9 @@ bool waitForResults() ::opencl::setKernelEnv(&kEnv); cl_int err = clFinish(kEnv.mpkCmdQueue); + if (err != CL_SUCCESS) + SAL_WARN("sc.opencl", "clFinish failed: " << ::opencl::errorString(err)); + return err == CL_SUCCESS; } diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx index 1c24c12..671987e 100644 --- a/sc/source/core/opencl/opbase.cxx +++ b/sc/source/core/opencl/opbase.cxx @@ -19,10 +19,14 @@ UnhandledToken::UnhandledToken( formula::FormulaToken* t, const char* m, const std::string& fn, int ln ) : mToken(t), mMessage(m), mFile(fn), mLineNumber(ln) {} -OpenCLError::OpenCLError( cl_int err, const std::string& fn, int ln ) : - mError(err), mFile(fn), mLineNumber(ln) +OpenCLError::OpenCLError( const std::string function, cl_int error, const std::string& file, int line ) : + mFunction(function), mError(error), mFile(file), mLineNumber(line) { - SAL_INFO("sc.opencl", "OpenCL error: " << ::opencl::errorString(mError)); + // Not sure if this SAL_INFO() is useful; the place in + // CLInterpreterContext::launchKernel() where OpenCLError is + // caught already uses SAL_WARN() to display it. + + // SAL_INFO("sc.opencl", "OpenCL error: " << ::opencl::errorString(mError)); } Unhandled::Unhandled( const std::string& fn, int ln ) : diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx index b4c4493..5c7228d 100644 --- a/sc/source/core/opencl/opbase.hxx +++ b/sc/source/core/opencl/opbase.hxx @@ -42,8 +42,9 @@ public: class OpenCLError { public: - OpenCLError( cl_int err, const std::string& fn, int ln ); + OpenCLError( const std::string function, cl_int error, const std::string& file, int line ); + std::string mFunction; cl_int mError; std::string mFile; int mLineNumber; commit 43617f14485b79609079c55c872ac088e231db3c Author: Tor Lillqvist <[email protected]> Date: Thu Feb 5 23:42:30 2015 +0200 Move OpenCLError::strerror() from sc to opencl, and rename to errorString() There is nothing Calc-specific in this function, and surely it will be good to output OpenCL errors symbolically also in the opencl module. Change-Id: Ibe7d0d036f24dd87e06b8290224e1033dda0f3d1 diff --git a/include/opencl/openclwrapper.hxx b/include/opencl/openclwrapper.hxx index 9fde5d6..75ecbc8 100644 --- a/include/opencl/openclwrapper.hxx +++ b/include/opencl/openclwrapper.hxx @@ -79,6 +79,12 @@ OPENCL_DLLPUBLIC void getOpenCLDeviceInfo(size_t& rDeviceId, size_t& rPlatformId */ OPENCL_DLLPUBLIC void setOpenCLCmdQueuePosition( int nPos ); +/** + * Return a textual representation of an OpenCL error code. + * (Currently the symbolic name sans the CL_ prefix.) + */ +OPENCL_DLLPUBLIC const char* errorString(cl_int nError); + } #endif diff --git a/opencl/source/openclwrapper.cxx b/opencl/source/openclwrapper.cxx index db53a04..658e275 100644 --- a/opencl/source/openclwrapper.cxx +++ b/opencl/source/openclwrapper.cxx @@ -854,6 +854,64 @@ void setOpenCLCmdQueuePosition( int nPos ) gpuEnv.mnCmdQueuePos = nPos; } +const char* errorString(cl_int nError) +{ +#define CASE(val) case CL_##val: return #val + switch (nError) + { + CASE(SUCCESS); + CASE(DEVICE_NOT_FOUND); + CASE(DEVICE_NOT_AVAILABLE); + CASE(COMPILER_NOT_AVAILABLE); + CASE(MEM_OBJECT_ALLOCATION_FAILURE); + CASE(OUT_OF_RESOURCES); + CASE(OUT_OF_HOST_MEMORY); + CASE(PROFILING_INFO_NOT_AVAILABLE); + CASE(MEM_COPY_OVERLAP); + CASE(IMAGE_FORMAT_MISMATCH); + CASE(IMAGE_FORMAT_NOT_SUPPORTED); + CASE(BUILD_PROGRAM_FAILURE); + CASE(MAP_FAILURE); + CASE(INVALID_VALUE); + CASE(INVALID_DEVICE_TYPE); + CASE(INVALID_PLATFORM); + CASE(INVALID_DEVICE); + CASE(INVALID_CONTEXT); + CASE(INVALID_QUEUE_PROPERTIES); + CASE(INVALID_COMMAND_QUEUE); + CASE(INVALID_HOST_PTR); + CASE(INVALID_MEM_OBJECT); + CASE(INVALID_IMAGE_FORMAT_DESCRIPTOR); + CASE(INVALID_IMAGE_SIZE); + CASE(INVALID_SAMPLER); + CASE(INVALID_BINARY); + CASE(INVALID_BUILD_OPTIONS); + CASE(INVALID_PROGRAM); + CASE(INVALID_PROGRAM_EXECUTABLE); + CASE(INVALID_KERNEL_NAME); + CASE(INVALID_KERNEL_DEFINITION); + CASE(INVALID_KERNEL); + CASE(INVALID_ARG_INDEX); + CASE(INVALID_ARG_VALUE); + CASE(INVALID_ARG_SIZE); + CASE(INVALID_KERNEL_ARGS); + CASE(INVALID_WORK_DIMENSION); + CASE(INVALID_WORK_GROUP_SIZE); + CASE(INVALID_WORK_ITEM_SIZE); + CASE(INVALID_GLOBAL_OFFSET); + CASE(INVALID_EVENT_WAIT_LIST); + CASE(INVALID_EVENT); + CASE(INVALID_OPERATION); + CASE(INVALID_GL_OBJECT); + CASE(INVALID_BUFFER_SIZE); + CASE(INVALID_MIP_LEVEL); + CASE(INVALID_GLOBAL_WORK_SIZE); + default: + return "Unknown OpenCL error code"; + } +#undef CASE +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx index bf3f8d8..1c24c12 100644 --- a/sc/source/core/opencl/opbase.cxx +++ b/sc/source/core/opencl/opbase.cxx @@ -7,6 +7,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include <opencl/openclwrapper.hxx> + #include "opbase.hxx" using namespace formula; @@ -20,65 +22,7 @@ UnhandledToken::UnhandledToken( OpenCLError::OpenCLError( cl_int err, const std::string& fn, int ln ) : mError(err), mFile(fn), mLineNumber(ln) { - SAL_INFO("sc.opencl", "OpenCLError:" << mError << ": " << strerror(mError)); -} - -const char* OpenCLError::strerror( cl_int i ) const -{ -#define CASE(val) case val: return #val - switch (i) - { - CASE(CL_SUCCESS); - CASE(CL_DEVICE_NOT_FOUND); - CASE(CL_DEVICE_NOT_AVAILABLE); - CASE(CL_COMPILER_NOT_AVAILABLE); - CASE(CL_MEM_OBJECT_ALLOCATION_FAILURE); - CASE(CL_OUT_OF_RESOURCES); - CASE(CL_OUT_OF_HOST_MEMORY); - CASE(CL_PROFILING_INFO_NOT_AVAILABLE); - CASE(CL_MEM_COPY_OVERLAP); - CASE(CL_IMAGE_FORMAT_MISMATCH); - CASE(CL_IMAGE_FORMAT_NOT_SUPPORTED); - CASE(CL_BUILD_PROGRAM_FAILURE); - CASE(CL_MAP_FAILURE); - CASE(CL_INVALID_VALUE); - CASE(CL_INVALID_DEVICE_TYPE); - CASE(CL_INVALID_PLATFORM); - CASE(CL_INVALID_DEVICE); - CASE(CL_INVALID_CONTEXT); - CASE(CL_INVALID_QUEUE_PROPERTIES); - CASE(CL_INVALID_COMMAND_QUEUE); - CASE(CL_INVALID_HOST_PTR); - CASE(CL_INVALID_MEM_OBJECT); - CASE(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR); - CASE(CL_INVALID_IMAGE_SIZE); - CASE(CL_INVALID_SAMPLER); - CASE(CL_INVALID_BINARY); - CASE(CL_INVALID_BUILD_OPTIONS); - CASE(CL_INVALID_PROGRAM); - CASE(CL_INVALID_PROGRAM_EXECUTABLE); - CASE(CL_INVALID_KERNEL_NAME); - CASE(CL_INVALID_KERNEL_DEFINITION); - CASE(CL_INVALID_KERNEL); - CASE(CL_INVALID_ARG_INDEX); - CASE(CL_INVALID_ARG_VALUE); - CASE(CL_INVALID_ARG_SIZE); - CASE(CL_INVALID_KERNEL_ARGS); - CASE(CL_INVALID_WORK_DIMENSION); - CASE(CL_INVALID_WORK_GROUP_SIZE); - CASE(CL_INVALID_WORK_ITEM_SIZE); - CASE(CL_INVALID_GLOBAL_OFFSET); - CASE(CL_INVALID_EVENT_WAIT_LIST); - CASE(CL_INVALID_EVENT); - CASE(CL_INVALID_OPERATION); - CASE(CL_INVALID_GL_OBJECT); - CASE(CL_INVALID_BUFFER_SIZE); - CASE(CL_INVALID_MIP_LEVEL); - CASE(CL_INVALID_GLOBAL_WORK_SIZE); - default: - return "Unknown OpenCL error code"; - } -#undef CASE + SAL_INFO("sc.opencl", "OpenCL error: " << ::opencl::errorString(mError)); } Unhandled::Unhandled( const std::string& fn, int ln ) : diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx index 866d7dd..b4c4493 100644 --- a/sc/source/core/opencl/opbase.hxx +++ b/sc/source/core/opencl/opbase.hxx @@ -41,9 +41,6 @@ public: /// Failed in marshaling class OpenCLError { -private: - const char* strerror( cl_int i ) const; - public: OpenCLError( cl_int err, const std::string& fn, int ln ); commit 7d7076446efa50a4a4997289272934bd35fa4d58 Author: Tor Lillqvist <[email protected]> Date: Thu Feb 5 22:57:26 2015 +0200 The ISNAN ifdefs can go away ISNAN was defined unconditionally since long, and even the original authors of this stuff started removing those conditionals last summer. for F in `git grep -l ISNAN sc`; do unifdef -DISNAN -B -o $F $F; done Change-Id: I61df4066d0ecc23b6ce26bac8f3fbdfaf4aceac4 diff --git a/sc/source/core/opencl/op_addin.cxx b/sc/source/core/opencl/op_addin.cxx index e3e5787..3bb7c60 100644 --- a/sc/source/core/opencl/op_addin.cxx +++ b/sc/source/core/opencl/op_addin.cxx @@ -50,17 +50,13 @@ void OpBesselj::GenSlidingWindowFunction(std::stringstream &ss, { const formula::SingleVectorRefToken*tmpCurSVR0 = static_cast<const formula::SingleVectorRefToken *>(tmpCur0); -#ifdef ISNAN ss << " if (gid0 < " << tmpCurSVR0->GetArrayLength() << ")\n"; ss << " {\n"; -#endif ss << " x = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (isNan(x))\n"; ss << " x = 0.0;\n"; ss << " }\n"; -#endif } else if(tmpCur0->GetType() == formula::svDouble) { @@ -86,17 +82,13 @@ void OpBesselj::GenSlidingWindowFunction(std::stringstream &ss, { const formula::SingleVectorRefToken*tmpCurSVR1 = static_cast<const formula::SingleVectorRefToken *>(tmpCur1); -#ifdef ISNAN ss << " if (gid0 < " << tmpCurSVR1->GetArrayLength() << ")\n"; ss << " {\n"; -#endif ss << " N = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (isNan(N))\n"; ss << " N = 0.0;\n"; ss << " }\n"; -#endif } else if(tmpCur1->GetType() == formula::svDouble) { @@ -220,25 +212,18 @@ void OpGestep::GenSlidingWindowFunction( assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken& rSVR = dynamic_cast< const formula::SingleVectorRefToken& >(*pCur); ss << " if (gid0 < " << rSVR.GetArrayLength() << ")\n"; ss << " {\n"; -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " {\n"; -#endif } else { -#ifdef ISNAN -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -255,7 +240,6 @@ void OpGestep::GenSlidingWindowFunction( ss << "tmp"<<i<<" ="<<vSubArguments[i]->GenSlidingWindowDeclRef(); ss <<";\n"; } -#endif } ss << " tmp =tmp0 >= tmp1 ? 1 : 0;\n"; ss << " return tmp;\n"; diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx index 2c249fa..2e3c59f 100644 --- a/sc/source/core/opencl/op_financial.cxx +++ b/sc/source/core/opencl/op_financial.cxx @@ -41,7 +41,6 @@ void RRI::GenSlidingWindowFunction( ss << " double fv;\n"; ss << " double pv;\n"; ss << " double nper;\n"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -65,34 +64,27 @@ void RRI::GenSlidingWindowFunction( ss<< " int buffer_fv_len = "; ss<< tmpCurDVR2->GetArrayLength(); ss << ";\n"; -#endif -#ifdef ISNAN ss<<" if(gid0>=buffer_nper_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n"; ss<<" nper = 0;\n\telse \n"; -#endif ss<<" nper = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n"; -#ifdef ISNAN ss<<" if(gid0>=buffer_pv_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n"; ss<<" pv = 0;\n\telse \n"; -#endif ss<<" pv = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n"; -#ifdef ISNAN ss<<" if(gid0>=buffer_pv_len || isNan("; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<"))\n"; ss<<" fv = 0;\n\telse \n"; -#endif ss<<" fv = "; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<";\n"; @@ -124,25 +116,17 @@ vSubArguments) assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#else -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << "{\n"; -#endif } else { -#ifdef ISNAN -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss <<" temp="<<vSubArguments[i]->GenSlidingWindowDeclRef(); @@ -159,10 +143,6 @@ vSubArguments) ); ss <<";\n"; } -#else - ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; -#endif } ss<<"if(tmp1==0)\n\t"; ss<<"\treturn 0;\n\t"; @@ -190,7 +170,6 @@ void OpDollarde::GenSlidingWindowFunction( ss << "double fInt = " << GetBottom() <<";\n\t"; ss << "double dollar;\n\t"; ss << "double fFrac;\n\t"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -203,22 +182,17 @@ void OpDollarde::GenSlidingWindowFunction( ss<< "int buffer_frac_len = "; ss<< tmpCurDVR1->GetArrayLength(); ss << ";\n\t"; -#endif -#ifdef ISNAN ss<<"if((gid0)>=buffer_dollar_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"dollar = 0;\n\telse \n\t\t"; -#endif ss<<"dollar = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if((gid0)>=buffer_frac_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"fFrac = 0;\n\telse \n\t\t"; -#endif ss<<"fFrac = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n\t"; @@ -247,7 +221,6 @@ void OpDollarfr::GenSlidingWindowFunction(std::stringstream &ss, ss << "double fInt = " << GetBottom() <<";\n\t"; ss << "double dollar;\n\t"; ss << "double fFrac;\n\t"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -260,22 +233,17 @@ void OpDollarfr::GenSlidingWindowFunction(std::stringstream &ss, ss<< "int buffer_frac_len = "; ss<< tmpCurDVR1->GetArrayLength(); ss << ";\n\t"; -#endif -#ifdef ISNAN ss<<"if((gid0)>=buffer_dollar_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"dollar = 0;\n\telse \n\t\t"; -#endif ss<<"dollar = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if((gid0)>=buffer_frac_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"fFrac = 0;\n\telse \n\t\t"; -#endif ss<<"fFrac = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n\t"; @@ -321,19 +289,14 @@ void OpDISC::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " {\n"; -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -350,10 +313,6 @@ void OpDISC::GenSlidingWindowFunction(std::stringstream& ss, ss << " arg" << i << " = "; ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; } -#else - ss << " arg" << i; - ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; -#endif } ss << " int nNullDate = 693594;\n"; ss << " tmp = 1.0 - arg2 / arg3;\n"; @@ -401,19 +360,14 @@ void OpINTRATE::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " {\n"; -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -430,10 +384,6 @@ void OpINTRATE::GenSlidingWindowFunction(std::stringstream& ss, ss << " arg" << i << " = "; ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; } -#else - ss << " arg" << i; - ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; -#endif } ss << " int nNullDate = GetNullDate();\n"; ss << " tmp = arg3 * pow(arg2,-1) - 1.0;\n"; @@ -476,7 +426,6 @@ void OpFV::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if(pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if(gid0 >= " << pSVR->GetArrayLength() << " || isNan("; @@ -484,7 +433,6 @@ void OpFV::GenSlidingWindowFunction(std::stringstream& ss, ss << "))\n"; ss << " arg" << j << " = " <<GetBottom() << ";\n"; ss << " else\n"; -#endif ss << " arg" << j << " = "; ss << vSubArguments[j]->GenSlidingWindowDeclRef(); ss << ";\n"; @@ -529,7 +477,6 @@ void OpIPMT::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if(pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if(gid0 >= " << pSVR->GetArrayLength() << " || isNan("; @@ -537,7 +484,6 @@ void OpIPMT::GenSlidingWindowFunction(std::stringstream& ss, ss << "))\n"; ss << " arg" << j << " = " <<GetBottom() << ";\n"; ss << " else\n"; -#endif ss << " arg" << j << " = "; ss << vSubArguments[j]->GenSlidingWindowDeclRef(); ss << ";\n"; @@ -596,19 +542,14 @@ void OpISPMT::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " {\n"; -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -625,10 +566,6 @@ void OpISPMT::GenSlidingWindowFunction(std::stringstream& ss, ss << " arg" << i << " = "; ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; } -#else - ss << " arg" << i; - ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; -#endif } ss << " tmp = arg3 * arg0 * ( arg1 - arg2) * pow(arg2, -1);\n"; ss << " return tmp;\n"; @@ -658,19 +595,14 @@ void OpDuration::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " {\n"; -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -687,10 +619,6 @@ void OpDuration::GenSlidingWindowFunction(std::stringstream& ss, ss << " arg" << i << " = "; ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; } -#else - ss << " arg" << i; - ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; -#endif } ss << " tmp = log(arg2 * pow( arg1,-1)) / log(arg0 + 1.0);\n"; ss << " return tmp;\n"; @@ -737,7 +665,6 @@ void OpDuration_ADD::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if(pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if(gid0 >= " << pSVR->GetArrayLength() << " || isNan("; @@ -745,7 +672,6 @@ void OpDuration_ADD::GenSlidingWindowFunction(std::stringstream& ss, ss << "))\n"; ss << " arg" << j << " = " <<GetBottom() << ";\n"; ss << " else\n"; -#endif ss << " arg" << j << " = "; ss << vSubArguments[j]->GenSlidingWindowDeclRef(); ss << ";\n"; @@ -798,19 +724,14 @@ void OpMDuration::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " {\n"; -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -827,10 +748,6 @@ void OpMDuration::GenSlidingWindowFunction(std::stringstream& ss, ss << " arg" << i << " = "; ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; } -#else - ss << " arg" << i; - ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; -#endif } ss << " int nNullDate = 693594;\n"; ss << " tmp = GetDuration_new( nNullDate, (int)arg0, (int)arg1, arg2,"; @@ -860,24 +777,16 @@ void Fvschedule::GenSlidingWindowFunction( ss << "int gid0 = get_global_id(0);\n\t"; ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ";\n\t"; -#ifdef ISNAN ss << "if (isNan(arg0))\n\t\t"; ss << "arg0 = 0;\n\t"; -#endif ss << "double arg1;\n\t"; ss << "int arrayLength = " << pCurDVR->GetArrayLength() << ";\n\t"; -#ifdef ISNAN ss << "for (int i = 0; i + gid0 < arrayLength &&"; ss << " i < " << nCurWindowSize << "; i++){\n\t\t"; -#else - ss << "for (int i = 0; i < " << nCurWindowSize << "; i++){\n\t\t"; -#endif ss << "arg1 = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n\t\t\t"; -#ifdef ISNAN ss << "if (isNan(arg1))\n\t\t\t\t"; ss << "arg1 = 0;\n\t\t\t"; -#endif ss << "tmp *= arg1 + 1.0;\n\t\t"; ss << "}\n\t"; ss << "return (double)tmp * arg0"; @@ -905,15 +814,12 @@ vSubArguments) ss << " int gid0 = get_global_id(0);\n"; ss << " double fRate,fVal;\n"; ss << " int nStartPer,nEndPer,nNumPeriods,nPayType;\n"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken(); FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken(); FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken(); -#endif -#ifdef ISNAN if(tmpCur0->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const @@ -923,10 +829,8 @@ vSubArguments) ss <<"))\n"; ss <<" fRate = 0;\n else\n"; } -#endif ss <<" fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur1->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const @@ -936,11 +840,9 @@ vSubArguments) ss <<"))\n"; ss <<" nNumPeriods = 0;\n else\n"; } -#endif ss <<" nNumPeriods = (int)"; ss <<vSubArguments[1]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur2->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const @@ -950,10 +852,8 @@ vSubArguments) ss <<"))\n"; ss <<" fVal = 0;\n else\n"; } -#endif ss <<" fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur3->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const @@ -963,11 +863,9 @@ vSubArguments) ss <<"))\n"; ss <<" nStartPer = 0;\n else\n"; } -#endif ss <<" nStartPer = (int)"; ss <<vSubArguments[3]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur4->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const @@ -977,12 +875,10 @@ vSubArguments) ss <<"))\n"; ss <<" nEndPer = 0;\n else\n"; } -#endif ss <<" nEndPer = (int)"; ss <<vSubArguments[4]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur5->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const @@ -992,7 +888,6 @@ vSubArguments) ss <<"))\n"; ss <<" nPayType = 0;\n else\n"; } -#endif ss <<" nPayType = (int)"<<vSubArguments[5]->GenSlidingWindowDeclRef(); ss <<";\n"; ss <<" double fRmz;\n"; @@ -1041,7 +936,6 @@ void IRR::GenSlidingWindowFunction(std::stringstream &ss, ss << " double nCount = 0.0;\n"; if (pSur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pSur); ss << " if (gid0 >= " << pSVR->GetArrayLength() << ")\n"; @@ -1049,15 +943,12 @@ void IRR::GenSlidingWindowFunction(std::stringstream &ss, ss << " if (isNan(fSchaetzwert))\n"; ss << " x = 0.1;\n"; ss << " else\n"; -#endif } else if (pSur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " if (isNan(fSchaetzwert))\n"; ss << " x = 0.1;\n"; ss << " else\n"; -#endif } ss << " x = fSchaetzwert;\n"; ss << " unsigned short nItCount = 0;\n"; @@ -1072,148 +963,96 @@ void IRR::GenSlidingWindowFunction(std::stringstream &ss, size_t nCurWindowSize = pDVR->GetRefRowSize(); ss << " for ( "; if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "i = gid0; i < " << pDVR->GetArrayLength(); ss << " && i < " << nCurWindowSize << " /2*2; i++){\n"; -#else - ss << "i = gid0; i < " << nCurWindowSize << " /2*2; i++)\n"; -#endif ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; ss << " i++;;\n"; ss << " arg1 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (!isNan(arg0)){\n"; -#endif ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n"; ss << " nCount += 1;\n"; ss << " }\n"; -#ifdef ISNAN ss << " if (!isNan(arg1)){\n"; -#endif ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n"; ss << " nCount += 1;\n"; ss << " }\n"; -#ifdef ISNAN ss << " }\n"; ss << "if(i < " << pDVR->GetArrayLength(); ss << " && i < " << nCurWindowSize << ") ;{\n"; -#else - ss << " i < " << nCurWindowSize << "){\n"; -#endif } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "; i < " << pDVR->GetArrayLength(); ss << " && i < (gid0+" << nCurWindowSize << " )/2*2; i++){\n"; -#else - ss << "; i < gid0+" << nCurWindowSize << " /2*2; i++)\n"; -#endif ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (!isNan(arg0)){\n"; -#endif ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n"; ss << " nCount += 1;\n"; -#ifdef ISNAN ss << " }\n"; -#endif ss << " i++;\n"; ss << " arg1 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (!isNan(arg1)){\n"; -#endif ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n"; ss << " nCount+=1;\n"; ss << " }\n"; -#ifdef ISNAN ss << " }\n"; ss << " if(i < " << pDVR->GetArrayLength(); ss << " && i < gid0+" << nCurWindowSize << "){\n"; -#else - ss << " i < " << nCurWindowSize << "){\n"; -#endif } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){ -#ifdef ISNAN ss << " ; i + gid0 < " << pDVR->GetArrayLength(); ss << " && i < " << nCurWindowSize << " /2*2; i++){\n"; -#else - ss << "; i < " << nCurWindowSize << " /2*2; i++)\n"; -#endif ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; ss << " i++;;\n"; ss << " arg1 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (!isNan(arg0)){\n"; -#endif ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n"; ss << " nCount += 1;\n"; ss << " }\n"; -#ifdef ISNAN ss << " if (!isNan(arg1)){\n"; -#endif ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n"; ss << " nCount+=1;\n"; ss << " }\n"; -#ifdef ISNAN ss << " }\n"; ss << " if(i + gid0 < " << pDVR->GetArrayLength() << " &&"; ss << " i < " << nCurWindowSize << "){\n"; -#else - ss << " i < " << nCurWindowSize << "){\n"; -#endif } else { -#ifdef ISNAN ss << "; i < " << nCurWindowSize << " /2*2; i++){\n"; -#else - ss << "; i < " << nCurWindowSize << " /2*2; i++)\n"; -#endif ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; ss << " i++;;\n"; ss << " arg1 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (!isNan(arg0)){\n"; -#endif ss << " fZaehler += arg0 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n"; ss << " nCount += 1;\n"; ss << " }\n"; -#ifdef ISNAN ss << " if (!isNan(arg1)){\n"; -#endif ss << " fZaehler += arg1 / pow(1.0 + x, nCount);\n"; ss << " fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n"; ss << " nCount+=1;\n"; ss << " }\n"; -#ifdef ISNAN ss << " }\n"; ss << "if(i<" << nCurWindowSize << "){\n"; -#else - ss << " i < " << nCurWindowSize << "){\n"; -#endif } ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN ss << " if (isNan(arg0))\n"; ss << " continue;\n"; -#endif ss << " fZaehler += arg0 / pow(1.0+x, nCount);\n"; ss << " fNenner += -nCount * arg0 / pow(1.0+x,nCount+1.0);\n"; ss << " nCount+=1;\n"; @@ -1363,7 +1202,6 @@ void PriceMat::GenSlidingWindowFunction( ss <<"double rate;\n\t"; ss <<"double yield;\n\t"; ss <<"int nBase;\n\t"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -1401,58 +1239,45 @@ void PriceMat::GenSlidingWindowFunction( ss<< "int buffer_base_len = "; ss<< tmpCurDVR5->GetArrayLength(); ss << ";\n\t"; -#endif -#ifdef ISNAN ss<<"if(gid0>=buffer_settle_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"settle = 0;\n\telse \n\t\t"; -#endif ss<<"settle = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_mat_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"mat = 0;\n\telse \n\t\t"; -#endif ss<<"mat = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_issue_len || isNan("; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"issue = 0;\n\telse \n\t\t"; -#endif ss<<"issue = "; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_rate_len || isNan("; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"rate = 0;\n\telse \n\t\t"; -#endif ss<<"rate = "; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_yield_len || isNan("; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"yield = 0;\n\telse \n\t\t"; -#endif ss<<"yield = "; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_base_len || isNan("; ss << vSubArguments[5]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"nBase = 0;\n\telse \n\t\t"; -#endif ss<<"nBase = "; ss << vSubArguments[5]->GenSlidingWindowDeclRef(); ss<<";\n\t"; @@ -1485,7 +1310,6 @@ void OpSYD::GenSlidingWindowFunction(std::stringstream &ss, ss << " double salvage;\n"; ss << " double life;\n"; ss << " double period;\n"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -1516,41 +1340,32 @@ void OpSYD::GenSlidingWindowFunction(std::stringstream &ss, ss << " int buffer_period_len = "; ss << tmpCurDVR3->GetArrayLength(); ss << ";\n"; -#endif -#ifdef ISNAN ss <<" if(gid0>=buffer_cost_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" cost = 0;\n\telse \n"; -#endif ss <<" cost = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN ss <<" if(gid0>=buffer_salvage_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" salvage = 0;\n\telse \n"; -#endif ss <<" salvage = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN ss <<" if(gid0>=buffer_life_len || isNan("; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" life = 0;\n\telse \n"; -#endif ss <<" life = "; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN ss <<" if(gid0>=buffer_period_len || isNan("; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" period = 0;\n\telse \n"; -#endif ss <<" period = "; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss <<";\n"; @@ -1598,7 +1413,6 @@ void MIRR::GenSlidingWindowFunction( ss << ";\n\t"; ss << "int argLen1 = " << pSVR1->GetArrayLength() << ";\n\t"; ss << "int argLen2 = " << pSVR2->GetArrayLength() << ";\n\t"; -#ifdef ISNAN ss << "if (gid0 >= argLen1)\n\t\t"; ss << "arg1 = 0.0;\n\t"; ss << "if (gid0 >= argLen2)\n\t\t"; @@ -1607,7 +1421,6 @@ void MIRR::GenSlidingWindowFunction( ss << "arg1 = 0.0;\n\t"; ss << "if (isNan(arg2))\n\t\t"; ss << "arg2 = 0.0;\n\t"; -#endif ss << "double invest = arg1 + 1.0;\n\t"; ss << "double reinvest = arg2 + 1.0;\n\t"; ss << "double NPV_invest = 0.0;\n\t"; @@ -1616,18 +1429,12 @@ void MIRR::GenSlidingWindowFunction( ss << "double Pow_reinvest = 1.0;\n\t"; ss << "int nCount = 0;\n\t"; ss << "int arrayLength = " << pCurDVR->GetArrayLength() << ";\n\t"; -#ifdef ISNAN ss << "for (int i = 0; i + gid0 < arrayLength &&"; ss << " i < " << nCurWindowSize << "; i++){\n\t\t"; -#else - ss << "for (int i = 0; i < " << nCurWindowSize << "; i++){\n\t\t"; -#endif ss << "arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ";\n\t\t"; -#ifdef ISNAN ss << "if (isNan(arg0))\n\t\t\t"; ss << "continue;\n\t\t"; -#endif ss << "if (arg0 > 0.0)\n\t\t\t"; ss << "NPV_reinvest += arg0 * Pow_reinvest;\n\t\t"; ss << "else if (arg0 < 0.0)\n\t\t\t"; @@ -1665,19 +1472,14 @@ void OpEffective::GenSlidingWindowFunction(std::stringstream& ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << " {\n"; -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -1694,10 +1496,6 @@ void OpEffective::GenSlidingWindowFunction(std::stringstream& ss, ss << " arg" << i << " = "; ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; } -#else - ss << " arg" << i; - ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n"; -#endif } ss << " tmp = pow(1.0 + arg0 * pow(arg1, -1), arg1)-1.0;\n"; ss << " return tmp;\n"; @@ -1734,7 +1532,6 @@ void OpTbilleq::GenSlidingWindowFunction( ss << "double tmp001;\n\t"; ss << "double tmp002;\n\t"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -1758,34 +1555,27 @@ void OpTbilleq::GenSlidingWindowFunction( ss<< "int buffer_tmp002_len = "; ss<< tmpCurDVR2->GetArrayLength(); ss << ";\n\t"; -#endif -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp000_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp000 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp000 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp001_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp001 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp001 = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp002_len || isNan("; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp002 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp002 = "; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<";\n\t"; @@ -1818,15 +1608,12 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss, ss << " int gid0 = get_global_id(0);\n"; ss << " double fRate,fVal;\n"; ss << " int nStartPer,nEndPer,nNumPeriods,nPayType;\n"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken(); FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken(); FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken(); -#endif -#ifdef ISNAN if(tmpCur0->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const @@ -1836,10 +1623,8 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss, ss <<"))\n"; ss <<" fRate = 0;\n else\n"; } -#endif ss <<" fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur1->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const @@ -1849,11 +1634,9 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss, ss <<"))\n"; ss <<" nNumPeriods = 0;\n else\n"; } -#endif ss <<" nNumPeriods = (int)"; ss <<vSubArguments[1]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur2->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const @@ -1863,10 +1646,8 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss, ss <<"))\n"; ss <<" fVal = 0;\n else\n"; } -#endif ss <<" fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur3->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const @@ -1876,11 +1657,9 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss, ss <<"))\n"; ss <<" nStartPer = 0;\n else\n"; } -#endif ss <<" nStartPer = (int)"; ss <<vSubArguments[3]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur4->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const @@ -1890,12 +1669,10 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss, ss <<"))\n"; ss <<" nEndPer = 0;\n else\n"; } -#endif ss <<" nEndPer = (int)"; ss <<vSubArguments[4]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN if(tmpCur5->GetType() == formula::svSingleVectorRef) { const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const @@ -1905,7 +1682,6 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss, ss <<"))\n"; ss <<" nPayType = 0;\n else\n"; } -#endif ss <<" nPayType = (int)"; ss <<vSubArguments[5]->GenSlidingWindowDeclRef(); ss <<";\n"; @@ -1959,7 +1735,6 @@ void OpAccrint::GenSlidingWindowFunction( ss << " int nStartDate,nEndDate,mode,freq;\n"; ss << " int nDays1stYear=0;\n"; ss << " double fVal,fRate;\n"; -#ifdef ISNAN FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -1996,58 +1771,45 @@ void OpAccrint::GenSlidingWindowFunction( ss<< " int buffer_nMode_len = "; ss<< tmpCurDVR6->GetArrayLength(); ss << ";\n"; -#endif -#ifdef ISNAN ss<<" if(gid0 >= buffer_nIssue_len || isNan("; ss <<vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" nStartDate = 0;\n else\n"; -#endif ss <<" nStartDate=(int)"; ss <<vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN ss <<" if(gid0 >= buffer_nSettle_len || isNan("; ss <<vSubArguments[2]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" nEndDate = 0;\n else\n"; -#endif ss <<" nEndDate=(int)"; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss << ";\n"; -#ifdef ISNAN ss <<" if(gid0 >= buffer_fRate_len || isNan("; ss <<vSubArguments[3]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" fRate = 0;\n else\n"; -#endif ss <<" fRate="; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN ss <<" if(gid0 >= buffer_fVal_len || isNan("; ss <<vSubArguments[4]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" fVal = 0;\n else\n"; -#endif ss <<" fVal="; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN ss <<" if(gid0 >= buffer_nFreq_len || isNan("; ss <<vSubArguments[5]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" freq = 0;\n else\n"; -#endif ss <<" freq= (int)"; ss << vSubArguments[5]->GenSlidingWindowDeclRef(); ss <<";\n"; -#ifdef ISNAN ss <<" if(gid0 >= buffer_nMode_len || isNan("; ss <<vSubArguments[6]->GenSlidingWindowDeclRef(); ss <<"))\n"; ss <<" mode = 0;\n else\n"; -#endif ss <<" mode = (int)"; ss << vSubArguments[6]->GenSlidingWindowDeclRef(); ss <<";\n"; @@ -2086,7 +1848,6 @@ void OpAccrintm::GenSlidingWindowFunction( ss << "double tmp = " << GetBottom() <<";\n\t"; ss << "int nStartDate,nEndDate,mode;\n\t"; ss << "double fRate,fVal;\n\t"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -2124,50 +1885,39 @@ void OpAccrintm::GenSlidingWindowFunction( ss<< "int buffer_nMode_len = "; ss<< tmpCurDVR4->GetArrayLength(); ss << ";\n\t"; -#endif -#ifdef ISNAN ss <<"if(gid0 >= buffer_nIssue_len || isNan("; ss <<vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<"))\n\t\t"; ss <<"nStartDate = 0;\n\telse\n\t\t"; -#endif ss << "nStartDate=(int)"; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss <<";\n\t"; -#ifdef ISNAN ss <<"if(gid0 >= buffer_nSettle_len || isNan("; ss <<vSubArguments[1]->GenSlidingWindowDeclRef(); ss <<"))\n\t\t"; ss <<"nEndDate = 0;\n\telse\n\t\t"; -#endif ss << "nEndDate=(int)"; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << ";\n\t"; -#ifdef ISNAN ss <<"if(gid0 >= buffer_fRate_len || isNan("; ss <<vSubArguments[2]->GenSlidingWindowDeclRef(); ss <<"))\n\t\t"; ss <<"fRate = 0;\n\telse\n\t\t"; -#endif ss << "fRate="; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss <<";\n\t"; -#ifdef ISNAN ss <<"if(gid0 >= buffer_fVal_len || isNan("; ss <<vSubArguments[3]->GenSlidingWindowDeclRef(); ss <<"))\n\t\t"; ss <<"fVal = 0;\n\telse\n\t\t"; -#endif ss << "fVal="; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss << ";\n\t"; -#ifdef ISNAN ss <<"if(gid0 >= buffer_nMode_len || isNan("; ss <<vSubArguments[4]->GenSlidingWindowDeclRef(); ss <<"))\n\t\t"; ss <<"mode = 0;\n\telse\n\t\t"; -#endif ss << "mode = (int)"; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss << ";\n\t"; @@ -2231,7 +1981,6 @@ void OpYield::GenSlidingWindowFunction( ss << "double tmp005;\n\t"; ss << "double tmp006;\n\t"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -2287,74 +2036,59 @@ void OpYield::GenSlidingWindowFunction( ss<< "int buffer_tmp006_len = "; ss<< tmpCurDVR6->GetArrayLength(); ss << ";\n\t"; -#endif -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp000_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp000 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp000 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp001_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp001 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp001 = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp002_len || isNan("; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp002 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp002 = "; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp003_len || isNan("; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp003 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp003 = "; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp004_len || isNan("; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp004 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp004 = "; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp005_len || isNan("; ss << vSubArguments[5]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp005 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp005 = "; ss << vSubArguments[5]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp006_len || isNan("; ss << vSubArguments[6]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp006 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp006 = "; ss << vSubArguments[6]->GenSlidingWindowDeclRef(); ss<<";\n\t"; @@ -2383,7 +2117,6 @@ void OpSLN::GenSlidingWindowFunction(std::stringstream &ss, ss << " double rest;\n"; ss << " double dauer;\n"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -2402,31 +2135,24 @@ void OpSLN::GenSlidingWindowFunction(std::stringstream &ss, ss<< " int buffer_dauer_len = "; ss<< tmpCurDVR2->GetArrayLength(); ss << ";\n"; -#endif -#ifdef ISNAN ss<<" if(gid0>=buffer_wert_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n"; ss<<" wert = 0;\n\telse \n"; -#endif ss<<" wert = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n"; -#ifdef ISNAN ss<<" if(gid0>=buffer_rest_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n"; ss<<" rest = 0;\n\telse \n"; -#endif ss<<" rest = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n"; -#ifdef ISNAN ss<<" if(gid0>=buffer_dauer_len || isNan("; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<"))\n"; ss<<" dauer = 0;\n\telse \n"; -#endif ss<<" dauer = "; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<";\n"; @@ -2470,7 +2196,6 @@ void OpYieldmat::GenSlidingWindowFunction( ss << "double tmp004;\n\t"; ss << "double tmp005;\n\t"; -#ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const formula::SingleVectorRefToken *>(tmpCur0); @@ -2519,64 +2244,50 @@ void OpYieldmat::GenSlidingWindowFunction( ss<< tmpCurDVR5->GetArrayLength(); ss << ";\n\t"; -#endif - -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp000_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp000 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp000 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp001_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp001 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp001 = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp002_len || isNan("; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp002 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp002 = "; ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp003_len || isNan("; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp003 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp003 = "; ss << vSubArguments[3]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp004_len || isNan("; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp004 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp004 = "; ss << vSubArguments[4]->GenSlidingWindowDeclRef(); ss<<";\n\t"; -#ifdef ISNAN ss<<"if(gid0>=buffer_tmp005_len || isNan("; ss << vSubArguments[5]->GenSlidingWindowDeclRef(); ss<<"))\n\t\t"; ss<<"tmp005 = 0;\n\telse \n\t\t"; -#endif ss<<"tmp005 = "; ss << vSubArguments[5]->GenSlidingWindowDeclRef(); ss<<";\n\t"; @@ -2613,25 +2324,17 @@ void OpPMT::GenSlidingWindowFunction(std::stringstream &ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#else -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << "{\n"; -#endif } else { -#ifdef ISNAN -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss <<" temp="<<vSubArguments[i]->GenSlidingWindowDeclRef(); @@ -2648,11 +2351,6 @@ void OpPMT::GenSlidingWindowFunction(std::stringstream &ss, ); ss <<";\n"; } -#else - ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; - -#endif } ss<<" if(tmp0==0.0)\n"; ss<<" return -(tmp2+tmp3)/tmp1;\n"; @@ -2694,57 +2392,33 @@ void OpNPV::GenSlidingWindowFunction(std::stringstream &ss, size_t nCurWindowSize = pDVR->GetRefRowSize(); ss << " for (int i = "; if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "gid0; i < " << pDVR->GetArrayLength(); ss << " && i < " << nCurWindowSize << "; i++){\n"; -#else - ss << "gid0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "0; i < " << pDVR->GetArrayLength(); ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n"; -#endif } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){ -#ifdef ISNAN ss << "0; i + gid0 < " << pDVR->GetArrayLength(); ss << " && i < "<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } else { -#ifdef ISNAN ss << "0; i < "<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } } else if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#else -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << "{\n"; -#endif } else { -#ifdef ISNAN ss << "nCount += 1;\n"; -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " double temp="; @@ -2776,12 +2450,6 @@ void OpNPV::GenSlidingWindowFunction(std::stringstream &ss, ss << " tmp +=temp/ temp1;\n"; ss << " nCount += 1;\n"; } -#else - ss << "tmp +="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<" / pow(1.0f+ arg0 ,"; - ss <<" (double)nCount );\n"; - ss << " nCount += 1;\n"; -#endif } ss << " return tmp;\n"; ss << "}"; @@ -2851,25 +2519,17 @@ void OpPrice::GenSlidingWindowFunction(std::stringstream &ss, assert(pCur); if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#else -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << "{\n"; -#endif } else { -#ifdef ISNAN -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -2887,11 +2547,6 @@ void OpPrice::GenSlidingWindowFunction(std::stringstream &ss, ss << vSubArguments[i]->GenSlidingWindowDeclRef(); ss <<";\n"; } -#else - ss << " tmp"<<i<<"="; - ss<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; -#endif } ss << " if(tmp4*tmp5 == 0) return NAN;\n"; ss << " tmp = getPrice_(tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);\n"; @@ -2947,56 +2602,32 @@ void OpOddlprice::GenSlidingWindowFunction(std::stringstream &ss, size_t nCurWindowSize = pDVR->GetRefRowSize(); ss << " for (int i = "; if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "gid0; i < " << pDVR->GetArrayLength(); ss << " && i < " << nCurWindowSize << "; i++){\n"; -#else - ss << "gid0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "0; i < " << pDVR->GetArrayLength(); ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n"; -#endif } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){ -#ifdef ISNAN ss << "0; i + gid0 < " << pDVR->GetArrayLength(); ss << " && i < "<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } else { -#ifdef ISNAN ss << "0; i < "<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } } else if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#else -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << "{\n"; -#endif } else { -#ifdef ISNAN -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -3015,10 +2646,6 @@ void OpOddlprice::GenSlidingWindowFunction(std::stringstream &ss, ss <<vSubArguments[i]->GenSlidingWindowDeclRef(); ss <<";\n"; } -#else - ss << " tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); - ss <<";\n"; -#endif } ss <<" int nNullDate = GetNullDate();\n"; ss <<" tmp = GetOddlprice(nNullDate,tmp0,tmp1,"; @@ -3074,56 +2701,32 @@ void OpOddlyield::GenSlidingWindowFunction(std::stringstream &ss, size_t nCurWindowSize = pDVR->GetRefRowSize(); ss << " for (int i = "; if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "gid0; i < " << pDVR->GetArrayLength(); ss << " && i < " << nCurWindowSize << "; i++){\n"; -#else - ss << "gid0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) { -#ifdef ISNAN ss << "0; i < " << pDVR->GetArrayLength(); ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n"; -#endif } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){ -#ifdef ISNAN ss << "0; i + gid0 < " << pDVR->GetArrayLength(); ss << " && i < "<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } else { -#ifdef ISNAN ss << "0; i < "<< nCurWindowSize << "; i++){\n"; -#else - ss << "0; i < "<< nCurWindowSize << "; i++)\n"; -#endif } } else if (pCur->GetType() == formula::svSingleVectorRef) { -#ifdef ISNAN const formula::SingleVectorRefToken* pSVR = static_cast< const formula::SingleVectorRefToken* >(pCur); ss << " if (gid0 < " << pSVR->GetArrayLength() << "){\n"; -#else -#endif } else if (pCur->GetType() == formula::svDouble) { -#ifdef ISNAN ss << "{\n"; -#endif } else { -#ifdef ISNAN -#endif } -#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss << " if (isNan("; @@ -3142,10 +2745,6 @@ void OpOddlyield::GenSlidingWindowFunction(std::stringstream &ss, ss <<vSubArguments[i]->GenSlidingWindowDeclRef(); ss <<";\n"; } -#else ... etc. - the rest is truncated _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
