From 32ac28b2b66e571ab190a6ea4487ad809390df83 Mon Sep 17 00:00:00 2001 From: Zhigang Gong Date: Thu, 9 Jan 2014 17:36:37 +0800 Subject: [PATCH] Refine the method to find pch and pcm files. When compile user kernels, we need to find the precompiled header file and the precompiled module file. The previous implementation will find the build directory then find the system directory. This is not elegant when it is packaged to a distro. It doesn't need to search the build directory. So I change the default search path to the system directory only. And for the deveoper, I change the build script to set a proper environment variable and make the gbe bin generator and the utest could find the local pch files and pcm files firstly. The only change is now, after the build process. Before the user run the utests, it need to set up the environment firstly. Just invoke . utest/setenv.sh. Then everything should be the same as previous. This setenv.sh also set the OCL_KERNEL_PATH, so you don't need to set it manually now. This patch also update the document. Signed-off-by: Zhigang Gong --- backend/CMakeLists.txt | 6 ++++++ backend/src/CMakeLists.txt | 8 ++++++-- backend/src/GBEConfig.h.in | 2 +- backend/src/backend/program.cpp | 22 +++++++++++++--------- docs/Beignet.mdwn | 20 ++++++++++++++++++-- src/CMakeLists.txt | 3 +-- utests/CMakeLists.txt | 11 ++++++++--- utests/utest.cpp | 2 -- 8 files changed, 53 insertions(+), 21 deletions(-) diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 476c6f2..dd55a4a 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -91,9 +91,15 @@ elseif (COMPILER STREQUAL "ICC") set (CCMAKE_CXX_FLAGS_MINSIZEREL "-Os -DGBE_DEBUG=0") set (CMAKE_EXE_LINKER_FLAGS "") endif () + include_directories (${CMAKE_CURRENT_BINARY_DIR}) ############################################################## # Project source code ############################################################## 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 (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 d19cb50..d15e7b7 100644 --- a/backend/src/CMakeLists.txt +++ b/backend/src/CMakeLists.txt @@ -195,9 +195,13 @@ TARGET_LINK_LIBRARIES(gbe_bin_generater gbe) install (FILES ${ocl_blob_file} DESTINATION lib/beignet) install (FILES ${pch_object} DESTINATION lib/beignet) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${pcm_lib} DESTINATION lib/beignet) +# When build beignet itself, we need to export the local precompiled header file and precompiled module +# 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 (PCH_OBJECT_DIR "${local_pch_object};${beignet_install_path}/ocl_stdlib.h.pch") -set (PCM_LIB_DIR "${CMAKE_CURRENT_BINARY_DIR}/${pcm_lib};${beignet_install_path}/${pcm_lib}") +set (PCH_OBJECT_DIR "${beignet_install_path}/ocl_stdlib.h.pch") +set (PCM_OBJECT_DIR "${beignet_install_path}/${pcm_lib}") configure_file ( "GBEConfig.h.in" "GBEConfig.h" diff --git a/backend/src/GBEConfig.h.in b/backend/src/GBEConfig.h.in index 9920d25..5bc09b8 100644 --- a/backend/src/GBEConfig.h.in +++ b/backend/src/GBEConfig.h.in @@ -2,4 +2,4 @@ #define LIBGBE_VERSION_MAJOR @LIBGBE_VERSION_MAJOR@ #define LIBGBE_VERSION_MINOR @LIBGBE_VERSION_MINOR@ #define PCH_OBJECT_DIR "@PCH_OBJECT_DIR@" -#define PCM_LIB_DIR "@PCM_LIB_DIR@" +#define PCM_OBJECT_DIR "@PCM_OBJECT_DIR@" diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index 3ab1bc2..284a755 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -465,6 +465,9 @@ namespace gbe { } BVAR(OCL_OUTPUT_BUILD_LOG, false); + SVAR(OCL_PCH_PATH, PCH_OBJECT_DIR); + SVAR(OCL_PCM_PATH, PCM_OBJECT_DIR); + static bool buildModuleFromSource(const char* input, const char* output, std::string options, size_t stringSize, char *err, size_t *errSize) { // Arguments to pass to the clang frontend @@ -582,12 +585,13 @@ namespace gbe { // Create an action and make the compiler instance carry it out llvm::OwningPtr Act(new clang::EmitLLVMOnlyAction()); - std::string dirs = PCM_LIB_DIR, pcmLib; + std::string dirs = OCL_PCM_PATH; + std::string pcmFileName; std::istringstream idirs(dirs); bool findPcm = false; - while (getline(idirs, pcmLib, ';')) { - if(access(pcmLib.c_str(), R_OK) == 0) { + while (getline(idirs, pcmFileName, ':')) { + if(access(pcmFileName.c_str(), R_OK) == 0) { findPcm = true; break; } @@ -595,7 +599,7 @@ namespace gbe { GBE_ASSERT(findPcm && "Could not find pre compiled module library.\n"); - Clang.getCodeGenOpts().LinkBitcodeFile = pcmLib; + Clang.getCodeGenOpts().LinkBitcodeFile = pcmFileName; auto retVal = Clang.ExecuteAction(*Act); if (err != NULL) { @@ -651,7 +655,6 @@ namespace gbe { char clStr[L_tmpnam+1], llStr[L_tmpnam+1]; const std::string clName = std::string(tmpnam_r(clStr)) + ".cl"; /* unsafe! */ const std::string llName = std::string(tmpnam_r(llStr)) + ".ll"; /* unsafe! */ - std::string pchHeaderName; std::string clOpt; int optLevel = 1; @@ -730,11 +733,12 @@ namespace gbe { clOpt += options; } - std::string dirs = PCH_OBJECT_DIR; + std::string dirs = OCL_PCH_PATH; std::istringstream idirs(dirs); + std::string pchFileName; - while (getline(idirs, pchHeaderName, ';')) { - if(access(pchHeaderName.c_str(), R_OK) == 0) { + while (getline(idirs, pchFileName, ':')) { + if(access(pchFileName.c_str(), R_OK) == 0) { findPCH = true; break; } @@ -742,7 +746,7 @@ namespace gbe { if (usePCH && findPCH) { clOpt += " -include-pch "; - clOpt += pchHeaderName; + clOpt += pchFileName; clOpt += " "; } else fwrite(ocl_stdlib_str.c_str(), strlen(ocl_stdlib_str.c_str()), 1, clFile); diff --git a/docs/Beignet.mdwn b/docs/Beignet.mdwn index d05950f..e3b4b1b 100644 --- a/docs/Beignet.mdwn +++ b/docs/Beignet.mdwn @@ -70,8 +70,10 @@ this code also produces various tests to ensure the compiler and the run-time consistency. This small test framework uses a simple c++ registration system to register all the unit tests. -You need to set the variable `OCL_KERNEL_PATH` to locate the OCL kernels. They -are with the run-time in `./kernels`. +You need to call setenv.sh in the utests/ directory to set some environment variables +firstly as below: + +`> . setenv.sh` Then in `utests/`: @@ -83,6 +85,20 @@ will run all the unit tests one after the others will only run `some_unit_test0` and `some_unit_test1` tests +How to install +-------------- + +Simply invoke: +`> make install` + +It installs libcl.so and the precompiled header/module files and the ocl_stdlib.h file +into install_prefix/beignet/ direcotry. If the system support ICD, it also installs the +intel-beignet.icd to /etc/OpenCL/vendors/. + +To make beignet support ICD, you need to have the following two packages installed: +ocl-icd-dev, ocl-icd-libopencl1 (package name for the ubuntu.) +before your build beignet. + Supported Hardware ------------------ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cf53a69..7d4d93d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../backend/src/backend/ ${CMAKE_CURRENT_SOURCE_DIR}/../include ${MESA_SOURCE_INCLUDES}) - macro (MakeKernelBinStr KERNEL_PATH KERNEL_FILES) foreach (KF ${KERNEL_FILES}) set (input_file ${KERNEL_PATH}/${KF}.cl) @@ -13,7 +12,7 @@ foreach (KF ${KERNEL_FILES}) add_custom_command( OUTPUT ${output_file} COMMAND rm -rf ${output_file} - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater -s ${input_file} -o${output_file} + COMMAND ${GBE_BIN_GENERATER} -s ${input_file} -o${output_file} DEPENDS ${input_file} ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater) endforeach (KF) endmacro (MakeKernelBinStr) diff --git a/utests/CMakeLists.txt b/utests/CMakeLists.txt index b1f0b52..8c64844 100644 --- a/utests/CMakeLists.txt +++ b/utests/CMakeLists.txt @@ -12,6 +12,11 @@ string(REGEX REPLACE "generated/([^\ ]*)\\.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ string(REGEX REPLACE " " ";" KERNEL_MATH_LIST ${KERNEL_MATH_LIST}) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "generated;${KERNEL_MATH_LIST}") +configure_file ( + "setenv.sh.in" + "setenv.sh" + ) + link_directories (${LLVM_LIBRARY_DIR}) set (utests_sources utest_error.c @@ -170,7 +175,7 @@ set (utests_sources SET (kernel_bin ${CMAKE_CURRENT_SOURCE_DIR}/../kernels/compiler_ceil) ADD_CUSTOM_COMMAND( OUTPUT ${kernel_bin}.bin - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/../backend/src/gbe_bin_generater ${kernel_bin}.cl -o${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 ) @@ -189,8 +194,8 @@ add_custom_target(utest_generator if (EGL_FOUND AND MESA_SOURCE_FOUND) SET(utests_sources ${utests_sources} compiler_fill_gl_image.cpp) -SET(CMAKE_CXX_FLAGS "-DHAS_EGL ${CMAKE_CXX_FLAGS}") -SET(CMAKE_C_FLAGS "-DHAS_EGL ${CMAKE_C_FLAGS}") +SET(CMAKE_CXX_FLAGS "-DHAS_EGL ${CMAKE_CXX_FLAGS} ${DEF_OCL_PCH_PCM_PATH}") +SET(CMAKE_C_FLAGS "-DHAS_EGL ${CMAKE_C_FLAGS} ${DEF_OCL_PCH_PCM_PATH}") endif (EGL_FOUND AND MESA_SOURCE_FOUND) ADD_LIBRARY(utests SHARED ${ADDMATHFUNC} ${utests_sources}) diff --git a/utests/utest.cpp b/utests/utest.cpp index 6d51598..718916f 100644 --- a/utests/utest.cpp +++ b/utests/utest.cpp @@ -41,8 +41,6 @@ UTest::UTest(Function fn, const char *name, bool haveIssue, bool needDestroyProg utestList->push_back(*this); } -UTest::UTest(void) : fn(NULL), name(NULL), haveIssue(false) {} - static bool strequal(const char *s1, const char *s2) { if (strcmp(s1, s2) == 0) return true; return false; -- 2.7.4