From 5e3fdf5067a6c9823645d9dcced829169145af9e Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Thu, 22 Oct 2009 03:53:47 +0000 Subject: [PATCH] add timing of the OpenCL compile functions...they're really slow here, almost 20seconds total... git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4449 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/OpenCL.cpp | 105 +++++++++++++++++------------- Source/Core/Common/Src/OpenCL.h | 19 +++--- 2 files changed, 70 insertions(+), 54 deletions(-) diff --git a/Source/Core/Common/Src/OpenCL.cpp b/Source/Core/Common/Src/OpenCL.cpp index c3ff939ab0..37ffb9d028 100644 --- a/Source/Core/Common/Src/OpenCL.cpp +++ b/Source/Core/Common/Src/OpenCL.cpp @@ -19,17 +19,21 @@ #include "OpenCL.h" #include "Common.h" +#include "Timer.h" -namespace OpenCL { - #if defined(HAVE_OPENCL) && HAVE_OPENCL - cl_device_id device_id = NULL; - cl_context g_context = NULL; - cl_command_queue g_cmdq = NULL; - #endif +namespace OpenCL +{ + +#if defined(HAVE_OPENCL) && HAVE_OPENCL +cl_device_id device_id = NULL; +cl_context g_context = NULL; +cl_command_queue g_cmdq = NULL; +#endif bool g_bInitialized = false; -bool Initialize() { +bool Initialize() +{ if(g_bInitialized) return true; @@ -66,62 +70,72 @@ bool Initialize() { HandleCLError(err, "Failed to create a command commands!"); return false; } - //PanicAlert("Initialized OpenCL fine!"); + + NOTICE_LOG(COMMON, "Initialized OpenCL!"); g_bInitialized = true; return true; #else return false; #endif } + #if defined(HAVE_OPENCL) && HAVE_OPENCL -cl_context GetContext() { +cl_context GetContext() +{ return g_context; } -cl_command_queue GetCommandQueue() { +cl_command_queue GetCommandQueue() +{ return g_cmdq; } -cl_program CompileProgram(const char *Kernel) { - int err; - cl_program program; - program = clCreateProgramWithSource(OpenCL::g_context, 1, (const char **) & Kernel, NULL, &err); - if (!program) - { - HandleCLError(err, "Error: Failed to create compute program!"); - return NULL; - } +cl_program CompileProgram(const char *Kernel) +{ + u32 compileStart = timeGetTime(); + int err; + cl_program program; + program = clCreateProgramWithSource(OpenCL::g_context, 1, (const char **) & Kernel, NULL, &err); + if (!program) + { + HandleCLError(err, "Error: Failed to create compute program!"); + return NULL; + } - // Build the program executable - // - err = clBuildProgram(program , 0, NULL, NULL, NULL, NULL); - if(err != CL_SUCCESS) { - char *errors[16384] = {0}; - err = clGetProgramBuildInfo(program, OpenCL::device_id, CL_PROGRAM_BUILD_LOG, sizeof(errors), - errors, NULL); - PanicAlert("Error log:\n%s\n", errors); - return NULL; - } + // Build the program executable + // + err = clBuildProgram(program , 0, NULL, NULL, NULL, NULL); + if(err != CL_SUCCESS) { + char *errors[16384] = {0}; + err = clGetProgramBuildInfo(program, OpenCL::device_id, CL_PROGRAM_BUILD_LOG, sizeof(errors), + errors, NULL); + PanicAlert("Error log:\n%s\n", errors); + return NULL; + } - - return program; + NOTICE_LOG(COMMON, "OpenCL CompileProgram took %.3f seconds", (float)(timeGetTime() - compileStart) / 1000.0); + return program; } + cl_kernel CompileKernel(cl_program program, const char *Function) { - int err; - // Create the compute kernel in the program we wish to run - // - cl_kernel kernel = clCreateKernel(program, Function, &err); - if (!kernel || err != CL_SUCCESS) - { - HandleCLError(err, "Failed to create compute kernel!"); - return NULL; - } - return kernel; + u32 compileStart = timeGetTime(); + int err; + // Create the compute kernel in the program we wish to run + // + cl_kernel kernel = clCreateKernel(program, Function, &err); + if (!kernel || err != CL_SUCCESS) + { + HandleCLError(err, "Failed to create compute kernel!"); + return NULL; + } + NOTICE_LOG(COMMON, "OpenCL CompileKernel took %.3f seconds", (float)(timeGetTime() - compileStart) / 1000.0); + return kernel; } #endif -void Destroy() { +void Destroy() +{ #if defined(HAVE_OPENCL) && HAVE_OPENCL if(!g_context) return; @@ -130,9 +144,10 @@ void Destroy() { #endif } -#if defined(HAVE_OPENCL) && HAVE_OPENCL void HandleCLError(cl_int error, char* str) { +#if defined(HAVE_OPENCL) && HAVE_OPENCL + char* name; switch(error) { @@ -191,7 +206,7 @@ void HandleCLError(cl_int error, char* str) str = ""; PanicAlert("OpenCL error: %s %s (%d)", str, name, error); -} #endif +} -}; +} diff --git a/Source/Core/Common/Src/OpenCL.h b/Source/Core/Common/Src/OpenCL.h index 12baade12c..fcc43ac137 100644 --- a/Source/Core/Common/Src/OpenCL.h +++ b/Source/Core/Common/Src/OpenCL.h @@ -40,15 +40,18 @@ typedef void *cl_command_queue; typedef void *cl_program; typedef void *cl_kernel; typedef void *cl_mem; +typedef void *cl_int; #endif -namespace OpenCL { - #if defined(HAVE_OPENCL) && HAVE_OPENCL - extern cl_device_id device_id; - extern cl_context g_context; - extern cl_command_queue g_cmdq; - #endif +namespace OpenCL +{ + +#if defined(HAVE_OPENCL) && HAVE_OPENCL +extern cl_device_id device_id; +extern cl_context g_context; +extern cl_command_queue g_cmdq; +#endif bool Initialize(); @@ -61,9 +64,7 @@ void Destroy(); cl_program CompileProgram(const char *Kernel); cl_kernel CompileKernel(cl_program program, const char *Function); -#if defined(HAVE_OPENCL) && HAVE_OPENCL void HandleCLError(cl_int error, char* str = 0); -#endif -}; +} #endif