From c0419cc74982c60fcb41614d2bee3631a5ba0988 Mon Sep 17 00:00:00 2001 From: Maneesh Gupta Date: Fri, 18 Nov 2016 14:33:20 +0530 Subject: [PATCH] Refactor for building HIP as dynamic library Change-Id: I65a3d9d589c4fdbbdcf1611e5427224253be8260 --- CMakeLists.txt | 23 ++-- bin/hipcc | 2 +- include/hip/hcc_detail/hip_runtime.h | 34 +---- packaging/hip_hcc.txt | 1 + src/device_util.cpp | 182 +++++++++++++++++++++++++++ src/hip_hcc.cpp | 144 --------------------- src/hip_memory.cpp | 4 - 7 files changed, 203 insertions(+), 187 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 885897fb1b..1b95145b96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,33 +173,38 @@ if(HIP_PLATFORM STREQUAL "hcc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${HIP_HCC_BUILD_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${HIP_HCC_BUILD_FLAGS}") - set(SOURCE_FILES src/device_util.cpp + set(SOURCE_FILES_SHARED src/hip_hcc.cpp src/hip_context.cpp src/hip_device.cpp src/hip_error.cpp src/hip_event.cpp - src/hip_ldg.cpp src/hip_memory.cpp src/hip_peer.cpp src/hip_stream.cpp - src/hip_fp16.cpp src/hip_module.cpp) + set(SOURCE_FILES_STATIC + src/device_util.cpp + src/hip_ldg.cpp + src/hip_fp16.cpp) + if(${HIP_LIB_TYPE} EQUAL 0) - add_library(hip_hcc OBJECT ${SOURCE_FILES}) + add_library(hip_hcc OBJECT ${SOURCE_FILES_SHARED} ${SOURCE_FILES_STATIC}) elseif(${HIP_LIB_TYPE} EQUAL 1) - add_library(hip_hcc STATIC ${SOURCE_FILES}) + add_library(hip_hcc STATIC ${SOURCE_FILES_SHARED} ${SOURCE_FILES_STATIC}) else() set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${HCC_HOME}/lib -lmcwamp -Wl,-Bsymbolic") - add_library(hip_hcc SHARED ${SOURCE_FILES}) + add_library(hip_hcc SHARED ${SOURCE_FILES_SHARED}) + add_library(hip_device STATIC ${SOURCE_FILES_STATIC}) + add_dependencies(hip_device hip_hcc) endif() # Generate hcc_version.txt add_custom_target(query_hcc_version COMMAND ${HCC_HOME}/bin/hcc --version > ${PROJECT_BINARY_DIR}/hcc_version.tmp) add_custom_target(check_hcc_version COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_BINARY_DIR}/hcc_version.tmp ${PROJECT_BINARY_DIR}/hcc_version.txt DEPENDS query_hcc_version) set_source_files_properties(${PROJECT_BINARY_DIR}/hcc_version.txt PROPERTIES GENERATED TRUE) - set_source_files_properties(${SOURCE_FILES} PROPERTIES OBJECT_DEPENDS ${PROJECT_BINARY_DIR}/hcc_version.txt) + set_source_files_properties(${SOURCE_FILES_SHARED} ${SOURCE_FILES_STATIC} PROPERTIES OBJECT_DEPENDS ${PROJECT_BINARY_DIR}/hcc_version.txt) add_dependencies(hip_hcc check_hcc_version update_build_and_version_info) # Generate .hipInfo @@ -220,8 +225,10 @@ add_custom_target(doc COMMAND HIP_PATH=${CMAKE_CURRENT_SOURCE_DIR} doxygen ${CMA if(HIP_PLATFORM STREQUAL "hcc") if(${HIP_LIB_TYPE} EQUAL 0) install(DIRECTORY ${PROJECT_BINARY_DIR}/CMakeFiles/hip_hcc.dir/src/ DESTINATION lib) - else() + elseif(${HIP_LIB_TYPE} EQUAL 1) install(TARGETS hip_hcc DESTINATION lib) + else() + install(TARGETS hip_hcc hip_device DESTINATION lib) endif() install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/hip_ir.ll DESTINATION lib) diff --git a/bin/hipcc b/bin/hipcc index dee0894869..641f70b065 100755 --- a/bin/hipcc +++ b/bin/hipcc @@ -328,7 +328,7 @@ if ($needHipHcc) { } elsif ($HIP_LIB_TYPE eq 1) { substr($HIPLDFLAGS,0,0) = " -L$HIP_PATH/lib -lhip_hcc " ; } else { - substr($HIPLDFLAGS,0,0) = " -L$HIP_PATH/lib -Wl,--rpath=$HIP_PATH/lib -lhip_hcc "; + substr($HIPLDFLAGS,0,0) = " -L$HIP_PATH/lib -Wl,--rpath=$HIP_PATH/lib -lhip_hcc -lhip_device "; } } diff --git a/include/hip/hcc_detail/hip_runtime.h b/include/hip/hcc_detail/hip_runtime.h index 44a61e6924..d7c8d3a675 100644 --- a/include/hip/hcc_detail/hip_runtime.h +++ b/include/hip/hcc_detail/hip_runtime.h @@ -588,40 +588,14 @@ __device__ int __hip_move_dpp(int src, int dpp_ctrl, int row_mask, int bank_mask #define hipGridDim_y (hc_get_num_groups(1)) #define hipGridDim_z (hc_get_num_groups(2)) -// loop unrolling -__device__ static inline void* memcpy(void* dst, void* src, size_t size) -{ - uint8_t *dstPtr, *srcPtr; - dstPtr = (uint8_t*)dst; - srcPtr = (uint8_t*)src; - for(uint32_t i=0;i SIZE_OF_HEAP) + { + return (void*)nullptr; + } + uint32_t totalThreads = hipBlockDim_x * hipGridDim_x * hipBlockDim_y * hipGridDim_y * hipBlockDim_z * hipGridDim_z; + uint32_t currentWorkItem = hipThreadIdx_x + hipBlockDim_x * hipBlockIdx_x; + + uint32_t numHeapsPerWorkItem = NUM_PAGES / totalThreads; + uint32_t heapSizePerWorkItem = SIZE_OF_HEAP / totalThreads; + + uint32_t stride = size / SIZE_OF_PAGE; + uint32_t start = numHeapsPerWorkItem * currentWorkItem; + + uint32_t k=0; + + while(gpuFlags[k] > 0) + { + k++; + } + + for(uint32_t i=0;i g_lastShortTid(1); std::vector g_dbStartTriggers; std::vector g_dbStopTriggers; - - -/* - Implementation of malloc and free device functions. - - This is the best place to put them because the device - global variables need to be initialized at the start. -*/ - -#define NUM_PAGES_PER_THREAD 16 -#define SIZE_OF_PAGE 64 -#define NUM_THREADS_PER_CU 64 -#define NUM_CUS_PER_GPU 64 -#define NUM_PAGES NUM_PAGES_PER_THREAD * NUM_THREADS_PER_CU * NUM_CUS_PER_GPU -#define SIZE_MALLOC NUM_PAGES * SIZE_OF_PAGE -#define SIZE_OF_HEAP SIZE_MALLOC - -size_t g_malloc_heap_size = SIZE_OF_HEAP; - -__attribute__((address_space(1))) char gpuHeap[SIZE_OF_HEAP]; -__attribute__((address_space(1))) uint32_t gpuFlags[NUM_PAGES]; - -__device__ void *__hip_hc_malloc(size_t size) -{ - char *heap = (char*)gpuHeap; - if(size > SIZE_OF_HEAP) - { - return (void*)nullptr; - } - uint32_t totalThreads = hipBlockDim_x * hipGridDim_x * hipBlockDim_y * hipGridDim_y * hipBlockDim_z * hipGridDim_z; - uint32_t currentWorkItem = hipThreadIdx_x + hipBlockDim_x * hipBlockIdx_x; - - uint32_t numHeapsPerWorkItem = NUM_PAGES / totalThreads; - uint32_t heapSizePerWorkItem = SIZE_OF_HEAP / totalThreads; - - uint32_t stride = size / SIZE_OF_PAGE; - uint32_t start = numHeapsPerWorkItem * currentWorkItem; - - uint32_t k=0; - - while(gpuFlags[k] > 0) - { - k++; - } - - for(uint32_t i=0;i