diff options
Diffstat (limited to 'src/opencl_mesh_kit.cpp')
-rw-r--r-- | src/opencl_mesh_kit.cpp | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/src/opencl_mesh_kit.cpp b/src/opencl_mesh_kit.cpp index abdf04d..8ad18b3 100644 --- a/src/opencl_mesh_kit.cpp +++ b/src/opencl_mesh_kit.cpp @@ -157,13 +157,13 @@ cl_int OpenCLMeshKit::compileKernels(std::list<std::string> names, const char so cl_int OpenCLMeshKit::execKernel(std::string kernelName, float karg_time) { - cl_int res; + //cl_int res; cl_event eventND[1]; size_t globalWorkSize[2], localWorkSize[2]; cl_kernel kernel; - struct timespec before, after; + //struct timespec before, after; - clock_gettime(CLOCK_MONOTONIC_RAW, &before); + //clock_gettime(CLOCK_MONOTONIC_RAW, &before); std::map<std::string,cl_kernel>::iterator ii=this->kernels.find(kernelName); if ( ii==this->kernels.end() ) { @@ -180,32 +180,36 @@ cl_int OpenCLMeshKit::execKernel(std::string kernelName, float karg_time) { localWorkSize[0]=this->groupSize; localWorkSize[1]=1; - res=clEnqueueAcquireGLObjects(this->cl_cq, 1, &(this->cl_vbo), 0, 0, NULL); + CL_RETURN_VAL_IF_FAIL(1, + clEnqueueAcquireGLObjects(this->cl_cq, 1, &(this->cl_vbo), 0, 0, NULL) + ); - res=clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&(this->cl_vbo)); // float4 *pos - res=clSetKernelArg(kernel, 1, sizeof(cl_uint), (void *)&(this->meshWidth)); - res=clSetKernelArg(kernel, 2, sizeof(cl_uint), (void *)&(this->meshHeight)); - res=clSetKernelArg(kernel, 3, sizeof(float), (void *)&karg_time); + clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&(this->cl_vbo)); // float4 *pos + clSetKernelArg(kernel, 1, sizeof(cl_uint), (void *)&(this->meshWidth)); + clSetKernelArg(kernel, 2, sizeof(cl_uint), (void *)&(this->meshHeight)); + clSetKernelArg(kernel, 3, sizeof(float), (void *)&karg_time); // Execute kernel on given device - res=clEnqueueNDRangeKernel(this->cl_cq, kernel, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, eventND); - if ( res != CL_SUCCESS ) { - std::cerr << "clEnqueueNDRangeKernel() failed" << std::endl; - return 1; - } + CL_RETURN_VAL_IF_FAIL(2, + clEnqueueNDRangeKernel(this->cl_cq, kernel, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, eventND) + ); //TODO : return values checking - res=clFlush(this->cl_cq); + CL_RETURN_VAL_IF_FAIL(3, + clFlush(this->cl_cq) + ); // (CPU) Wait until GPU kernel execution end - res=clWaitForEvents(1,eventND); //XXX: SimpleGL utilise une attente active, pourquoi ? - res=clReleaseEvent(eventND[0]); - res=clEnqueueReleaseGLObjects(this->cl_cq, 1, &(this->cl_vbo), 0, 0, 0); - res=clFinish(this->cl_cq); + CL_RETURN_VAL_IF_FAIL(4, clWaitForEvents(1,eventND) ); //XXX: SimpleGL utilise une attente active, pourquoi ? + CL_RETURN_VAL_IF_FAIL(5, clReleaseEvent(eventND[0]) ); + CL_RETURN_VAL_IF_FAIL(6, + clEnqueueReleaseGLObjects(this->cl_cq, 1, &(this->cl_vbo), 0, 0, 0) + ); + CL_RETURN_VAL_IF_FAIL(7, clFinish(this->cl_cq) ); - clock_gettime(CLOCK_MONOTONIC_RAW, &after); + //clock_gettime(CLOCK_MONOTONIC_RAW, &after); //TODO : remove this debug hint - std::cout << "execTime : " << after.tv_nsec - before.tv_nsec << std::cout; + //std::cout << "kernel exec time : " << after.tv_nsec - before.tv_nsec << std::endl; return CL_SUCCESS; } |