[Beignet] [PATCH 2/3] support CL_EMBEDDED_PROFILE with offline compiler
Guo, Yejun
yejun.guo at intel.com
Tue Jan 6 18:54:07 PST 2015
Thanks for your nice comments, it would be much clear and user friendly.
Could you review the third patch of this patch set? It is not relative to the stand alone compiler, it is about to enable rtti compile option, it is needed for some old stl version.
For the profile discussion, agree that the CL_DEVICE_COMPILER_AVAILABLE could be true if we provide the stand alone compiler. Just to clarify that the current implementation is to report false if unable to load libgbe.so, we can add the stand alone compiler into consideration, anyway, it can be discussed in a separate thread.
For the test case demo, there is a utest case shows how to use the binary kernel, which is prebuilt by the standalone compiler, I'll modify them to make it clearer.
For the CMake option name USE_STANDALONE_GBE_COMPILER, STANDALONE_GBE_COMPILER_DIR, BUILD_STANDALONE_GBE_COMPILER, and utest disable, and the document, do not object your comments, and will modify accordingly.
-----Original Message-----
From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of Zhigang Gong
Sent: Wednesday, January 07, 2015 8:31 AM
To: Guo, Yejun
Cc: beignet at lists.freedesktop.org
Subject: Re: [Beignet] [PATCH 2/3] support CL_EMBEDDED_PROFILE with offline compiler
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
_______________________________________________
Beignet mailing list
Beignet at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list