#pragma once
#if !defined( OPENCL_MISC_H )
#define OPENCL_MISC_H
#include <memory>
#include <stdexcept>
#include "unicode.compatibility.h"
#if defined( _MSC_VER )
#define countOf _countof
#else
#define countOf( arr ) ( sizeof( arr ) / sizeof( arr[ 0 ] ) )
#endif
int discoverCLPlatforms( cl_device_type deviceType,
std::vector< cl_platform_id >& platforms,
std::vector< std::vector< cl_device_id > >& devices );
void prettyPrintCLPlatforms(std::vector< cl_platform_id >& platforms,
std::vector< std::vector< cl_device_id > >& devices);
std::vector< cl_device_id > initializeCL( cl_device_type deviceType,
cl_int deviceId,
cl_int platformId,
cl_context& context,
bool printclInfo );
int createOpenCLMemoryBuffer(
cl_context& context,
const size_t bufferSizeBytes,
const cl_uint numBuffers,
cl_mem buffer[],
cl_mem_flags accessibility
);
void createOpenCLCommandQueue( cl_context& context,
cl_uint commandQueueFlags,
cl_command_queue& commandQueue,
std::vector< cl_device_id > devices,
const size_t bufferSizeBytesIn,
const cl_uint numBuffersIn,
cl_mem clMemBufferIn[],
const size_t bufferSizeBytesOut,
const cl_uint numBuffersOut,
cl_mem clMemBufferOut[] );
int releaseOpenCLMemBuffer( const cl_uint numBuffers, cl_mem buffer[] );
std::string prettyPrintclFFTStatus( const cl_int& status );
inline cl_int OpenCL_V_Throw ( cl_int res, const std::string& msg, size_t lineno )
{
switch( res )
{
case CL_SUCCESS:
break;
default:
{
std::stringstream tmp;
tmp << "OPENCL_V_THROWERROR< ";
tmp << prettyPrintclFFTStatus( res );
tmp << " > (";
tmp << lineno;
tmp << "): ";
tmp << msg;
std::string errorm (tmp.str());
std::cout << errorm<< std::endl;
throw std::runtime_error( errorm );
}
}
return res;
}
#define OPENCL_V_THROW(_status,_message) OpenCL_V_Throw (_status, _message, __LINE__)
inline cl_int OpenCL_V_Warn(cl_int res, const std::string& msg, size_t lineno)
{
switch (res)
{
case CL_SUCCESS:
break;
case CL_DEVICE_NOT_FOUND:
break;
default:
{
std::stringstream tmp;
tmp << "OPENCL_V_WARN< ";
tmp << prettyPrintclFFTStatus(res);
tmp << " > (";
tmp << lineno;
tmp << "): ";
tmp << msg;
std::string errorm(tmp.str());
std::cout << errorm << std::endl;
}
}
return res;
}
#define OPENCL_V_WARN(_status,_message) OpenCL_V_Warn (_status, _message, __LINE__);
int cleanupCL( cl_context* context, cl_command_queue* commandQueue, const cl_uint numBuffersIn, cl_mem inputBuffer[], const cl_uint numBuffersOut, cl_mem outputBuffer[]);
#endif