[Beignet] [PATCH 2/3] support CL_EMBEDDED_PROFILE with offline compiler

Zhigang Gong zhigang.gong at linux.intel.com
Tue Jan 6 16:30:55 PST 2015


Thanks for the patchset.

I have the following comments as below:

1. It's better to use USE_STANDALONE_GBE_COMPILER rather than define a
   STATIC_GBE_COMPILER_PATH to indicate we will use that standalone
   gbe compiler. So we use USE_STANDALONE_GBE_COMPILER to control whether
   we will use a standalone compiler, then at configuration stage, we
   need to write a new CMake script to find the STANDALONE_GBE_COMPILER_DIR.
   It may search from some default path and prefer to find it from the
   environment variable GBE_BIN_GENERATER_PATH if possible.

2. If we set BUILD_STANDALONE_GBE_COMPILER, We'd better to write a new cmake
   target to generate such a standalone tarball includes:
   beignet/beignet.bc
   beignet/beignet.pch
   beignet/include/ocl_xxx.h
   beignet/gbe_bin_generator
   Then user just need to untar this file to a standard path, such as /usr/local/lib
   or /usr/lib. Then on target system, user just need to set USE_STANDALONE_GBE_COMPILER
   and without set any other environment variables as the cmake script will
   search that directory. If user want to put it in a customized place, then
   user need to specify GBE_BIN_GENERATER_PATH.

3. As to the CL_EMBEDDED_PROFILE profile, I know you are talking about the
   CL_DEVICE_COMPILER_AVAILABLE which must be true for full profile and
   could be false for embedded profile. But other than that, we are comply
   with full profile even on target system. And if the standalone compiler
   could work, we even can make the compiler avialable, right? We need to
   document the detail difference rather than say we support CL_EMBEDDED_PROFILE,
   and I also don't see you change the:
   DECL_INFO_STRING(profile, "FULL_PROFILE")
   I agree not to change that.

4. We need to disable all the unit test cases which require compiler.

5. We need to add some test cases to demostrate how to build gen kernel binary
   and how to load and run the gen kernel binary on target system.

6. We need a new document to specify the detail instructions of how to use this
   new function.

Thanks,
Zhigang Gong.

On Wed, Dec 31, 2014 at 03:35:19PM +0800, Guo Yejun wrote:
> At some platforms with old c/c++ environment, only CL_EMBEDDED_PROFILE
> is supported, but the offline compiler (gbe_bin_generater and some
> other files) is still needed during the build. So, add a CMAKE option
> STATIC_GBE_COMPILER_PATH as the path to the already built offline compiler.
> Once this option is given, all the compiler relative code will not be
> built any more, only libcl.so and libgebinterp.so will be built.
> 
> The process looks like:
> 1. build beignet with option BUILD_STATIC_GBE_COMPILER=true inside
> mainstream c/c++ environment. The built files under the build directory
> that we cared here are:
> backend/src/libocl//usr/local/lib/beignet//beignet.bc
> backend/src/libocl//usr/local/lib/beignet//beignet.pch
> backend/src/libocl//usr/local/lib/beignet//include/*
> backend/src/gbe_bin_generater
> 
> 2. copy these files to /your_path_to_compiler inside old environment
> The files under /your_path_to_compiler looks like:
> beignet.bc  beignet.pch  gbe_bin_generater  include
> 
> 3. Within old environment, build with STATIC_GBE_COMPILER_PATH=/your_path_to_compiler
> libcl.so and libgbeinterp.so will be built here, libgbe.so and gbe_bin_generater
> will not be built here.
> 
> Signed-off-by: Guo Yejun <yejun.guo at intel.com>
> ---
>  CMakeLists.txt             |  3 +++
>  backend/CMakeLists.txt     | 20 +++++++++++++++++---
>  backend/src/CMakeLists.txt | 24 +++++++++++++++++-------
>  src/CMakeLists.txt         |  5 +++--
>  utests/CMakeLists.txt      |  5 +++--
>  5 files changed, 43 insertions(+), 14 deletions(-)
> 
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> index 4da3561..5cb31c2 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -76,9 +76,12 @@ set (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DGBE_DEBUG=1")
>  set (CMAKE_C_FLAGS_MINSIZEREL     "-Os -DNDEBUG -DGBE_DEBUG=0")
>  set (CMAKE_C_FLAGS_RELEASE        "-O2 -DNDEBUG -DGBE_DEBUG=0")
>  
> +# Do not involve llvm if the offline compiler is given
> +IF(NOT STATIC_GBE_COMPILER_PATH)
>  # Front end stuff we need
>  #INCLUDE(CMake/FindLLVM.cmake)
>  Find_Package(LLVM 3.3)
> +ENDIF(NOT STATIC_GBE_COMPILER_PATH)
>  
>  set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined ${LLVM_LDFLAGS}")
>  
> diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt
> index bf96baf..36b6beb 100644
> --- a/backend/CMakeLists.txt
> +++ b/backend/CMakeLists.txt
> @@ -36,14 +36,28 @@ include_directories (${CMAKE_CURRENT_BINARY_DIR})
>  # Project source code
>  ##############################################################
>  add_subdirectory (src)
> +
> +if (STATIC_GBE_COMPILER_PATH)
> +set(LOCAL_OCL_BITCODE_BIN ${STATIC_GBE_COMPILER_PATH}/beignet.bc)
> +set(LOCAL_OCL_HEADER_DIR ${STATIC_GBE_COMPILER_PATH}/include)
> +set(LOCAL_OCL_PCH_OBJECT ${STATIC_GBE_COMPILER_PATH}/beignet.pch)
> +endif (STATIC_GBE_COMPILER_PATH)
> +
>  set(LOCAL_OCL_BITCODE_BIN "${LOCAL_OCL_BITCODE_BIN}" PARENT_SCOPE)
>  set(LOCAL_OCL_HEADER_DIR "${LOCAL_OCL_HEADER_DIR}" PARENT_SCOPE)
>  set(LOCAL_OCL_PCH_OBJECT "${LOCAL_OCL_PCH_OBJECT}" PARENT_SCOPE)
> -
>  set(LOCAL_GBE_OBJECT_DIR ${LOCAL_GBE_OBJECT_DIR} PARENT_SCOPE)
>  set(LOCAL_INTERP_OBJECT_DIR ${LOCAL_INTERP_OBJECT_DIR} PARENT_SCOPE)
>  
>  set (GBE_BIN_GENERATER
> -     env OCL_BITCODE_LIB_PATH=${LOCAL_OCL_BITCODE_BIN} OCL_HEADER_FILE_DIR=${LOCAL_OCL_HEADER_DIR} OCL_PCH_PATH=${LOCAL_OCL_PCH_OBJECT} LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src/gbe_bin_generater
> -     PARENT_SCOPE)
> +     env OCL_BITCODE_LIB_PATH=${LOCAL_OCL_BITCODE_BIN} OCL_HEADER_FILE_DIR=${LOCAL_OCL_HEADER_DIR} OCL_PCH_PATH=${LOCAL_OCL_PCH_OBJECT})
>  
> +if (STATIC_GBE_COMPILER_PATH)
> +set (GBE_BIN_GENERATER
> +     ${GBE_BIN_GENERATER} ${STATIC_GBE_COMPILER_PATH}/gbe_bin_generater
> +     PARENT_SCOPE)
> +else (STATIC_GBE_COMPILER_PATH)
> +set (GBE_BIN_GENERATER
> +     ${GBE_BIN_GENERATER} LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src/gbe_bin_generater
> +     PARENT_SCOPE)
> +endif (STATIC_GBE_COMPILER_PATH)
> diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt
> index 118a745..81cf7b8 100644
> --- a/backend/src/CMakeLists.txt
> +++ b/backend/src/CMakeLists.txt
> @@ -9,15 +9,19 @@ configure_file (
>      "GBEConfig.h"
>  )
>  
> +#do not involve libocl if the offline compiler is given,
> +#since we will not build the online compiler
> +if (NOT STATIC_GBE_COMPILER_PATH)
>  add_subdirectory(libocl)
> +add_dependencies(beignet_bitcode libocl)
> +endif ()
> +
>  set (LOCAL_GBE_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libgbe.so" PARENT_SCOPE)
>  set (LOCAL_INTERP_OBJECT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libgbeinterp.so" PARENT_SCOPE)
>  set (LOCAL_OCL_BITCODE_BIN "${OCL_OBJECT_DIR}/beignet.bc" PARENT_SCOPE)
>  set (LOCAL_OCL_HEADER_DIR "${OCL_OBJECT_DIR}/include/" PARENT_SCOPE)
>  set (LOCAL_OCL_PCH_OBJECT "${OCL_OBJECT_DIR}/beignet.local.pch" PARENT_SCOPE)
>  
> -add_dependencies(beignet_bitcode libocl)
> -
>  set (GBE_SRC
>      ${ocl_blob_file}
>      sys/vector.hpp
> @@ -130,14 +134,16 @@ set (GBE_LINK_LIBRARIES
>  include_directories (.)
>  link_directories (${LLVM_LIBRARY_DIRS} ${DRM_LIBDIR})
>  include_directories(${LLVM_INCLUDE_DIRS})
> -add_library (gbe SHARED ${GBE_SRC})
>  
> +#don't build libgbe (the online compiler) if the offline compiler is given
> +if (NOT STATIC_GBE_COMPILER_PATH)
> +add_library (gbe SHARED ${GBE_SRC})
>  target_link_libraries(gbe ${GBE_LINK_LIBRARIES})
> +add_dependencies(gbe beignet_bitcode)
> +endif (NOT STATIC_GBE_COMPILER_PATH)
>  
>  add_library(gbeinterp SHARED gbe_bin_interpreter.cpp)
>  
> -add_dependencies(gbe beignet_bitcode)
> -
>  if (LLVM_VERSION_NODOT VERSION_EQUAL 34)
>    find_library(TERMINFO NAMES tinfo ncurses)
>    if (${TERMINFO} STREQUAL TERMINFO-NOTFOUND)
> @@ -150,6 +156,9 @@ endif(LLVM_VERSION_NODOT VERSION_EQUAL 34)
>  
>  link_directories (${LLVM_LIBRARY_DIR} ${DRM_LIBDIR})
>  
> +
> +#if the offline compiler is given, do not build/install it anymore
> +if (NOT STATIC_GBE_COMPILER_PATH)
>  if (BUILD_STATIC_GBE_COMPILER STREQUAL "true")
>  macro(remove_cxx_flag flag)
>    string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
> @@ -164,9 +173,10 @@ ADD_EXECUTABLE(gbe_bin_generater gbe_bin_generater.cpp)
>  TARGET_LINK_LIBRARIES(gbe_bin_generater gbe)
>  endif (BUILD_STATIC_GBE_COMPILER STREQUAL "true")
>  
> -
>  install (TARGETS gbe LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR})
> -install (TARGETS gbeinterp LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR})
>  install (FILES ${OCL_OBJECT_DIR}/beignet.bc DESTINATION ${BEIGNET_INSTALL_DIR})
>  install (FILES ${OCL_OBJECT_DIR}/beignet.pch DESTINATION ${BEIGNET_INSTALL_DIR})
>  install (FILES ${OCL_HEADER_FILES} DESTINATION ${BEIGNET_INSTALL_DIR}/include)
> +endif (NOT STATIC_GBE_COMPILER_PATH)
> +
> +install (TARGETS gbeinterp LIBRARY DESTINATION ${BEIGNET_INSTALL_DIR})
> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
> index 7182bad..a55f84d 100644
> --- a/src/CMakeLists.txt
> +++ b/src/CMakeLists.txt
> @@ -10,18 +10,19 @@ foreach (KF ${KERNEL_FILES})
>    set (input_file ${KERNEL_PATH}/${KF}.cl)
>    set (output_file ${KERNEL_PATH}/${KF}_str.c)
>    list (APPEND KERNEL_STR_FILES ${output_file})
> +  list (GET GBE_BIN_GENERATER -1 GBE_BIN_FILE)
>    if(GEN_PCI_ID)
>      add_custom_command(
>        OUTPUT ${output_file}
>        COMMAND rm -rf ${output_file}
>        COMMAND ${GBE_BIN_GENERATER} -s ${input_file} -o${output_file} -t${GEN_PCI_ID}
> -      DEPENDS ${input_file} ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater)
> +      DEPENDS ${input_file} ${GBE_BIN_FILE})
>    else(GEN_PCI_ID)
>      add_custom_command(
>        OUTPUT ${output_file}
>        COMMAND rm -rf ${output_file}
>        COMMAND ${GBE_BIN_GENERATER} -s ${input_file} -o${output_file}
> -      DEPENDS ${input_file} ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater)
> +      DEPENDS ${input_file} ${GBE_BIN_FILE})
>    endif(GEN_PCI_ID)
>  endforeach (KF)
>  endmacro (MakeKernelBinStr)
> diff --git a/utests/CMakeLists.txt b/utests/CMakeLists.txt
> index 5b29c0b..9623dc1 100644
> --- a/utests/CMakeLists.txt
> +++ b/utests/CMakeLists.txt
> @@ -219,16 +219,17 @@ endif (X11_FOUND)
>  
>  SET (kernel_bin ${CMAKE_CURRENT_SOURCE_DIR}/../kernels/compiler_ceil)
>  
> +list (GET GBE_BIN_GENERATER -1 GBE_BIN_FILE)
>  if(GEN_PCI_ID)
>    ADD_CUSTOM_COMMAND(
>    OUTPUT ${kernel_bin}.bin
>    COMMAND ${GBE_BIN_GENERATER} ${kernel_bin}.cl -o${kernel_bin}.bin -t${GEN_PCI_ID}
> -  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater ${kernel_bin}.cl)
> +  DEPENDS ${GBE_BIN_FILE} ${kernel_bin}.cl)
>  else(GEN_PCI_ID)
>    ADD_CUSTOM_COMMAND(
>    OUTPUT ${kernel_bin}.bin
>    COMMAND ${GBE_BIN_GENERATER} ${kernel_bin}.cl -o${kernel_bin}.bin
> -  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater ${kernel_bin}.cl)
> +  DEPENDS ${GBE_BIN_FILE} ${kernel_bin}.cl)
>  endif(GEN_PCI_ID)
>  
>  ADD_CUSTOM_TARGET(kernel_bin.bin
> -- 
> 1.9.1
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list