diff --git a/selfdrive/common/clutil.cc b/selfdrive/common/clutil.cc index 952fc6863f..313978525e 100644 --- a/selfdrive/common/clutil.cc +++ b/selfdrive/common/clutil.cc @@ -1,12 +1,8 @@ #include "selfdrive/common/clutil.h" -#include - #include -#include #include #include -#include #include "selfdrive/common/util.h" @@ -78,8 +74,10 @@ cl_device_id cl_get_device_id(cl_device_type device_type) { } cl_program cl_program_from_file(cl_context ctx, cl_device_id device_id, const char* path, const char* args) { - std::string src = util::read_file(path); - assert(src.length() > 0); + return cl_program_from_source(ctx, device_id, util::read_file(path), args); +} + +cl_program cl_program_from_source(cl_context ctx, cl_device_id device_id, const std::string& src, const char* args) { cl_program prg = CL_CHECK_ERR(clCreateProgramWithSource(ctx, 1, (const char*[]){src.c_str()}, NULL, &err)); if (int err = clBuildProgram(prg, 1, &device_id, args, NULL, NULL); err != 0) { cl_print_build_errors(prg, device_id); @@ -88,6 +86,15 @@ cl_program cl_program_from_file(cl_context ctx, cl_device_id device_id, const ch return prg; } +cl_program cl_program_from_binary(cl_context ctx, cl_device_id device_id, const uint8_t* binary, size_t length, const char* args) { + cl_program prg = CL_CHECK_ERR(clCreateProgramWithBinary(ctx, 1, &device_id, &length, (const uint8_t*[]){binary}, NULL, &err)); + if (int err = clBuildProgram(prg, 1, &device_id, args, NULL, NULL); err != 0) { + cl_print_build_errors(prg, device_id); + assert(0); + } + return prg; +} + // Given a cl code and return a string representation #define CL_ERR_TO_STR(err) case err: return #err const char* cl_get_error_string(int err) { diff --git a/selfdrive/common/clutil.h b/selfdrive/common/clutil.h index ffddafadbb..be1a07c332 100644 --- a/selfdrive/common/clutil.h +++ b/selfdrive/common/clutil.h @@ -1,14 +1,13 @@ #pragma once -#include -#include - #ifdef __APPLE__ #include #else #include #endif +#include + #define CL_CHECK(_expr) \ do { \ assert(CL_SUCCESS == (_expr)); \ @@ -23,5 +22,7 @@ }) cl_device_id cl_get_device_id(cl_device_type device_type); +cl_program cl_program_from_source(cl_context ctx, cl_device_id device_id, const std::string& src, const char* args = nullptr); +cl_program cl_program_from_binary(cl_context ctx, cl_device_id device_id, const uint8_t* binary, size_t length, const char* args = nullptr); cl_program cl_program_from_file(cl_context ctx, cl_device_id device_id, const char* path, const char* args); const char* cl_get_error_string(int err); diff --git a/selfdrive/modeld/thneed/serialize.cc b/selfdrive/modeld/thneed/serialize.cc index 46452480e8..cd5584553b 100644 --- a/selfdrive/modeld/thneed/serialize.cc +++ b/selfdrive/modeld/thneed/serialize.cc @@ -3,6 +3,7 @@ #include "json11.hpp" #include "selfdrive/common/util.h" +#include "selfdrive/common/clutil.h" #include "selfdrive/modeld/thneed/thneed.h" using namespace json11; @@ -61,44 +62,17 @@ void Thneed::load(const char *filename) { } map g_programs; - for (auto &obj : jdat["programs"].object_items()) { - const char *srcs[1]; - srcs[0] = (const char *)obj.second.string_value().c_str(); - size_t length = obj.second.string_value().size(); - - if (record & THNEED_DEBUG) printf("building %s with size %zu\n", obj.first.c_str(), length); - - cl_program program = clCreateProgramWithSource(context, 1, srcs, &length, NULL); - int err_ = clBuildProgram(program, 1, &device_id, "", NULL, NULL); - if (err_ != 0) { - printf("got err %d\n", err_); - size_t length_; - char buffer[2048]; - clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &length_); - buffer[length_] = '\0'; - printf("%s\n", buffer); - } - assert(err_ == 0); - - g_programs[obj.first] = program; + for (const auto &[name, source] : jdat["programs"].object_items()) { + if (record & THNEED_DEBUG) printf("building %s with size %zu\n", name.c_str(), source.string_value().size()); + g_programs[name] = cl_program_from_source(context, device_id, source.string_value()); } for (auto &obj : jdat["binaries"].array_items()) { string name = obj["name"].string_value(); size_t length = obj["length"].int_value(); - const unsigned char *srcs[1]; - srcs[0] = (const unsigned char *)&buf[ptr]; - ptr += length; - if (record & THNEED_DEBUG) printf("binary %s with size %zu\n", name.c_str(), length); - - cl_int err_; - cl_program program = clCreateProgramWithBinary(context, 1, &device_id, &length, srcs, NULL, &err_); - assert(program != NULL && err_ == CL_SUCCESS); - err_ = clBuildProgram(program, 1, &device_id, "", NULL, NULL); - assert(err_ == CL_SUCCESS); - - g_programs[name] = program; + g_programs[name] = cl_program_from_binary(context, device_id, (const uint8_t*)&buf[ptr], length); + ptr += length; } for (auto &obj : jdat["kernels"].array_items()) {