diff --git a/rocclr/CMakeLists.txt b/rocclr/CMakeLists.txt index 48824f86bf..1ba68e03d3 100644 --- a/rocclr/CMakeLists.txt +++ b/rocclr/CMakeLists.txt @@ -10,6 +10,9 @@ project(OpenCL-ROCm) set(LLVM_INCLUDE_TESTS CACHE BOOL OFF) set(LLVM_TARGETS_TO_BUILD "AMDGPU" "X86" CACHE STRING "") set(LLVM_ENABLE_PROJECTS CACHE STRING "clang") +set(LLVM_BUILD_GLOBAL_ISEL CACHE BOOL OFF) +set(CLANG_ENABLE_ARCMT CACHE BOOL OFF) +set(CLANG_ENABLE_STATIC_ANALYZER CACHE BOOL OFF) add_subdirectory(compiler/llvm) @@ -27,9 +30,22 @@ include_directories(${CMAKE_BINARY_DIR}/compiler/llvm/tools/clang/include) include_directories(${CMAKE_SOURCE_DIR}/compiler/llvm/lib/Target/AMDGPU) include_directories(${CMAKE_BINARY_DIR}/compiler/llvm/lib/Target/AMDGPU) +set(AMD_EXTENSIONS CACHE BOOL OFF) +set(BUILD_HSAILASM CACHE BOOL OFF) +add_subdirectory(compiler/sc/HSAIL/hsail-tools) + add_subdirectory(compiler/driver) set(CMAKE_C_COMPILER "${PROJECT_BINARY_DIR}/compiler/llvm/bin/clang") set(BUILD_HC_LIB CACHE BOOL OFF) set(ROCM_DEVICELIB_INCLUDE_TESTS CACHE BOOL OFF) -add_subdirectory(library/amdgcn) \ No newline at end of file +add_subdirectory(library/amdgcn) + +add_subdirectory(compiler/lib/loaders/elf/utils/libelf) + +add_subdirectory(tools/bc2h) +add_dependencies(bc2h clang) # FIXME: remove +add_dependencies(oclelf clang) # FIXME: remove + +add_subdirectory(runtime) +add_subdirectory(api/opencl/amdocl) diff --git a/rocclr/compiler/lib/loaders/elf/utils/libelf/CMakeLists.txt b/rocclr/compiler/lib/loaders/elf/utils/libelf/CMakeLists.txt new file mode 100644 index 0000000000..8a6d3e6ef1 --- /dev/null +++ b/rocclr/compiler/lib/loaders/elf/utils/libelf/CMakeLists.txt @@ -0,0 +1,16 @@ +set(CMAKE_CXX_FLAGS "-std=c++11") + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common/win32/sys) + +add_definitions(-DBSD_LIBELF -DUSE_MEMFILE) + +file(GLOB sources + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/*.h +) +add_library(oclelf STATIC ${sources}) +set_target_properties(oclelf PROPERTIES POSITION_INDEPENDENT_CODE ON) + diff --git a/rocclr/runtime/CMakeLists.txt b/rocclr/runtime/CMakeLists.txt new file mode 100644 index 0000000000..2827bbd15b --- /dev/null +++ b/rocclr/runtime/CMakeLists.txt @@ -0,0 +1,54 @@ +set(CMAKE_CXX_FLAGS "-std=c++11") + +add_definitions(-DLINUX -D__x86_64__ -D__AMD64__ -DUNIX_OS -DqLittleEndian -DAMD_LIBELF -DOPENCL_MAJOR=2 -DOPENCL_MINOR=0 -DWITH_AQL -DWITH_ONLINE_COMPILER -DATI_OS_LINUX -DATI_ARCH_X86 -DLITTLEENDIAN_CPU -DATI_BITS_64 -DATI_COMP_GCC -DWITH_HSA_DEVICE -DWITH_TARGET_AMDGCN -DOPENCL_EXPORTS -DCL_USE_DEPRECATED_OPENCL_1_1_APIS -DCL_USE_DEPRECATED_OPENCL_1_2_APIS -DCL_USE_DEPRECATED_OPENCL_2_0_APIS -DWITH_VERSION_0_8=1 -DVEGA10_ONLY=false -DWITH_LIGHTNING_COMPILER -DBSD_LIBELF) + +include_directories(/opt/rocm/include/hsa) + +include_directories(${CMAKE_SOURCE_DIR}/runtime) +include_directories(${CMAKE_SOURCE_DIR}/api/opencl) +include_directories(${CMAKE_SOURCE_DIR}/api/opencl/khronos/headers) +include_directories(${CMAKE_SOURCE_DIR}/api/opencl/khronos/headers/opencl2.0) +include_directories(${CMAKE_SOURCE_DIR}/compiler/llvm/lib/Target/AMDGPU/MCTargetDesc) +include_directories(${CMAKE_SOURCE_DIR}/compiler/driver/src) +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib) +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib/include) +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib/backends/common) +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib/loaders/elf/utils/common) +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib/loaders/elf/utils/libelf) +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib/loaders) +include_directories(${CMAKE_SOURCE_DIR}/compiler/tools) + +add_subdirectory(device/rocm) + +add_library(oclruntime OBJECT + thread/thread.cpp + thread/monitor.cpp + thread/semaphore.cpp + utils/flags.cpp + utils/debug.cpp + device/appprofile.cpp + device/device.cpp + device/hwdebug.cpp + device/blitcl.cpp + device/blit.cpp + platform/kernel.cpp + platform/context.cpp + platform/command.cpp + platform/ndrange.cpp + platform/runtime.cpp + platform/object.cpp + platform/memory.cpp + platform/program.cpp + platform/commandqueue.cpp + platform/agent.cpp + os/os_win32.cpp + os/alloc.cpp + os/os.cpp + os/os_posix.cpp + ${CMAKE_SOURCE_DIR}/compiler/lib/utils/options.cpp + ${CMAKE_SOURCE_DIR}/compiler/lib/loaders/elf/elf.cpp + ${CMAKE_SOURCE_DIR}/compiler/lib/loaders/elf/elf_utils.cpp + ${CMAKE_SOURCE_DIR}/compiler/tools/caching/cache.cpp +) +set_target_properties(oclruntime PROPERTIES POSITION_INDEPENDENT_CODE ON) + diff --git a/rocclr/runtime/device/appprofile.cpp b/rocclr/runtime/device/appprofile.cpp index 5fd61619fe..868c770450 100644 --- a/rocclr/runtime/device/appprofile.cpp +++ b/rocclr/runtime/device/appprofile.cpp @@ -6,10 +6,21 @@ #include "os/os.hpp" #include "utils/flags.hpp" #include "appprofile.hpp" +#if !defined(WITH_LIGHTNING_COMPILER) #include "adl.h" +#endif // !defined(WITH_LIGHTNING_COMPILER) #include #include +#if defined(WITH_LIGHTNING_COMPILER) +typedef void* ADLApplicationProfile; +int SearchProfileOfAnApplication(const wchar_t* fileName, ADLApplicationProfile** lppProfile) +{ + return 0; +} +#define __stdcall +#endif // defined(WITH_LIGHTNING_COMPILER) + #ifdef BRAHMA extern int SearchProfileOfAnApplication(const wchar_t* fileName, ADLApplicationProfile** lppProfile); @@ -21,7 +32,7 @@ static void* __stdcall adlMallocCallback(int n) { return malloc(n); } namespace amd { -#ifndef BRAHMA +#if !defined(BRAHMA) && !defined(WITH_LIGHTNING_COMPILER) class ADL { public: @@ -157,7 +168,7 @@ bool AppProfile::init() { bool AppProfile::ParseApplicationProfile() { ADLApplicationProfile* pProfile = NULL; -#ifndef BRAHMA +#if !defined(BRAHMA) && !defined(WITH_LIGHTNING_COMPILER) amd::ADL* adl = new amd::ADL; if ((adl == NULL) || !adl->init()) { @@ -183,6 +194,7 @@ bool AppProfile::ParseApplicationProfile() { return false; } +#if !defined(WITH_LIGHTNING_COMPILER) PropertyRecord* firstProperty = pProfile->record; uint32_t valueOffset = 0; const int BUFSIZE = 1024; @@ -224,6 +236,7 @@ bool AppProfile::ParseApplicationProfile() { } free(pProfile); +#endif // !defined(WITH_LIGHTNING_COMPILER) return true; } } diff --git a/rocclr/runtime/device/rocm/CMakeLists.txt b/rocclr/runtime/device/rocm/CMakeLists.txt new file mode 100644 index 0000000000..9579b3ea97 --- /dev/null +++ b/rocclr/runtime/device/rocm/CMakeLists.txt @@ -0,0 +1,130 @@ +set(headers + irif.amdgcn.inc + ockl.amdgcn.inc + ocml.amdgcn.inc + opencl.amdgcn.inc + oclc_unsafe_math_on.amdgcn.inc + oclc_unsafe_math_off.amdgcn.inc + oclc_finite_only_on.amdgcn.inc + oclc_finite_only_off.amdgcn.inc + oclc_correctly_rounded_sqrt_on.amdgcn.inc + oclc_correctly_rounded_sqrt_off.amdgcn.inc + oclc_daz_opt_off.amdgcn.inc + oclc_daz_opt_on.amdgcn.inc + oclc_isa_version_700.amdgcn.inc + oclc_isa_version_701.amdgcn.inc + oclc_isa_version_800.amdgcn.inc + oclc_isa_version_801.amdgcn.inc + oclc_isa_version_802.amdgcn.inc + oclc_isa_version_803.amdgcn.inc + oclc_isa_version_804.amdgcn.inc + oclc_isa_version_810.amdgcn.inc + oclc_isa_version_900.amdgcn.inc + oclc_isa_version_901.amdgcn.inc +) + + +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib/loaders/elf/utils/common) +include_directories(${CMAKE_SOURCE_DIR}/compiler/lib/loaders/elf/utils/libelf) +include_directories(${CMAKE_SOURCE_DIR}/compiler/sc/HSAIL/include) +include_directories(${CMAKE_SOURCE_DIR}/compiler/sc/HSAIL/hsail-tools/libHSAIL) +include_directories(${CMAKE_BINARY_DIR}/compiler/sc/HSAIL/hsail-tools/libHSAIL/generated) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + + +add_library(oclrocm OBJECT + rocprintf.cpp + rocprogram.cpp + rocmemory.cpp + rocdevice.cpp + roccompiler.cpp + rocblit.cpp + rockernel.cpp + rocvirtual.cpp + rocglinterop.cpp + rocappprofile.cpp + rocsettings.cpp + libraries.amdgcn.inc + opencl1.2-c.amdgcn.inc + opencl2.0-c.amdgcn.inc + ${headers} +) +set_target_properties(oclrocm PROPERTIES POSITION_INDEPENDENT_CODE ON) + +add_dependencies(oclrocm libhsail-includes) + +foreach(header ${headers}) + string(REGEX REPLACE "([^._-]*)(.*).amdgcn.inc" "${CMAKE_BINARY_DIR}/library/amdgcn/\\1/\\1\\2.lib.bc" bclib ${header}) + string(REGEX REPLACE ".inc$" "" target ${header}) + string(REGEX REPLACE "[\\.-]" "_" symbol ${target}) + string(REGEX REPLACE ".amdgcn.inc$" "" lib_bc ${header}) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.inc + COMMAND bc2h ${bclib} ${CMAKE_CURRENT_BINARY_DIR}/${target}.inc ${symbol} + DEPENDS ${bclib} ${lib_bc}_lib_bc + COMMENT "Generating ${target}.inc" + ) + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_CURRENT_BINARY_DIR}/${target}.inc) + + add_custom_target(${target}.inc ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${target}.inc) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${target}.inc PROPERTIES HEADER_FILE_ONLY TRUE) + + string(REGEX REPLACE ".amdgcn.inc$" "" lib_bc ${header}) + #add_dependencies(${target}.inc ${lib_bc}_lib_bc) +endforeach() + +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/libraries.amdgcn.inc "// Automatically generated file; DO NOT EDIT.\n") + +foreach(file ${headers}) + string(REGEX REPLACE "(.*).inc$" "#include \"\\1.inc\"" line ${file}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libraries.amdgcn.inc "${line}\n") +endforeach() + +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libraries.amdgcn.inc + "static inline std::pair\nget_oclc_isa_version(uint gfxip)\n{\nswitch (gfxip) {\n") +foreach(file ${headers}) + string(REGEX MATCH "oclc_isa_version_(.*).amdgcn.inc" isa ${file}) + if (NOT "${isa}" STREQUAL "") + string(REGEX REPLACE "oclc_isa_version_(.*).amdgcn.inc" "\\1" gfxip ${file}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libraries.amdgcn.inc + "case ${gfxip}: return std::make_pair(oclc_isa_version_${gfxip}_amdgcn, oclc_isa_version_${gfxip}_amdgcn_size); break;\n") + endif() +endforeach() +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libraries.amdgcn.inc + "default: return std::make_pair((const void*)0,(size_t)0);\n}\n}\n") + +foreach(file ${headers}) + string(REGEX MATCH "oclc_(.*)_on.amdgcn.inc" is_control ${file}) + if (NOT "${is_control}" STREQUAL "") + string(REGEX REPLACE "oclc_(.*)_on.amdgcn.inc" "\\1" function ${file}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/libraries.amdgcn.inc + "static inline std::pair get_oclc_${function}(bool on)\n{ return std::make_pair(" + "(const char*)(on ? oclc_${function}_on_amdgcn : oclc_${function}_off_amdgcn)," + "on ? oclc_${function}_on_amdgcn_size : oclc_${function}_off_amdgcn_size);}\n") + endif() +endforeach() + +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.amdgcn.pch + COMMAND clang -cc1 -x cl-header -triple amdgcn-amd-amdhsa-opencl -Werror -O3 -Dcl_khr_fp64 -Dcl_khr_fp16 -DNDEBUG -cl-std=CL1.2 -emit-pch -o ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.amdgcn.pch < ${CMAKE_SOURCE_DIR}/compiler/llvm/tools/clang/lib/Headers/opencl-c.h + DEPENDS clang ${CMAKE_SOURCE_DIR}/compiler/llvm/tools/clang/lib/Headers/opencl-c.h + COMMENT "Generating opencl1.2-c.amdgcn.pch" +) +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.amdgcn.inc + COMMAND bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.amdgcn.pch ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.amdgcn.inc opencl1_2_c_amdgcn + DEPENDS bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl1.2-c.amdgcn.pch + COMMENT "Generating opencl1.2-c.amdgcn.inc" +) +set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.inc ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.pch) + +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.pch + COMMAND clang -cc1 -x cl-header -triple amdgcn-amd-amdhsa-opencl -Werror -O3 -Dcl_khr_fp64 -Dcl_khr_fp16 -DNDEBUG -cl-std=CL2.0 -emit-pch -o ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.pch < ${CMAKE_SOURCE_DIR}/compiler/llvm/tools/clang/lib/Headers/opencl-c.h + DEPENDS clang ${CMAKE_SOURCE_DIR}/compiler/llvm/tools/clang/lib/Headers/opencl-c.h + COMMENT "Generating opencl2.0-c.amdgcn.pch" +) +add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.inc + COMMAND bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.pch ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.inc opencl2_0_c_amdgcn + DEPENDS bc2h ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.pch + COMMENT "Generating opencl2.0-c.amdgcn.inc" +) +set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.inc ${CMAKE_CURRENT_BINARY_DIR}/opencl2.0-c.amdgcn.pch) +