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
This commit is contained in:
Shawn Hoffman 2009-10-22 03:53:47 +00:00
parent 7a2bad4efb
commit 5e3fdf5067
2 changed files with 70 additions and 54 deletions

View File

@ -19,17 +19,21 @@
#include "OpenCL.h" #include "OpenCL.h"
#include "Common.h" #include "Common.h"
#include "Timer.h"
namespace OpenCL { namespace OpenCL
#if defined(HAVE_OPENCL) && HAVE_OPENCL {
cl_device_id device_id = NULL;
cl_context g_context = NULL; #if defined(HAVE_OPENCL) && HAVE_OPENCL
cl_command_queue g_cmdq = NULL; cl_device_id device_id = NULL;
#endif cl_context g_context = NULL;
cl_command_queue g_cmdq = NULL;
#endif
bool g_bInitialized = false; bool g_bInitialized = false;
bool Initialize() { bool Initialize()
{
if(g_bInitialized) if(g_bInitialized)
return true; return true;
@ -66,62 +70,72 @@ bool Initialize() {
HandleCLError(err, "Failed to create a command commands!"); HandleCLError(err, "Failed to create a command commands!");
return false; return false;
} }
//PanicAlert("Initialized OpenCL fine!");
NOTICE_LOG(COMMON, "Initialized OpenCL!");
g_bInitialized = true; g_bInitialized = true;
return true; return true;
#else #else
return false; return false;
#endif #endif
} }
#if defined(HAVE_OPENCL) && HAVE_OPENCL #if defined(HAVE_OPENCL) && HAVE_OPENCL
cl_context GetContext() { cl_context GetContext()
{
return g_context; return g_context;
} }
cl_command_queue GetCommandQueue() { cl_command_queue GetCommandQueue()
{
return g_cmdq; return g_cmdq;
} }
cl_program CompileProgram(const char *Kernel) { cl_program CompileProgram(const char *Kernel)
int err; {
cl_program program; u32 compileStart = timeGetTime();
program = clCreateProgramWithSource(OpenCL::g_context, 1, (const char **) & Kernel, NULL, &err); int err;
if (!program) cl_program program;
{ program = clCreateProgramWithSource(OpenCL::g_context, 1, (const char **) & Kernel, NULL, &err);
HandleCLError(err, "Error: Failed to create compute program!"); if (!program)
return NULL; {
} HandleCLError(err, "Error: Failed to create compute program!");
return NULL;
}
// Build the program executable // Build the program executable
// //
err = clBuildProgram(program , 0, NULL, NULL, NULL, NULL); err = clBuildProgram(program , 0, NULL, NULL, NULL, NULL);
if(err != CL_SUCCESS) { if(err != CL_SUCCESS) {
char *errors[16384] = {0}; char *errors[16384] = {0};
err = clGetProgramBuildInfo(program, OpenCL::device_id, CL_PROGRAM_BUILD_LOG, sizeof(errors), err = clGetProgramBuildInfo(program, OpenCL::device_id, CL_PROGRAM_BUILD_LOG, sizeof(errors),
errors, NULL); errors, NULL);
PanicAlert("Error log:\n%s\n", errors); PanicAlert("Error log:\n%s\n", errors);
return NULL; return NULL;
} }
NOTICE_LOG(COMMON, "OpenCL CompileProgram took %.3f seconds", (float)(timeGetTime() - compileStart) / 1000.0);
return program; return program;
} }
cl_kernel CompileKernel(cl_program program, const char *Function) cl_kernel CompileKernel(cl_program program, const char *Function)
{ {
int err; u32 compileStart = timeGetTime();
// Create the compute kernel in the program we wish to run 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) cl_kernel kernel = clCreateKernel(program, Function, &err);
{ if (!kernel || err != CL_SUCCESS)
HandleCLError(err, "Failed to create compute kernel!"); {
return NULL; HandleCLError(err, "Failed to create compute kernel!");
} return NULL;
return kernel; }
NOTICE_LOG(COMMON, "OpenCL CompileKernel took %.3f seconds", (float)(timeGetTime() - compileStart) / 1000.0);
return kernel;
} }
#endif #endif
void Destroy() {
void Destroy()
{
#if defined(HAVE_OPENCL) && HAVE_OPENCL #if defined(HAVE_OPENCL) && HAVE_OPENCL
if(!g_context) if(!g_context)
return; return;
@ -130,9 +144,10 @@ void Destroy() {
#endif #endif
} }
#if defined(HAVE_OPENCL) && HAVE_OPENCL
void HandleCLError(cl_int error, char* str) void HandleCLError(cl_int error, char* str)
{ {
#if defined(HAVE_OPENCL) && HAVE_OPENCL
char* name; char* name;
switch(error) switch(error)
{ {
@ -191,7 +206,7 @@ void HandleCLError(cl_int error, char* str)
str = ""; str = "";
PanicAlert("OpenCL error: %s %s (%d)", str, name, error); PanicAlert("OpenCL error: %s %s (%d)", str, name, error);
}
#endif #endif
}
}; }

View File

@ -40,15 +40,18 @@ typedef void *cl_command_queue;
typedef void *cl_program; typedef void *cl_program;
typedef void *cl_kernel; typedef void *cl_kernel;
typedef void *cl_mem; typedef void *cl_mem;
typedef void *cl_int;
#endif #endif
namespace OpenCL { namespace OpenCL
#if defined(HAVE_OPENCL) && HAVE_OPENCL {
extern cl_device_id device_id;
extern cl_context g_context; #if defined(HAVE_OPENCL) && HAVE_OPENCL
extern cl_command_queue g_cmdq; extern cl_device_id device_id;
#endif extern cl_context g_context;
extern cl_command_queue g_cmdq;
#endif
bool Initialize(); bool Initialize();
@ -61,9 +64,7 @@ void Destroy();
cl_program CompileProgram(const char *Kernel); cl_program CompileProgram(const char *Kernel);
cl_kernel CompileKernel(cl_program program, const char *Function); cl_kernel CompileKernel(cl_program program, const char *Function);
#if defined(HAVE_OPENCL) && HAVE_OPENCL
void HandleCLError(cl_int error, char* str = 0); void HandleCLError(cl_int error, char* str = 0);
#endif }
};
#endif #endif