/*
Copyright 2011 Peter Thoman, Klaus Kofler and contributors.
(for a full list check the AUTHORS file)
This file is part of uCLbench.
uCLbench is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
uCLbench is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with uCLbench. If not, see .
*/
#ifndef OCLUTILS_H_
#define OCLUTILS_H_
#include
#include
#include
#define shrTRUE 1
#define shrCheckError(__a, __b) { if((__a)!=(__b)) {\
printf("shrCheckError(" #__a ", " #__b ") failed!\n - line %d in file " __FILE__ "\n - " #__a ": %s\n", __LINE__, oclErrorString(__a)); } }
//////////////////////////////////////////////////////////////////////////////
//! Loads a Program file and prepends the cPreamble to the code.
//!
//! @return the source string if succeeded, 0 otherwise
//! @param cFilename program filename
//! @param cPreamble code that is prepended to the loaded file, typically a set of #defines or a header
//! @param szFinalLength returned length of the code string
//////////////////////////////////////////////////////////////////////////////
char* oclLoadProgSource(const char* cFilename, const char* cPreamble, size_t* szFinalLength)
{
// locals
FILE* pFileStream = NULL;
size_t szSourceLength;
// open the OpenCL source code file
pFileStream = fopen(cFilename, "rb");
if(pFileStream == 0) return NULL;
size_t szPreambleLength = strlen(cPreamble);
// get the length of the source code
fseek(pFileStream, 0, SEEK_END);
szSourceLength = ftell(pFileStream);
fseek(pFileStream, 0, SEEK_SET);
// allocate a buffer for the source code string and read it in
char* cSourceString = (char *)malloc(szSourceLength + szPreambleLength + 1);
memcpy(cSourceString, cPreamble, szPreambleLength);
if(fread((cSourceString) + szPreambleLength, szSourceLength, 1, pFileStream) != 1) {
fclose(pFileStream);
free(cSourceString);
return 0;
}
// close the file and return the total length of the combined (preamble + source) string
fclose(pFileStream);
if(szFinalLength != 0) {
*szFinalLength = szSourceLength + szPreambleLength;
}
cSourceString[szSourceLength + szPreambleLength] = '\0';
return cSourceString;
}
const char* oclErrorString(cl_int error)
{
static const char* errorString[] = {
"CL_SUCCESS",
"CL_DEVICE_NOT_FOUND",
"CL_DEVICE_NOT_AVAILABLE",
"CL_COMPILER_NOT_AVAILABLE",
"CL_MEM_OBJECT_ALLOCATION_FAILURE",
"CL_OUT_OF_RESOURCES",
"CL_OUT_OF_HOST_MEMORY",
"CL_PROFILING_INFO_NOT_AVAILABLE",
"CL_MEM_COPY_OVERLAP",
"CL_IMAGE_FORMAT_MISMATCH",
"CL_IMAGE_FORMAT_NOT_SUPPORTED",
"CL_BUILD_PROGRAM_FAILURE",
"CL_MAP_FAILURE",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"CL_INVALID_VALUE",
"CL_INVALID_DEVICE_TYPE",
"CL_INVALID_PLATFORM",
"CL_INVALID_DEVICE",
"CL_INVALID_CONTEXT",
"CL_INVALID_QUEUE_PROPERTIES",
"CL_INVALID_COMMAND_QUEUE",
"CL_INVALID_HOST_PTR",
"CL_INVALID_MEM_OBJECT",
"CL_INVALID_IMAGE_FORMAT_DESCRIPTOR",
"CL_INVALID_IMAGE_SIZE",
"CL_INVALID_SAMPLER",
"CL_INVALID_BINARY",
"CL_INVALID_BUILD_OPTIONS",
"CL_INVALID_PROGRAM",
"CL_INVALID_PROGRAM_EXECUTABLE",
"CL_INVALID_KERNEL_NAME",
"CL_INVALID_KERNEL_DEFINITION",
"CL_INVALID_KERNEL",
"CL_INVALID_ARG_INDEX",
"CL_INVALID_ARG_VALUE",
"CL_INVALID_ARG_SIZE",
"CL_INVALID_KERNEL_ARGS",
"CL_INVALID_WORK_DIMENSION",
"CL_INVALID_WORK_GROUP_SIZE",
"CL_INVALID_WORK_ITEM_SIZE",
"CL_INVALID_GLOBAL_OFFSET",
"CL_INVALID_EVENT_WAIT_LIST",
"CL_INVALID_EVENT",
"CL_INVALID_OPERATION",
"CL_INVALID_GL_OBJECT",
"CL_INVALID_BUFFER_SIZE",
"CL_INVALID_MIP_LEVEL",
"CL_INVALID_GLOBAL_WORK_SIZE",
};
const int errorCount = sizeof(errorString) / sizeof(errorString[0]);
const int index = -error;
return (index >= 0 && index < errorCount) ? errorString[index] : "";
}
/*
const char* oclErrorString(int err) {
switch(err) {
case CL_SUCCESS: break;
case CL_DEVICE_NOT_FOUND: return "DEVICE NOT FOUND";
case CL_DEVICE_NOT_AVAILABLE: return "DEVICE NOT AVAILABLE";
case CL_COMPILER_NOT_AVAILABLE: return "COMPILER NOT AVAILABLE";
case CL_MEM_OBJECT_ALLOCATION_FAILURE: return "MEM OBJECT ALLOCATION FAILURE";
case CL_OUT_OF_RESOURCES: return "OUT OF RESOURCES";
case CL_OUT_OF_HOST_MEMORY: return "OUT OF HOST MEMORY";
case CL_PROFILING_INFO_NOT_AVAILABLE: return "PROFILING INFO NOT AVAILABLE";
case CL_MEM_COPY_OVERLAP: return "MEM COPY OVERLAP";
case CL_IMAGE_FORMAT_MISMATCH: return "IMAGE FORMAT MISMATCH";
case CL_IMAGE_FORMAT_NOT_SUPPORTED: return "IMAGE FORMAT NOT SUPPORTED";
case CL_BUILD_PROGRAM_FAILURE: return "BUILD PROGRAM FAILURE";
case CL_MAP_FAILURE: return "MAP FAILURE";
case CL_INVALID_DEVICE_TYPE: return "INVALID DEVICE TYPE";
case CL_INVALID_PLATFORM: return "INVALID PLATFORM";
case CL_INVALID_DEVICE: return "INVALID DEVICE";
case CL_INVALID_CONTEXT: return "INVALID CONTEXT";
case CL_INVALID_HOST_PTR: return "INVALID HOST PTR";
case CL_INVALID_MEM_OBJECT: return "INVALID MEM OBJECT";
case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return "INVALID IMAGE FORMAT DESCRIPTOR";
case CL_INVALID_IMAGE_SIZE: return "INVALID IMAGE SIZE";
case CL_INVALID_SAMPLER: return "INVALID SAMPLER";
case CL_INVALID_BINARY: return "INVALID BINARY";
case CL_INVALID_BUILD_OPTIONS: return "INVALID BUILD OPTIONS";
case CL_INVALID_PROGRAM: return "INVALID PROGRAM";
case CL_INVALID_PROGRAM_EXECUTABLE: return "INVALID PROGRAM EXECUTABLE";
case CL_INVALID_KERNEL_NAME: return "INVALID KERNEL NAME";
case CL_INVALID_KERNEL_DEFINITION: return "INVALID KERNEL DEFINITION";
case CL_INVALID_KERNEL: return "INVALID KERNEL";
case CL_INVALID_ARG_INDEX: return "INVALID ARG INDEX";
case CL_INVALID_ARG_VALUE: return "INVALID ARG VALUE";
case CL_INVALID_ARG_SIZE: return "INVALID ARG SIZE";
case CL_INVALID_KERNEL_ARGS: return "INVALID KERNEL ARGS";
case CL_INVALID_WORK_DIMENSION: return "INVALID WORK DIMENSION";
case CL_INVALID_WORK_GROUP_SIZE: return "INVALID WORK GROUP SIZE";
case CL_INVALID_GLOBAL_OFFSET: return "INVALID GLOBAL OFFSET";
case CL_INVALID_EVENT_WAIT_LIST: return "INVALID EVENT WAIT LIST";
case CL_INVALID_EVENT: return "INVALID EVENT";
case CL_INVALID_OPERATION: return "INVALID OPERATION";
case CL_INVALID_GL_OBJECT: return "INVALID GL OBJECT";
case CL_INVALID_BUFFER_SIZE: return "INVALID BUFFER SIZE";
case CL_INVALID_MIP_LEVEL: return "INVALID MIP LEVEL";
case CL_INVALID_VALUE: return "INVALID_VALUE";
case CL_INVALID_QUEUE_PROPERTIES: return "INVALID_QUEUE_PROPERTIES";
case CL_INVALID_COMMAND_QUEUE: return "INVALID_COMMAND_QUEUE";
default: return "Unexpected error has occured";
}
}
*/
#endif // OCLUTILS_H_