[Beignet] [PATCH V2] separate runtime(libcl.so) and compiler(libgbe.so)

Zhigang Gong zhigang.gong at linux.intel.com
Tue May 27 18:10:23 PDT 2014


I just tested this patch on my machine, it works fine.
Pushed to the master branch. Thanks.

On Tue, May 27, 2014 at 07:10:04AM +0800, Guo Yejun wrote:
> On embedded/handheld devices, storage and memory are scarce, it is
> necessary to provide only the OpenCL runtime library with small size,
> and only the executable binary kernel will be supported on such device.
> 
> At the beginning of process (before function main), OpenCL runtime
> (libcl.so) will try to load the compiler (libgbe.so), the system's
> behavior is the same as before if successfully loaded, otherwise,
> the runtime assumes no OpenCL compiler in the system, and the device
> info will be changed as CL_DEVICE_COMPILER_AVAILABLE=false and
> CL_DEVICE_PROFILE="EMBEDDED_PROFILE", the clBuildProgram returns
> CL_COMPILER_NOT_AVAILABLE if the program is created with
> clCreateProgramWithSource, following the OpenCL spec.
> 
> To simulate the case without OpenCL compiler, just delete the file
> libgbe.so, or export OCL_NON_COMPILER=1.
> 
> Some explanation of the binary kernel interpreter (libinterp.a):
> 
> libinterp.a is used to interpret the binary kernel inside runtime,
> and the runtime library libcl.so is built against libinterp.a.
> 
> Since the code to interpret binary kernel is tightly integrated inside
> the compiler, to avoid code duplicate, a new file gbe_bin_interpreter.cpp
> is created to include some other .cpp files; to make libinterp.a small
> (the purpose to make libcl.so small), the macro GBE_COMPILER_AVAILABLE
> is used to make only the needed code active when build for libinterp.a.
> 
> V2: code base is changed to call function gbe_set_image_base_index in
> gbe_bin_generater, while this function is modified in this patch as
> gbe_set_image_base_index_compiler, fix it accordingly.
> 
> Signed-off-by: Guo Yejun <yejun.guo at intel.com>
> ---
>  backend/CMakeLists.txt              |  3 ++
>  backend/src/CMakeLists.txt          |  8 +++-
>  backend/src/GBEConfig.h.in          |  1 +
>  backend/src/backend/gen_program.cpp |  9 +++-
>  backend/src/backend/program.cpp     | 12 ++++--
>  backend/src/backend/program.h       |  3 +-
>  backend/src/backend/program.hpp     |  2 +
>  backend/src/gbe_bin_generater.cpp   |  2 +-
>  backend/src/gbe_bin_interpreter.cpp | 71 ++++++++++++++++++++++++++++++++
>  backend/src/ir/image.cpp            | 61 +++++++++++++--------------
>  backend/src/ir/sampler.cpp          |  2 +
>  backend/src/ocl_common_defines.h    |  5 ++-
>  src/CMakeLists.txt                  |  5 ++-
>  src/cl_device_id.c                  | 10 +++++
>  src/cl_gbe_loader.cpp               | 82 +++++++++++++++++++++++++++++++++++++
>  src/cl_gbe_loader.h                 | 32 +++++++++++++++
>  src/cl_kernel.h                     |  2 +-
>  src/cl_program.c                    |  6 +++
>  src/cl_program.h                    |  2 +-
>  src/intel/intel_driver.c            |  7 +++-
>  utests/setenv.sh.in                 |  1 +
>  21 files changed, 282 insertions(+), 44 deletions(-)
>  create mode 100644 backend/src/gbe_bin_interpreter.cpp
>  create mode 100644 src/cl_gbe_loader.cpp
>  create mode 100644 src/cl_gbe_loader.h
> 
> diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt
> index dd55a4a..a20f423 100644
> --- a/backend/CMakeLists.txt
> +++ b/backend/CMakeLists.txt
> @@ -36,6 +36,8 @@ endif (GBE_DEBUG_MEMORY)
>  # Hide all symbols and allows the symbols declared as visible to be exported
>  set (CMAKE_C_CXX_FLAGS "-fvisibility=hidden ${CMAKE_C_CXX_FLAGS}")
>  
> +set (CMAKE_C_CXX_FLAGS -DGBE_COMPILER_AVAILABLE=1)
> +
>  if (COMPILER STREQUAL "GCC")
>    set (CMAKE_C_CXX_FLAGS "${CMAKE_C_CXX_FLAGS} -funroll-loops -Wstrict-aliasing=2 -fstrict-aliasing -msse2 -msse3 -mssse3 -msse4.1 -fPIC -Wall")
>    set (CMAKE_C_CXX_FLAGS "${CMAKE_C_CXX_FLAGS}  ${LLVM_CFLAGS}")
> @@ -99,6 +101,7 @@ include_directories (${CMAKE_CURRENT_BINARY_DIR})
>  add_subdirectory (src)
>  set(LOCAL_PCH_OBJECT_DIR ${LOCAL_PCH_OBJECT_DIR} PARENT_SCOPE)
>  set(LOCAL_PCM_OBJECT_DIR ${LOCAL_PCM_OBJECT_DIR} PARENT_SCOPE)
> +set(LOCAL_GBE_OBJECT_DIR ${LOCAL_GBE_OBJECT_DIR} PARENT_SCOPE)
>  set (GBE_BIN_GENERATER
>       OCL_PCM_PATH=${LOCAL_PCM_OBJECT_DIR} OCL_PCH_PATH=${LOCAL_PCH_OBJECT_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src/gbe_bin_generater
>       PARENT_SCOPE)
> diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt
> index 1dfbcf6..528595f 100644
> --- a/backend/src/CMakeLists.txt
> +++ b/backend/src/CMakeLists.txt
> @@ -177,7 +177,7 @@ endif (GBE_USE_BLOB)
>  include_directories (.)
>  link_directories (${LLVM_LIBRARY_DIRS})
>  include_directories(${LLVM_INCLUDE_DIRS})
> -add_library (gbe STATIC ${GBE_SRC})
> +add_library (gbe SHARED ${GBE_SRC})
>  
>  # for pre compiled module library.
>  set (pcm_lib "beignet.bc")
> @@ -195,6 +195,8 @@ target_link_libraries(
>                        ${CMAKE_THREAD_LIBS_INIT}
>                        ${CMAKE_DL_LIBS})
>  
> +add_library(interp STATIC gbe_bin_interpreter.cpp)
> +
>  if (LLVM_VERSION_NODOT VERSION_EQUAL 34)
>    find_library(TERMINFO NAMES tinfo ncurses)
>    if (${TERMINFO} STREQUAL TERMINFO-NOTFOUND)
> @@ -209,7 +211,7 @@ link_directories (${LLVM_LIBRARY_DIR})
>  ADD_EXECUTABLE(gbe_bin_generater gbe_bin_generater.cpp)
>  TARGET_LINK_LIBRARIES(gbe_bin_generater gbe)
>  
> -#install (TARGETS gbe LIBRARY DESTINATION lib)
> +install (TARGETS gbe LIBRARY DESTINATION ${LIB_INSTALL_DIR}/beignet)
>  #install (FILES backend/program.h DESTINATION include/gen)
>  install (FILES ${ocl_blob_file} DESTINATION ${LIB_INSTALL_DIR}/beignet)
>  install (FILES ${pch_object} DESTINATION ${LIB_INSTALL_DIR}/beignet)
> @@ -218,9 +220,11 @@ install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${pcm_lib} DESTINATION ${LIB_INSTALL_
>  # file to libcl and utests.
>  set (LOCAL_PCH_OBJECT_DIR "${local_pch_object}:${beignet_install_path}/ocl_stdlib.h.pch" PARENT_SCOPE)
>  set (LOCAL_PCM_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${pcm_lib}:${beignet_install_path}/${pcm_lib}" PARENT_SCOPE)
> +set (LOCAL_GBE_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libgbe.so" PARENT_SCOPE)
>  
>  set (PCH_OBJECT_DIR "${beignet_install_path}/ocl_stdlib.h.pch")
>  set (PCM_OBJECT_DIR "${beignet_install_path}/${pcm_lib}")
> +set (GBE_OBJECT_DIR "${beignet_install_path}/libgbe.so")
>  configure_file (
>    "GBEConfig.h.in"
>    "GBEConfig.h"
> diff --git a/backend/src/GBEConfig.h.in b/backend/src/GBEConfig.h.in
> index 5bc09b8..ad24390 100644
> --- a/backend/src/GBEConfig.h.in
> +++ b/backend/src/GBEConfig.h.in
> @@ -3,3 +3,4 @@
>  #define LIBGBE_VERSION_MINOR @LIBGBE_VERSION_MINOR@
>  #define PCH_OBJECT_DIR "@PCH_OBJECT_DIR@"
>  #define PCM_OBJECT_DIR "@PCM_OBJECT_DIR@"
> +#define GBE_OBJECT_DIR "@GBE_OBJECT_DIR@"
> diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp
> index 52db904..d2e95d4 100644
> --- a/backend/src/backend/gen_program.cpp
> +++ b/backend/src/backend/gen_program.cpp
> @@ -53,6 +53,7 @@ namespace gbe {
>    size_t GenKernel::getCodeSize(void) const { return insnNum * sizeof(GenInstruction); }
>  
>    void GenKernel::printStatus(int indent, std::ostream& outs) {
> +#ifdef GBE_COMPILER_AVAILABLE
>      Kernel::printStatus(indent, outs);
>  
>      FILE *f = fopen("/dev/null", "w");
> @@ -70,6 +71,7 @@ namespace gbe {
>      setbuffer(f, NULL, 0);
>      delete [] buf;
>      fclose(f);
> +#endif
>    }
>  
>    GenProgram::~GenProgram(void) {}
> @@ -88,7 +90,7 @@ namespace gbe {
>    };
>  
>    Kernel *GenProgram::compileKernel(const ir::Unit &unit, const std::string &name, bool relaxMath) {
> -
> +#ifdef GBE_COMPILER_AVAILABLE
>      // Be careful when the simdWidth is forced by the programmer. We can see it
>      // when the function already provides the simd width we need to use (i.e.
>      // non zero)
> @@ -139,6 +141,9 @@ namespace gbe {
>  
>      GBE_ASSERTM(kernel != NULL, "Fail to compile kernel, may need to increase reserved registers for spilling.");
>      return kernel;
> +#else
> +    return NULL;
> +#endif
>    }
>  
>    static gbe_program genProgramNewFromBinary(uint32_t deviceID, const char *binary, size_t size) {
> @@ -184,6 +189,7 @@ namespace gbe {
>    {
>      using namespace gbe;
>      GenProgram *program = GBE_NEW(GenProgram, deviceID);
> +#ifdef GBE_COMPILER_AVAILABLE
>      std::string error;
>      // Try to compile the program
>      if (program->buildFromLLVMFile(fileName, error, optLevel) == false) {
> @@ -195,6 +201,7 @@ namespace gbe {
>        GBE_DELETE(program);
>        return NULL;
>      }
> +#endif
>      // Everything run fine
>      return (gbe_program) program;
>    }
> diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
> index bdc7d34..121e237 100644
> --- a/backend/src/backend/program.cpp
> +++ b/backend/src/backend/program.cpp
> @@ -100,6 +100,7 @@ namespace gbe {
>      if (constantSet) delete constantSet;
>    }
>  
> +#ifdef GBE_COMPILER_AVAILABLE
>    BVAR(OCL_OUTPUT_GEN_IR, false);
>  
>    bool Program::buildFromLLVMFile(const char *fileName, std::string &error, int optLevel) {
> @@ -139,6 +140,7 @@ namespace gbe {
>      }
>      return true;
>    }
> +#endif
>  
>  #define OUT_UPDATE_SZ(elt) SERIALIZE_OUT(elt, outs, ret_size)
>  #define IN_UPDATE_SZ(elt) DESERIALIZE_IN(elt, ins, total_size)
> @@ -511,6 +513,7 @@ namespace gbe {
>      GBE_SAFE_DELETE(program);
>    }
>  
> +#ifdef GBE_COMPILER_AVAILABLE
>    BVAR(OCL_OUTPUT_BUILD_LOG, false);
>    SVAR(OCL_PCH_PATH, PCH_OBJECT_DIR);
>    SVAR(OCL_PCM_PATH, PCM_OBJECT_DIR);
> @@ -847,6 +850,7 @@ namespace gbe {
>      remove(clName.c_str());
>      return p;
>    }
> +#endif
>  
>    static size_t programGetGlobalConstantSize(gbe_program gbeProgram) {
>      if (gbeProgram == NULL) return 0;
> @@ -1042,9 +1046,11 @@ GBE_EXPORT_SYMBOL gbe_kernel_get_sampler_data_cb *gbe_kernel_get_sampler_data =
>  GBE_EXPORT_SYMBOL gbe_kernel_get_compile_wg_size_cb *gbe_kernel_get_compile_wg_size = NULL;
>  GBE_EXPORT_SYMBOL gbe_kernel_get_image_size_cb *gbe_kernel_get_image_size = NULL;
>  GBE_EXPORT_SYMBOL gbe_kernel_get_image_data_cb *gbe_kernel_get_image_data = NULL;
> -GBE_EXPORT_SYMBOL gbe_set_image_base_index_cb *gbe_set_image_base_index = NULL;
> +GBE_EXPORT_SYMBOL gbe_set_image_base_index_cb *gbe_set_image_base_index_compiler = NULL;
> +GBE_EXPORT_SYMBOL gbe_set_image_base_index_cb *gbe_set_image_base_index_interp = NULL;
>  GBE_EXPORT_SYMBOL gbe_get_image_base_index_cb *gbe_get_image_base_index = NULL;
>  
> +#ifdef GBE_COMPILER_AVAILABLE
>  namespace gbe
>  {
>    /* Use pre-main to setup the call backs */
> @@ -1080,7 +1086,7 @@ namespace gbe
>        gbe_kernel_get_image_size = gbe::kernelGetImageSize;
>        gbe_kernel_get_image_data = gbe::kernelGetImageData;
>        gbe_get_image_base_index = gbe::getImageBaseIndex;
> -      gbe_set_image_base_index = gbe::setImageBaseIndex;
> +      gbe_set_image_base_index_compiler = gbe::setImageBaseIndex;
>        genSetupCallBacks();
>        llvm::llvm_start_multithreaded();
>      }
> @@ -1095,4 +1101,4 @@ namespace gbe
>  
>    static CallBackInitializer cbInitializer;
>  } /* namespace gbe */
> -
> +#endif
> diff --git a/backend/src/backend/program.h b/backend/src/backend/program.h
> index 8727966..e23f4db 100644
> --- a/backend/src/backend/program.h
> +++ b/backend/src/backend/program.h
> @@ -99,7 +99,8 @@ typedef struct ImageInfo {
>  } ImageInfo;
>  
>  typedef void (gbe_set_image_base_index_cb)(uint32_t base_idx);
> -extern gbe_set_image_base_index_cb *gbe_set_image_base_index;
> +extern gbe_set_image_base_index_cb *gbe_set_image_base_index_compiler;
> +extern gbe_set_image_base_index_cb *gbe_set_image_base_index_interp;
>  
>  typedef uint32_t (gbe_get_image_base_index_cb)();
>  extern gbe_get_image_base_index_cb *gbe_get_image_base_index;
> diff --git a/backend/src/backend/program.hpp b/backend/src/backend/program.hpp
> index fe945a6..6bb1529 100644
> --- a/backend/src/backend/program.hpp
> +++ b/backend/src/backend/program.hpp
> @@ -112,12 +112,14 @@ namespace gbe {
>      INLINE uint32_t getSLMSize(void) const { return this->slmSize; }
>      /*! set constant buffer size and return the cb curbe offset */
>      int32_t setConstBufSize(uint32_t argID, size_t sz) {
> +#ifdef GBE_COMPILER_AVAILABLE
>        if(argID >= argNum) return -1;
>        if(args[argID].type != GBE_ARG_CONSTANT_PTR) return -1;
>        if(args[argID].bufSize != sz) {
>          args[argID].bufSize = sz;
>          return ctx->allocConstBuf(argID);
>        }
> +#endif
>        return -1;
>      }
>      /*! Set sampler set. */
> diff --git a/backend/src/gbe_bin_generater.cpp b/backend/src/gbe_bin_generater.cpp
> index dce0792..0295b1a 100644
> --- a/backend/src/gbe_bin_generater.cpp
> +++ b/backend/src/gbe_bin_generater.cpp
> @@ -301,7 +301,7 @@ int main (int argc, const char **argv)
>  
>              used_index[optind-1] = 1;
>              // We must set the image base index here, as we invoke the backend in a non-standard way.
> -            gbe_set_image_base_index(3);
> +            gbe_set_image_base_index_compiler(3);
>              break;
>          }
>  
> diff --git a/backend/src/gbe_bin_interpreter.cpp b/backend/src/gbe_bin_interpreter.cpp
> new file mode 100644
> index 0000000..bd160c3
> --- /dev/null
> +++ b/backend/src/gbe_bin_interpreter.cpp
> @@ -0,0 +1,71 @@
> +/*
> + * Copyright © 2014 Intel Corporation
> + *
> + * This library is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + *
> + * This library 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 Lesser General Public License
> + * for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this library. If not, see <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +#include "sys/alloc.cpp"
> +#include "sys/cvar.cpp"
> +#include "sys/assert.cpp"
> +#include "sys/platform.cpp"
> +#include "ir/constant.cpp"
> +
> +#pragma GCC diagnostic ignored "-Wunused-function"
> +#pragma GCC diagnostic ignored "-Wunused-variable"
> +#undef GBE_COMPILER_AVAILABLE
> +#include "backend/program.cpp"
> +#include "backend/gen_program.cpp"
> +#include "ir/sampler.cpp"
> +#include "ir/image.cpp"
> +
> +struct BinInterpCallBackInitializer
> +{
> +  BinInterpCallBackInitializer() {
> +    gbe_program_new_from_binary = gbe::genProgramNewFromBinary;
> +    gbe_program_get_kernel_num = gbe::programGetKernelNum;
> +    gbe_program_get_kernel_by_name = gbe::programGetKernelByName;
> +    gbe_program_get_kernel = gbe::programGetKernel;
> +    gbe_kernel_get_code_size = gbe::kernelGetCodeSize;
> +    gbe_kernel_get_code = gbe::kernelGetCode;
> +    gbe_kernel_get_arg_num = gbe::kernelGetArgNum;
> +    gbe_kernel_get_curbe_size = gbe::kernelGetCurbeSize;
> +    gbe_kernel_get_sampler_size = gbe::kernelGetSamplerSize;
> +    gbe_kernel_get_compile_wg_size = gbe::kernelGetCompileWorkGroupSize;
> +    gbe_kernel_get_stack_size = gbe::kernelGetStackSize;
> +    gbe_kernel_get_image_size = gbe::kernelGetImageSize;
> +    gbe_kernel_get_name = gbe::kernelGetName;
> +    gbe_kernel_get_arg_type = gbe::kernelGetArgType;
> +    gbe_kernel_get_arg_size = gbe::kernelGetArgSize;
> +    gbe_kernel_get_simd_width = gbe::kernelGetSIMDWidth;
> +    gbe_kernel_get_scratch_size = gbe::kernelGetScratchSize;
> +    gbe_kernel_use_slm = gbe::kernelUseSLM;
> +    gbe_kernel_get_required_work_group_size = gbe::kernelGetRequiredWorkGroupSize;
> +    gbe_kernel_get_curbe_offset = gbe::kernelGetCurbeOffset;
> +    gbe_kernel_get_slm_size = gbe::kernelGetSLMSize;
> +    gbe_kernel_get_arg_align = gbe::kernelGetArgAlign;
> +    gbe_program_get_global_constant_size = gbe::programGetGlobalConstantSize;
> +    gbe_program_delete = gbe::programDelete;
> +    gbe_program_get_global_constant_data = gbe::programGetGlobalConstantData;
> +    gbe_kernel_get_sampler_data = gbe::kernelGetSamplerData;
> +    gbe_kernel_get_image_data = gbe::kernelGetImageData;
> +    gbe_get_image_base_index = gbe::getImageBaseIndex;
> +    gbe_set_image_base_index_interp = gbe::setImageBaseIndex;
> +  }
> +
> +  ~BinInterpCallBackInitializer() {
> +  }
> +};
> +
> +static struct BinInterpCallBackInitializer binInterpCB;
> diff --git a/backend/src/ir/image.cpp b/backend/src/ir/image.cpp
> index 8c34d70..ee80a3d 100644
> --- a/backend/src/ir/image.cpp
> +++ b/backend/src/ir/image.cpp
> @@ -64,16 +64,6 @@ namespace ir {
>      setInfoOffset4Type(imageInfo, key.type, offset);
>    }
>  
> -  Register ImageSet::appendInfo(ImageInfoKey key, Context *ctx)
> -  {
> -    auto it = infoRegMap.find(key.data);
> -    if (it != infoRegMap.end())
> -      return it->second;
> -    Register reg = ctx->reg(FAMILY_DWORD);
> -    infoRegMap.insert(std::make_pair(key.data, reg));
> -    return reg;
> -  }
> -
>    void ImageSet::clearInfo()
>    {
>      struct ImageInfo *imageInfo;
> @@ -87,26 +77,6 @@ namespace ir {
>      }
>    }
>  
> -  void ImageSet::append(Register imageReg, Context *ctx)
> -  {
> -    ir::FunctionArgument *arg =  ctx->getFunction().getArg(imageReg);
> -    GBE_ASSERTM(arg && arg->type == ir::FunctionArgument::IMAGE, "Append an invalid reg to image set.");
> -    GBE_ASSERTM(regMap.find(imageReg) == regMap.end(), "Append the same image reg twice.");
> -
> -    int32_t id = ctx->getFunction().getArgID(arg);
> -    struct ImageInfo *imageInfo = GBE_NEW(struct ImageInfo);
> -    imageInfo->arg_idx = id;
> -    imageInfo->idx = regMap.size() + gbe_get_image_base_index();
> -    imageInfo->wSlot = -1;
> -    imageInfo->hSlot = -1;
> -    imageInfo->depthSlot = -1;
> -    imageInfo->dataTypeSlot = -1;
> -    imageInfo->channelOrderSlot = -1;
> -    imageInfo->dimOrderSlot = -1;
> -    regMap.insert(std::make_pair(imageReg, imageInfo));
> -    indexMap.insert(std::make_pair(imageInfo->idx, imageInfo));
> -  }
> -
>    const int32_t ImageSet::getInfoOffset(ImageInfoKey key) const
>    {
>      auto it = indexMap.find(key.index);
> @@ -271,6 +241,37 @@ namespace ir {
>     outs << spaces << "------------- End ImageSet -------------" << "\n";
>    }
>  
> +#ifdef GBE_COMPILER_AVAILABLE
> +  Register ImageSet::appendInfo(ImageInfoKey key, Context *ctx)
> +  {
> +    auto it = infoRegMap.find(key.data);
> +    if (it != infoRegMap.end())
> +      return it->second;
> +    Register reg = ctx->reg(FAMILY_DWORD);
> +    infoRegMap.insert(std::make_pair(key.data, reg));
> +    return reg;
> +  }
> +
> +  void ImageSet::append(Register imageReg, Context *ctx)
> +  {
> +    ir::FunctionArgument *arg =  ctx->getFunction().getArg(imageReg);
> +    GBE_ASSERTM(arg && arg->type == ir::FunctionArgument::IMAGE, "Append an invalid reg to image set.");
> +    GBE_ASSERTM(regMap.find(imageReg) == regMap.end(), "Append the same image reg twice.");
> +
> +    int32_t id = ctx->getFunction().getArgID(arg);
> +    struct ImageInfo *imageInfo = GBE_NEW(struct ImageInfo);
> +    imageInfo->arg_idx = id;
> +    imageInfo->idx = regMap.size() + gbe_get_image_base_index();
> +    imageInfo->wSlot = -1;
> +    imageInfo->hSlot = -1;
> +    imageInfo->depthSlot = -1;
> +    imageInfo->dataTypeSlot = -1;
> +    imageInfo->channelOrderSlot = -1;
> +    imageInfo->dimOrderSlot = -1;
> +    regMap.insert(std::make_pair(imageReg, imageInfo));
> +    indexMap.insert(std::make_pair(imageInfo->idx, imageInfo));
> +  }
> +#endif
>  
>  } /* namespace ir */
>  } /* namespace gbe */
> diff --git a/backend/src/ir/sampler.cpp b/backend/src/ir/sampler.cpp
> index b67c1b7..1406ff6 100644
> --- a/backend/src/ir/sampler.cpp
> +++ b/backend/src/ir/sampler.cpp
> @@ -27,6 +27,7 @@
>  namespace gbe {
>  namespace ir {
>  
> +#ifdef GBE_COMPILER_AVAILABLE
>    uint8_t SamplerSet::appendReg(uint32_t key, Context *ctx) {
>      uint8_t samplerSlot = samplerMap.size();
>      samplerMap.insert(std::make_pair(key, samplerSlot));
> @@ -61,6 +62,7 @@ namespace ir {
>      }
>      return appendReg(SAMPLER_ID(id), ctx);
>    }
> +#endif
>  
>  #define OUT_UPDATE_SZ(elt) SERIALIZE_OUT(elt, outs, ret_size)
>  #define IN_UPDATE_SZ(elt) DESERIALIZE_IN(elt, ins, total_size)
> diff --git a/backend/src/ocl_common_defines.h b/backend/src/ocl_common_defines.h
> index b736a88..52f5365 100644
> --- a/backend/src/ocl_common_defines.h
> +++ b/backend/src/ocl_common_defines.h
> @@ -1,6 +1,7 @@
>  // This file includes defines that are common to both kernel code and
>  // the NVPTX back-end.
> -
> +#ifndef __OCL_COMMON_DEFINES__
> +#define __OCL_COMMON_DEFINES__
>  //
>  // Common defines for Image intrinsics
>  // Channel order
> @@ -121,3 +122,5 @@ typedef enum clk_sampler_type {
>  // Memory synchronization
>  #define CLK_LOCAL_MEM_FENCE     (1 << 0)
>  #define CLK_GLOBAL_MEM_FENCE    (1 << 1)
> +
> +#endif   /* __OCL_COMMON_DEFINES__ */
> \ No newline at end of file
> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
> index 20e1a4c..4c2b027 100644
> --- a/src/CMakeLists.txt
> +++ b/src/CMakeLists.txt
> @@ -54,6 +54,7 @@ set(OPENCL_SRC
>      cl_alloc.c
>      cl_kernel.c
>      cl_program.c
> +    cl_gbe_loader.cpp
>      cl_sampler.c
>      cl_event.c
>      cl_enqueue.c
> @@ -98,12 +99,14 @@ link_directories (${LLVM_LIBRARY_DIR})
>  add_library(cl SHARED ${OPENCL_SRC})
>  target_link_libraries(
>                        cl
> -                      gbe
> +                      interp
>                        ${XLIB_LIBRARY}
>                        ${XEXT_LIBRARIES}
>                        ${XFIXES_LIBRARIES}
>                        ${DRM_INTEL_LIBRARIES}
>                        ${DRM_LIBRARIES}
> +                      ${CMAKE_THREAD_LIBS_INIT}
> +                      ${CMAKE_DL_LIBS}
>                        ${OPENGL_LIBRARIES}
>                        ${OPTIONAL_EGL_LIBRARY})
>  install (TARGETS cl LIBRARY DESTINATION ${LIB_INSTALL_DIR}/beignet)
> diff --git a/src/cl_device_id.c b/src/cl_device_id.c
> index 4dc74cd..427c50e 100644
> --- a/src/cl_device_id.c
> +++ b/src/cl_device_id.c
> @@ -26,6 +26,7 @@
>  #include "cl_khr_icd.h"
>  #include "cl_thread.h"
>  #include "CL/cl.h"
> +#include "cl_gbe_loader.h"
>  
>  #include <assert.h>
>  #include <stdio.h>
> @@ -252,6 +253,15 @@ baytrail_t_device_break:
>        printf("cl_get_gt_device(): error, unknown device: %x\n", device_id);
>    }
>  
> +  if (!CompilerSupported()) {
> +    if (ret != NULL) {
> +      ret->compiler_available = CL_FALSE;
> +      //ret->linker_available = CL_FALSE;
> +      ret->profile = "EMBEDDED_PROFILE";
> +      ret->profile_sz = strlen(ret->profile) + 1;
> +    }
> +  }
> +
>    return ret;
>  }
>  
> diff --git a/src/cl_gbe_loader.cpp b/src/cl_gbe_loader.cpp
> new file mode 100644
> index 0000000..da83c9a
> --- /dev/null
> +++ b/src/cl_gbe_loader.cpp
> @@ -0,0 +1,82 @@
> +/*
> + * Copyright © 2014 Intel Corporation
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library 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
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library. If not, see <http://www.gnu.org/licenses/>.
> + *
> + */
> +#include <dlfcn.h>
> +#include <string.h>
> +#include "cl_gbe_loader.h"
> +#include "backend/src/GBEConfig.h"
> +
> +struct GbeLoaderInitializer
> +{
> +  GbeLoaderInitializer() {
> +    inited = false;
> +
> +    const char* nonCompiler = getenv("OCL_NON_COMPILER");
> +    if (nonCompiler != NULL) {
> +      if (strcmp(nonCompiler, "1") == 0)
> +        return;
> +    }
> +
> +    const char* gbePath = getenv("OCL_GBE_PATH");
> +    if (gbePath == NULL)
> +      gbePath = GBE_OBJECT_DIR;
> +
> +    dlh = dlopen(gbePath, RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
> +    if (dlh != NULL) {
> +      gbe_program_new_from_source = *(gbe_program_new_from_source_cb **)dlsym(dlh, "gbe_program_new_from_source");
> +      if (gbe_program_new_from_source == NULL)
> +        return;
> +
> +      gbe_program_serialize_to_binary = *(gbe_program_serialize_to_binary_cb **)dlsym(dlh, "gbe_program_serialize_to_binary");
> +      if (gbe_program_serialize_to_binary == NULL)
> +        return;
> +
> +      gbe_program_new_from_llvm = *(gbe_program_new_from_llvm_cb **)dlsym(dlh, "gbe_program_new_from_llvm");
> +      if (gbe_program_new_from_llvm == NULL)
> +        return;
> +
> +      //gbe_kernel_set_const_buffer_size is not used by runttime
> +      gbe_kernel_set_const_buffer_size = *(gbe_kernel_set_const_buffer_size_cb **)dlsym(dlh, "gbe_kernel_set_const_buffer_size");
> +      if (gbe_kernel_set_const_buffer_size == NULL)
> +        return;
> +
> +      gbe_set_image_base_index_compiler = *(gbe_set_image_base_index_cb **)dlsym(dlh, "gbe_set_image_base_index_compiler");
> +      if (gbe_set_image_base_index_compiler == NULL)
> +        return;
> +
> +      inited = true;
> +    }
> +  }
> +
> +  ~GbeLoaderInitializer() {
> +    if (dlh != NULL)
> +      dlclose(dlh);
> +  }
> +
> +  bool inited;
> +  void *dlh;
> +};
> +
> +static struct GbeLoaderInitializer gbeLoader;
> +
> +int CompilerSupported()
> +{
> +  if (gbeLoader.inited)
> +    return 1;
> +  else
> +    return 0;
> +}
> diff --git a/src/cl_gbe_loader.h b/src/cl_gbe_loader.h
> new file mode 100644
> index 0000000..50ec55b
> --- /dev/null
> +++ b/src/cl_gbe_loader.h
> @@ -0,0 +1,32 @@
> +/*
> + * Copyright © 2014 Intel Corporation
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library 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
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library. If not, see <http://www.gnu.org/licenses/>.
> + *
> + */
> +
> +#ifndef __CL_GBE_LOADER_H__
> +#define __CL_GBE_LOADER_H__
> +
> +#include "program.h"
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +int CompilerSupported();
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __CL_GBE_LOADER_H__ */
> diff --git a/src/cl_kernel.h b/src/cl_kernel.h
> index fb509a2..8d0e566 100644
> --- a/src/cl_kernel.h
> +++ b/src/cl_kernel.h
> @@ -22,7 +22,7 @@
>  
>  #include "cl_internals.h"
>  #include "cl_driver.h"
> -#include "program.h"
> +#include "cl_gbe_loader.h"
>  #include "CL/cl.h"
>  
>  #include <stdint.h>
> diff --git a/src/cl_program.c b/src/cl_program.c
> index 184d6b5..c4e85d1 100644
> --- a/src/cl_program.c
> +++ b/src/cl_program.c
> @@ -24,6 +24,7 @@
>  #include "cl_alloc.h"
>  #include "cl_utils.h"
>  #include "cl_khr_icd.h"
> +#include "cl_gbe_loader.h"
>  #include "CL/cl.h"
>  #include "CL/cl_intel.h"
>  
> @@ -326,6 +327,11 @@ cl_program_build(cl_program p, const char *options)
>    }
>  
>    if (p->source_type == FROM_SOURCE) {
> +    if (!CompilerSupported()) {
> +      err = CL_COMPILER_NOT_AVAILABLE;
> +      goto error;
> +    }
> +
>      p->opaque = gbe_program_new_from_source(p->ctx->device->vendor_id, p->source, p->build_log_max_sz, options, p->build_log, &p->build_log_sz);
>      if (UNLIKELY(p->opaque == NULL)) {
>        if (p->build_log_sz > 0 && strstr(p->build_log, "error: error reading 'options'"))
> diff --git a/src/cl_program.h b/src/cl_program.h
> index a6d75da..4218efd 100644
> --- a/src/cl_program.h
> +++ b/src/cl_program.h
> @@ -21,7 +21,7 @@
>  #define __CL_PROGRAM_H__
>  
>  #include "cl_internals.h"
> -#include "program.h"
> +#include "cl_gbe_loader.h"
>  #include "CL/cl.h"
>  
>  #include <stdint.h>
> diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c
> index 08d6bc0..aa31344 100644
> --- a/src/intel/intel_driver.c
> +++ b/src/intel/intel_driver.c
> @@ -399,7 +399,8 @@ cl_intel_driver_delete(intel_driver_t *driver)
>    intel_driver_terminate(driver);
>    intel_driver_delete(driver);
>  }
> -#include "program.h"
> +
> +#include "cl_gbe_loader.h"
>  static intel_driver_t*
>  cl_intel_driver_new(cl_context_prop props)
>  {
> @@ -409,7 +410,9 @@ cl_intel_driver_new(cl_context_prop props)
>    /* We use the first 2 slots(0,1) for all the bufs.
>     * Notify the gbe this base index, thus gbe can avoid conflicts
>     * when it allocates slots for images*/
> -  gbe_set_image_base_index(3);
> +  if (CompilerSupported())
> +    gbe_set_image_base_index_compiler(3);
> +  gbe_set_image_base_index_interp(3);
>  exit:
>    return driver;
>  error:
> diff --git a/utests/setenv.sh.in b/utests/setenv.sh.in
> index ad77369..95f468b 100644
> --- a/utests/setenv.sh.in
> +++ b/utests/setenv.sh.in
> @@ -3,3 +3,4 @@
>  export OCL_PCM_PATH=@LOCAL_PCM_OBJECT_DIR@
>  export OCL_PCH_PATH=@LOCAL_PCH_OBJECT_DIR@
>  export OCL_KERNEL_PATH=@CMAKE_CURRENT_SOURCE_DIR@/../kernels
> +export OCL_GBE_PATH=@LOCAL_GBE_OBJECT_DIR@
> -- 
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list