Commit 2a756f59 authored by Joseph Noir's avatar Joseph Noir

changed error handling

Error handeling for clGetProgramBuildInfo added.
parent 9699d22d
...@@ -29,16 +29,21 @@ ...@@ -29,16 +29,21 @@
\******************************************************************************/ \******************************************************************************/
#include <vector> #include <vector>
#include <string>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
#include "cppa/singletons.hpp"
#include "cppa/opencl/program.hpp" #include "cppa/opencl/program.hpp"
#include "cppa/opencl/command_dispatcher.hpp" #include "cppa/opencl/command_dispatcher.hpp"
using namespace std;
namespace cppa { namespace opencl { namespace cppa { namespace opencl {
program::program(context_ptr context, program_ptr program) program::program(context_ptr context, program_ptr program)
: m_context(std::move(context)), m_program(std::move(program)) { } : m_context(move(context)), m_program(move(program)) { }
program program::create(const char* kernel_source) { program program::create(const char* kernel_source) {
context_ptr cptr = get_command_dispatcher()->m_context; context_ptr cptr = get_command_dispatcher()->m_context;
...@@ -46,8 +51,8 @@ program program::create(const char* kernel_source) { ...@@ -46,8 +51,8 @@ program program::create(const char* kernel_source) {
cl_int err{0}; cl_int err{0};
// create program object from kernel source // create program object from kernel source
program_ptr pptr;
size_t kernel_source_length = strlen(kernel_source); size_t kernel_source_length = strlen(kernel_source);
program_ptr pptr;
pptr.adopt(clCreateProgramWithSource(cptr.get(), pptr.adopt(clCreateProgramWithSource(cptr.get(),
1, 1,
&kernel_source, &kernel_source,
...@@ -55,83 +60,75 @@ program program::create(const char* kernel_source) { ...@@ -55,83 +60,75 @@ program program::create(const char* kernel_source) {
&err)); &err));
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
throw std::runtime_error("clCreateProgramWithSource: " throw runtime_error("clCreateProgramWithSource: "
+ get_opencl_error(err)); + get_opencl_error(err));
} }
auto program_build_info = [&](device_ptr dev, size_t vs, void* v, size_t* vsr) {
return clGetProgramBuildInfo(pptr.get(),
dev.get(),
CL_PROGRAM_BUILD_LOG,
vs,
v,
vsr);
};
// build programm from program object // build programm from program object
err = clBuildProgram(pptr.get(), 0, nullptr, nullptr, nullptr, nullptr); err = clBuildProgram(pptr.get(), 0, nullptr, nullptr, nullptr, nullptr);
if (err != CL_SUCCESS) { if (err != CL_SUCCESS) {
cl_int bi_err{0}; device_ptr device{get_command_dispatcher()->m_devices.front().dev_id};
device_ptr device_used(cppa::detail::singleton_manager:: const char* where = "CL_PROGRAM_BUILD_LOG:get size";
get_command_dispatcher()-> size_t ret_size;
m_devices.front().dev_id); auto bi_err = program_build_info(device, 0, nullptr, &ret_size);
cl_build_status build_status; if (bi_err == CL_SUCCESS) {
bi_err = clGetProgramBuildInfo(pptr.get(), where = "CL_PROGRAM_BUILD_LOG:get log";
device_used.get(), vector<char> build_log(ret_size);
CL_PROGRAM_BUILD_STATUS, bi_err = program_build_info(device, ret_size, build_log.data(), nullptr);
sizeof(cl_build_status), if (bi_err == CL_SUCCESS) {
&build_status, ostringstream oss;
nullptr); if (ret_size <= 1) {
size_t ret_val_size; oss << "clBuildProgram: " << get_opencl_error(err)
bi_err = clGetProgramBuildInfo(pptr.get(), << " (no build log available)";
device_used.get(), }
CL_PROGRAM_BUILD_LOG, else {
0, oss << "clBuildProgram: " << get_opencl_error(err);
nullptr, build_log[ret_size - 1] = '\0';
&ret_val_size); cerr << build_log.data() << endl;
std::vector<char> build_log(ret_val_size); }
bi_err = clGetProgramBuildInfo(pptr.get(), CPPA_LOGM_ERROR(detail::demangle<program>().c_str(), oss.str());
device_used.get(), throw runtime_error(oss.str());
CL_PROGRAM_BUILD_LOG, }
ret_val_size,
build_log.data(),
nullptr);
std::ostringstream oss;
if (ret_val_size <= 1) {
oss << "clBuildProgram: " << get_opencl_error(err)
<< " (no build log available)";
} }
else { if (bi_err != CL_SUCCESS) {
oss << "clBuildProgram: " << get_opencl_error(err); CPPA_LOGM_ERROR(detail::demangle<program>().c_str(),
build_log[ret_val_size - 1] = '\0'; "clGetProgramBuildInfo (" << where << "): "
std::cerr << build_log.data() << std::endl; << get_opencl_error(bi_err));
} }
CPPA_LOGM_ERROR(detail::demangle<program>().c_str(), oss.str());
throw std::runtime_error(oss.str());
} }
else { else {
# ifdef CPPA_DEBUG_MODE # ifdef CPPA_DEBUG_MODE
device_ptr device_used(cppa::detail::singleton_manager:: device_ptr device{get_command_dispatcher()->m_devices.front().dev_id};
get_command_dispatcher()-> const char* where = "CL_PROGRAM_BUILD_LOG:get size";
m_devices.front().dev_id); size_t ret_size;
cl_build_status build_status; err = program_build_info(device, 0, nullptr, &ret_size);
err = clGetProgramBuildInfo(pptr.get(), if (err == CL_SUCCESS) {
device_used.get(), where = "CL_PROGRAM_BUILD_LOG:get log";
CL_PROGRAM_BUILD_STATUS, vector<char> build_log(ret_size+1);
sizeof(cl_build_status), err = program_build_info(device, ret_size, build_log.data(), nullptr);
&build_status, if (err == CL_SUCCESS) {
nullptr); if (ret_size > 1) {
size_t ret_val_size; CPPA_LOGM_ERROR(detail::demangle<program>().c_str(),
err = clGetProgramBuildInfo(pptr.get(), "clBuildProgram: error");
device_used.get(), build_log[ret_size - 1] = '\0';
CL_PROGRAM_BUILD_LOG, cerr << "clBuildProgram build log:\n"
0, << build_log.data() << endl;
nullptr, }
&ret_val_size); }
std::vector<char> build_log(ret_val_size+1); }
err = clGetProgramBuildInfo(pptr.get(), if (err != CL_SUCCESS) {
device_used.get(),
CL_PROGRAM_BUILD_LOG,
ret_val_size,
build_log.data(),
nullptr);
if (ret_val_size > 1) {
CPPA_LOGM_ERROR(detail::demangle<program>().c_str(), CPPA_LOGM_ERROR(detail::demangle<program>().c_str(),
"clBuildProgram: error"); "clGetProgramBuildInfo (" << where << "): "
build_log[ret_val_size - 1] = '\0'; << get_opencl_error(err));
std::cerr << "clBuildProgram build log:\n"
<< build_log.data() << std::endl;
} }
# endif # endif
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment