summaryrefslogtreecommitdiff
path: root/src/opencl_mesh_kit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/opencl_mesh_kit.cpp')
-rw-r--r--src/opencl_mesh_kit.cpp62
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() {