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

changed error handling

Error handeling for clGetProgramBuildInfo added.
parent 9699d22d
......@@ -29,16 +29,21 @@
\******************************************************************************/
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include "cppa/singletons.hpp"
#include "cppa/opencl/program.hpp"
#include "cppa/opencl/command_dispatcher.hpp"
using namespace std;
namespace cppa { namespace opencl {
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) {
context_ptr cptr = get_command_dispatcher()->m_context;
......@@ -46,8 +51,8 @@ program program::create(const char* kernel_source) {
cl_int err{0};
// create program object from kernel source
program_ptr pptr;
size_t kernel_source_length = strlen(kernel_source);
program_ptr pptr;
pptr.adopt(clCreateProgramWithSource(cptr.get(),
1,
&kernel_source,
......@@ -55,83 +60,75 @@ program program::create(const char* kernel_source) {
&err));
if (err != CL_SUCCESS) {
throw std::runtime_error("clCreateProgramWithSource: "
throw runtime_error("clCreateProgramWithSource: "
+ 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
err = clBuildProgram(pptr.get(), 0, nullptr, nullptr, nullptr, nullptr);
if (err != CL_SUCCESS) {
cl_int bi_err{0};
device_ptr device_used(cppa::detail::singleton_manager::
get_command_dispatcher()->
m_devices.front().dev_id);
cl_build_status build_status;
bi_err = clGetProgramBuildInfo(pptr.get(),
device_used.get(),
CL_PROGRAM_BUILD_STATUS,
sizeof(cl_build_status),
&build_status,
nullptr);
size_t ret_val_size;
bi_err = clGetProgramBuildInfo(pptr.get(),
device_used.get(),
CL_PROGRAM_BUILD_LOG,
0,
nullptr,
&ret_val_size);
std::vector<char> build_log(ret_val_size);
bi_err = clGetProgramBuildInfo(pptr.get(),
device_used.get(),
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)";
device_ptr device{get_command_dispatcher()->m_devices.front().dev_id};
const char* where = "CL_PROGRAM_BUILD_LOG:get size";
size_t ret_size;
auto bi_err = program_build_info(device, 0, nullptr, &ret_size);
if (bi_err == CL_SUCCESS) {
where = "CL_PROGRAM_BUILD_LOG:get log";
vector<char> build_log(ret_size);
bi_err = program_build_info(device, ret_size, build_log.data(), nullptr);
if (bi_err == CL_SUCCESS) {
ostringstream oss;
if (ret_size <= 1) {
oss << "clBuildProgram: " << get_opencl_error(err)
<< " (no build log available)";
}
else {
oss << "clBuildProgram: " << get_opencl_error(err);
build_log[ret_size - 1] = '\0';
cerr << build_log.data() << endl;
}
CPPA_LOGM_ERROR(detail::demangle<program>().c_str(), oss.str());
throw runtime_error(oss.str());
}
}
else {
oss << "clBuildProgram: " << get_opencl_error(err);
build_log[ret_val_size - 1] = '\0';
std::cerr << build_log.data() << std::endl;
if (bi_err != CL_SUCCESS) {
CPPA_LOGM_ERROR(detail::demangle<program>().c_str(),
"clGetProgramBuildInfo (" << where << "): "
<< get_opencl_error(bi_err));
}
CPPA_LOGM_ERROR(detail::demangle<program>().c_str(), oss.str());
throw std::runtime_error(oss.str());
}
else {
# ifdef CPPA_DEBUG_MODE
device_ptr device_used(cppa::detail::singleton_manager::
get_command_dispatcher()->
m_devices.front().dev_id);
cl_build_status build_status;
err = clGetProgramBuildInfo(pptr.get(),
device_used.get(),
CL_PROGRAM_BUILD_STATUS,
sizeof(cl_build_status),
&build_status,
nullptr);
size_t ret_val_size;
err = clGetProgramBuildInfo(pptr.get(),
device_used.get(),
CL_PROGRAM_BUILD_LOG,
0,
nullptr,
&ret_val_size);
std::vector<char> build_log(ret_val_size+1);
err = clGetProgramBuildInfo(pptr.get(),
device_used.get(),
CL_PROGRAM_BUILD_LOG,
ret_val_size,
build_log.data(),
nullptr);
if (ret_val_size > 1) {
device_ptr device{get_command_dispatcher()->m_devices.front().dev_id};
const char* where = "CL_PROGRAM_BUILD_LOG:get size";
size_t ret_size;
err = program_build_info(device, 0, nullptr, &ret_size);
if (err == CL_SUCCESS) {
where = "CL_PROGRAM_BUILD_LOG:get log";
vector<char> build_log(ret_size+1);
err = program_build_info(device, ret_size, build_log.data(), nullptr);
if (err == CL_SUCCESS) {
if (ret_size > 1) {
CPPA_LOGM_ERROR(detail::demangle<program>().c_str(),
"clBuildProgram: error");
build_log[ret_size - 1] = '\0';
cerr << "clBuildProgram build log:\n"
<< build_log.data() << endl;
}
}
}
if (err != CL_SUCCESS) {
CPPA_LOGM_ERROR(detail::demangle<program>().c_str(),
"clBuildProgram: error");
build_log[ret_val_size - 1] = '\0';
std::cerr << "clBuildProgram build log:\n"
<< build_log.data() << std::endl;
"clGetProgramBuildInfo (" << where << "): "
<< get_opencl_error(err));
}
# 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