diff options
author | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2013-03-10 15:47:28 +0000 |
---|---|---|
committer | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2013-03-10 15:47:28 +0000 |
commit | 149388bfe5069aaefe7bbcd43cca59703e42531d (patch) | |
tree | 933c615a1721b346700e6cb2bcce41517f2d2ae3 /src/opencl_mesh_kit.cpp | |
parent | ae7574e62a0a629b7b33a0df56091a51bba275cb (diff) | |
download | 2013-gpudataviz-149388bfe5069aaefe7bbcd43cca59703e42531d.tar.gz 2013-gpudataviz-149388bfe5069aaefe7bbcd43cca59703e42531d.tar.bz2 2013-gpudataviz-149388bfe5069aaefe7bbcd43cca59703e42531d.zip |
Commit POURRI : problème de synchro pb GPU/CPU
git-svn-id: file:///var/svn/2013-gpudataviz/trunk@21 371a6b4a-a258-45f8-9dcc-bdd82ce0ac9d
Diffstat (limited to 'src/opencl_mesh_kit.cpp')
-rw-r--r-- | src/opencl_mesh_kit.cpp | 62 |
1 files changed, 35 insertions, 27 deletions
diff --git a/src/opencl_mesh_kit.cpp b/src/opencl_mesh_kit.cpp index a9010e8..abdf04d 100644 --- a/src/opencl_mesh_kit.cpp +++ b/src/opencl_mesh_kit.cpp @@ -155,51 +155,59 @@ cl_int OpenCLMeshKit::compileKernels(std::list<std::string> names, const char so return 0; } -cl_int OpenCLMeshKit::execKernel(std::string kernelName, float time) { +cl_int OpenCLMeshKit::execKernel(std::string kernelName, float karg_time) { - cl_int res; - cl_event eventND[1]; - size_t globalWorkSize[2], localWorkSize[2]; + cl_int res; + cl_event eventND[1]; + size_t globalWorkSize[2], localWorkSize[2]; cl_kernel kernel; + struct timespec before, after; + + clock_gettime(CLOCK_MONOTONIC_RAW, &before); std::map<std::string,cl_kernel>::iterator ii=this->kernels.find(kernelName); if ( ii==this->kernels.end() ) { - std::cerr << "execKernel(\"" << kernelName << "\", " << time << ") failed : no kernel found with this name" << std::endl; + std::cerr << "execKernel(\"" << kernelName << "\", " << karg_time \ + << ") failed : no kernel found with this name" << std::endl; return -1; } - + kernel=this->kernels[kernelName]; - // Set local and global work group sizes - globalWorkSize[0]=this->meshWidth; - globalWorkSize[1]=this->meshHeight; - localWorkSize[0]=this->groupSize; - localWorkSize[1]=1; + // Set local and global work group sizes + globalWorkSize[0]=this->meshWidth; + globalWorkSize[1]=this->meshHeight; + localWorkSize[0]=this->groupSize; + localWorkSize[1]=1; - res=clEnqueueAcquireGLObjects(this->cl_cq, 1, &(this->cl_vbo), 0, 0, NULL); + res=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 *)&time); + 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); - // Execute kernel on given device - res=clEnqueueNDRangeKernel(this->cl_cq, kernel, 2, NULL, globalWorkSize, localWorkSize, 0, NULL, eventND); - if ( res != CL_SUCCESS ) { + // 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; - } + return 1; + } //TODO : return values checking - res=clFlush(this->cl_cq); + res=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); + 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); + + clock_gettime(CLOCK_MONOTONIC_RAW, &after); + //TODO : remove this debug hint + std::cout << "execTime : " << after.tv_nsec - before.tv_nsec << std::cout; - return CL_SUCCESS; + return CL_SUCCESS; } void OpenCLMeshKit::releaseKernels() { |