From 474bf0effc75bb4068f78103e52dc02b8d1340b6 Mon Sep 17 00:00:00 2001 From: Rahul Garg Date: Fri, 2 Aug 2019 11:51:34 +0530 Subject: [PATCH 1/9] Fix missing logstatus in hipFuncGetAttributes --- src/hip_module.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hip_module.cpp b/src/hip_module.cpp index 9e972da246..496356ef6e 100644 --- a/src/hip_module.cpp +++ b/src/hip_module.cpp @@ -788,8 +788,8 @@ hipError_t hipFuncGetAttributes(hipFuncAttributes* attr, const void* func) HIP_INIT_API(hipFuncGetAttributes, attr, func); using namespace hip_impl; - if (!attr) return hipErrorInvalidValue; - if (!func) return hipErrorInvalidDeviceFunction; + if (!attr) return ihipLogStatus(hipErrorInvalidValue); + if (!func) return ihipLogStatus(hipErrorInvalidDeviceFunction); auto agent = this_agent(); auto kd = get_program_state().kernel_descriptor(reinterpret_cast(func), agent); From a85b0fe68e3d9f5ff8e828d9ea86b2162198fc48 Mon Sep 17 00:00:00 2001 From: Alex Voicu Date: Fri, 2 Aug 2019 12:30:03 +0300 Subject: [PATCH 2/9] This difference makes absolutely no sense. --- include/hip/hcc_detail/device_functions.h | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/include/hip/hcc_detail/device_functions.h b/include/hip/hcc_detail/device_functions.h index d275bb1820..465655680f 100644 --- a/include/hip/hcc_detail/device_functions.h +++ b/include/hip/hcc_detail/device_functions.h @@ -736,21 +736,13 @@ int __any(int predicate) { __device__ inline unsigned long long int __ballot(int predicate) { -#if defined(__HCC__) - return __llvm_amdgcn_icmp_i32(predicate, 0, ICMP_NE); -#else - return __builtin_amdgcn_uicmp(predicate, 0, ICMP_NE); -#endif + return __builtin_amdgcn_uicmp(predicate, 0, ICMP_NE); } __device__ inline unsigned long long int __ballot64(int predicate) { -#if defined(__HCC__) - return __llvm_amdgcn_icmp_i32(predicate, 0, ICMP_NE); -#else - return __builtin_amdgcn_uicmp(predicate, 0, ICMP_NE); -#endif + return __builtin_amdgcn_uicmp(predicate, 0, ICMP_NE); } // hip.amdgcn.bc - lanemask From aaec4f73a61667a9922805982c1150e6efd4be5f Mon Sep 17 00:00:00 2001 From: wkwchau Date: Fri, 2 Aug 2019 06:00:25 -0400 Subject: [PATCH 3/9] Added CooperativeLaunch and CooperativeMultiDeviceLaunch flag and property for hipDeviceGetAttribute() and hipGetDeviceProperties() (#1247) --- src/hip_device.cpp | 6 ++++++ src/hip_hcc.cpp | 4 ++++ tests/src/runtimeApi/device/hipGetDeviceAttribute.cpp | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/src/hip_device.cpp b/src/hip_device.cpp index 1c0e5c9109..31b3997def 100644 --- a/src/hip_device.cpp +++ b/src/hip_device.cpp @@ -305,6 +305,12 @@ hipError_t ihipDeviceGetAttribute(int* pi, hipDeviceAttribute_t attr, int device *hdp = prop->hdpRegFlushCntl; } break; + case hipDeviceAttributeCooperativeLaunch: + *pi = prop->cooperativeLaunch; + break; + case hipDeviceAttributeCooperativeMultiDeviceLaunch: + *pi = prop->cooperativeMultiDeviceLaunch; + break; default: e = hipErrorInvalidValue; break; diff --git a/src/hip_hcc.cpp b/src/hip_hcc.cpp index f3d6eae6b7..ff19227b57 100644 --- a/src/hip_hcc.cpp +++ b/src/hip_hcc.cpp @@ -904,6 +904,10 @@ hipError_t ihipDevice_t::initProperties(hipDeviceProp_t* prop) { prop->integrated = 1; } + // Enable the cooperative group for gfx9+ + prop->cooperativeLaunch = (prop->gcnArch < 900) ? 0 : 1; + prop->cooperativeMultiDeviceLaunch = (prop->gcnArch < 900) ? 0 : 1; + err = hsa_agent_get_info(_hsaAgent, (hsa_agent_info_t)HSA_EXT_AGENT_INFO_IMAGE_1D_MAX_ELEMENTS, &prop->maxTexture1D); DeviceErrorCheck(err); diff --git a/tests/src/runtimeApi/device/hipGetDeviceAttribute.cpp b/tests/src/runtimeApi/device/hipGetDeviceAttribute.cpp index 27947339cb..c69eb93a10 100644 --- a/tests/src/runtimeApi/device/hipGetDeviceAttribute.cpp +++ b/tests/src/runtimeApi/device/hipGetDeviceAttribute.cpp @@ -132,6 +132,10 @@ int main(int argc, char* argv[]) { CHECK(test_hipDeviceGetAttribute(deviceId, hipDeviceAttributeMaxTexture3DWidth, props.maxTexture3D[0])); CHECK(test_hipDeviceGetAttribute(deviceId, hipDeviceAttributeMaxTexture3DHeight, props.maxTexture3D[1])); CHECK(test_hipDeviceGetAttribute(deviceId, hipDeviceAttributeMaxTexture3DDepth, props.maxTexture3D[2])); + + CHECK(test_hipDeviceGetAttribute(deviceId, hipDeviceAttributeCooperativeLaunch, props.cooperativeLaunch)); + CHECK(test_hipDeviceGetAttribute(deviceId, hipDeviceAttributeCooperativeMultiDeviceLaunch, props.cooperativeMultiDeviceLaunch)); + #ifndef __HIP_PLATFORM_NVCC__ CHECK(test_hipDeviceGetHdpAddress(deviceId, hipDeviceAttributeHdpMemFlushCntl, props.hdpMemFlushCntl)); CHECK(test_hipDeviceGetHdpAddress(deviceId, hipDeviceAttributeHdpRegFlushCntl, props.hdpRegFlushCntl)); From 25075729f9af19a4fc52dfd92ee88f77fa70004c Mon Sep 17 00:00:00 2001 From: Evgeny Mankov Date: Fri, 2 Aug 2019 16:46:45 +0300 Subject: [PATCH 4/9] [HIPIFY][fix][#211] Taking into account include guard controlling macro ...while including HIP main header file, which is inserted now after #indef controlling macro, or after #pragma once, if it's occurred earlier. + Add a couple of unit tests. ToDo: Check backward compatibility on older clang versions. --- hipify-clang/src/HipifyAction.cpp | 47 ++++++++++++++++--- hipify-clang/src/HipifyAction.h | 4 ++ .../unit_tests/headers/headers_test_10.cu | 14 ++++++ .../unit_tests/headers/headers_test_11.cu | 14 ++++++ 4 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 tests/hipify-clang/unit_tests/headers/headers_test_10.cu create mode 100644 tests/hipify-clang/unit_tests/headers/headers_test_11.cu diff --git a/hipify-clang/src/HipifyAction.cpp b/hipify-clang/src/HipifyAction.cpp index d6fe9b88e5..52ba2eeaaf 100644 --- a/hipify-clang/src/HipifyAction.cpp +++ b/hipify-clang/src/HipifyAction.cpp @@ -25,6 +25,7 @@ THE SOFTWARE. #include "clang/Frontend/CompilerInstance.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/Lex/HeaderSearch.h" #include "LLVMCompat.h" #include "CUDA2HIP.h" #include "StringUtils.h" @@ -398,20 +399,50 @@ std::unique_ptr HipifyAction::CreateASTConsumer(clang::Compi return Finder->newASTConsumer(); } +void HipifyAction::Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDefinition &MD) { + clang::SourceManager& SM = getCompilerInstance().getSourceManager(); + if (!SM.isWrittenInMainFile(Loc)) { + return; + } + StringRef Text(SM.getCharacterData(MacroNameTok.getLocation()), MacroNameTok.getLength()); + Ifndefs.insert(std::make_pair(Text.str(), MacroNameTok.getEndLoc())); +} + void HipifyAction::EndSourceFileAction() { // Insert the hip header, if we didn't already do it by accident during substitution. if (!insertedRuntimeHeader) { // It's not sufficient to just replace CUDA headers with hip ones, because numerous CUDA headers are // implicitly included by the compiler. Instead, we _delete_ CUDA headers, and unconditionally insert // one copy of the hip include into every file. + bool placeForIncludeCalculated = false; + clang::SourceLocation sl, controllingMacroLoc; clang::SourceManager& SM = getCompilerInstance().getSourceManager(); - clang::SourceLocation sl; + clang::Preprocessor& PP = getCompilerInstance().getPreprocessor(); + clang::HeaderSearch& HS = PP.getHeaderSearchInfo(); + clang::ExternalPreprocessorSource* EPL = HS.getExternalLookup(); + const clang::FileEntry* FE = SM.getFileEntryForID(SM.getMainFileID()); + const clang::IdentifierInfo* controllingMacro = HS.getFileInfo(FE).getControllingMacro(EPL); + if (controllingMacro) { + auto found = Ifndefs.find(controllingMacro->getName().str()); + if (found != Ifndefs.end()) { + controllingMacroLoc = found->second; + placeForIncludeCalculated = true; + } + } if (pragmaOnce) { - sl = pragmaOnceLoc; - } else if (firstHeader) { - sl = firstHeaderLoc; - } else { - sl = SM.getLocForStartOfFile(SM.getMainFileID()); + if (placeForIncludeCalculated) { + sl = pragmaOnceLoc < controllingMacroLoc ? pragmaOnceLoc : controllingMacroLoc; + } else { + sl = pragmaOnceLoc; + } + placeForIncludeCalculated = true; + } + if (!placeForIncludeCalculated) { + if (firstHeader) { + sl = firstHeaderLoc; + } else { + sl = SM.getLocForStartOfFile(SM.getMainFileID()); + } } clang::FullSourceLoc fullSL(sl, SM); ct::Replacement Rep(SM, sl, 0, "\n#include \n"); @@ -445,6 +476,10 @@ public: void PragmaDirective(clang::SourceLocation Loc, clang::PragmaIntroducerKind Introducer) override { hipifyAction.PragmaDirective(Loc, Introducer); } + + void Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDefinition &MD) override { + hipifyAction.Ifndef(Loc, MacroNameTok, MD); + } }; } diff --git a/hipify-clang/src/HipifyAction.h b/hipify-clang/src/HipifyAction.h index cc7f3799ba..adafba2df9 100644 --- a/hipify-clang/src/HipifyAction.h +++ b/hipify-clang/src/HipifyAction.h @@ -40,6 +40,7 @@ class HipifyAction : public clang::ASTFrontendAction, public clang::ast_matchers::MatchFinder::MatchCallback { private: ct::Replacements* replacements; + std::map Ifndefs; std::unique_ptr Finder; // CUDA implicitly adds its runtime header. We rewrite explicitly-provided CUDA includes with equivalent // ones, and track - using this flag - if the result led to us including the hip runtime header. If it did @@ -81,6 +82,9 @@ public: const clang::Module *imported); // Called by the preprocessor for each pragma directive during the non-raw lexing pass. void PragmaDirective(clang::SourceLocation Loc, clang::PragmaIntroducerKind Introducer); + // Called by the preprocessor for each ifndef directive during the non-raw lexing pass. + // Found ifndef will be used in EndSourceFileAction() for catching include guard controlling macro. + void Ifndef(clang::SourceLocation Loc, const clang::Token &MacroNameTok, const clang::MacroDefinition &MD); protected: // Add a Replacement for the current file. These will all be applied after executing the FrontendAction. diff --git a/tests/hipify-clang/unit_tests/headers/headers_test_10.cu b/tests/hipify-clang/unit_tests/headers/headers_test_10.cu new file mode 100644 index 0000000000..1c2db50e3b --- /dev/null +++ b/tests/hipify-clang/unit_tests/headers/headers_test_10.cu @@ -0,0 +1,14 @@ +// RUN: %run_test hipify "%s" "%t" %hipify_args %clang_args + +// Checks that HIP header file is included after #pragma once, +// which goes before include guard controlling macro. +// CHECK: #pragma once +// CHECK-NEXT: #include +#pragma once +#ifndef HEADERS_TEST_10_H +// CHECK: #ifndef HEADERS_TEST_10_H +// CHECK-NOT: #include +#define HEADERS_TEST_10_H +#include +static int counter = 0; +#endif // HEADERS_TEST_10_H diff --git a/tests/hipify-clang/unit_tests/headers/headers_test_11.cu b/tests/hipify-clang/unit_tests/headers/headers_test_11.cu new file mode 100644 index 0000000000..7c59dbe4a7 --- /dev/null +++ b/tests/hipify-clang/unit_tests/headers/headers_test_11.cu @@ -0,0 +1,14 @@ +// RUN: %run_test hipify "%s" "%t" %hipify_args %clang_args + +// Checks that HIP header file is included after include guard controlling macro, +// which goes before #pragma once. +// CHECK: #ifndef HEADERS_TEST_10_H +// CHECK-NEXT: #include +#ifndef HEADERS_TEST_10_H +// CHECK: #pragma once +#pragma once +// CHECK-NOT: #include +#define HEADERS_TEST_10_H +#include +static int counter = 0; +#endif // HEADERS_TEST_10_H From 0782e79478b35df550fa07728eb50b6648a9a316 Mon Sep 17 00:00:00 2001 From: Maneesh Gupta Date: Mon, 5 Aug 2019 13:32:46 +0530 Subject: [PATCH 5/9] Partial revert of 'Add HSA_PATH to hip_Includes in cmake and hipconfig (#1260)' Change-Id: I35173f2defe446c0d1e5511e582e9c8722841381 --- hip-config-clang.cmake.in | 15 +-------------- hip-config-hcc.cmake.in | 15 +-------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/hip-config-clang.cmake.in b/hip-config-clang.cmake.in index 199dca774a..9680b2ff8e 100644 --- a/hip-config-clang.cmake.in +++ b/hip-config-clang.cmake.in @@ -1,16 +1,4 @@ @PACKAGE_INIT@ -if(NOT DEFINED HSA_PATH) - if(NOT DEFINED ENV{HSA_PATH}) - set(HSA_PATH "/opt/rocm/hsa" CACHE PATH "Path to which HSA runtime has been installed") - else() - set(HSA_PATH $ENV{HSA_PATH} CACHE PATH "Path to which HSA runtime has been installed") - endif() -endif() -if(IS_ABSOLUTE ${HSA_PATH} AND EXISTS ${HSA_PATH} AND IS_DIRECTORY ${HSA_PATH}) - message(STATUS "Looking for HSA runtime in: " ${HSA_PATH}) -else() - message(FATAL_ERROR "Don't know where to find HSA runtime. Please specify absolute path using -DHSA_PATH") -endif() include(CMakeFindDependencyMacro OPTIONAL RESULT_VARIABLE _CMakeFindDependencyMacro_FOUND) if (NOT _CMakeFindDependencyMacro_FOUND) @@ -55,8 +43,7 @@ set(HIP_COMPILER "@HIP_COMPILER@") set(HIP_RUNTIME "@HIP_RUNTIME@") set_and_check( hip_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@" ) -set_and_check( HSA_INCLUDE_PATH "${HSA_PATH}/include" ) -set( hip_INCLUDE_DIRS "${hip_INCLUDE_DIR}" "${HSA_INCLUDE_PATH}" ) +set_and_check( hip_INCLUDE_DIRS "${hip_INCLUDE_DIR}" ) set_and_check( hip_LIB_INSTALL_DIR "@PACKAGE_LIB_INSTALL_DIR@" ) set_and_check( hip_BIN_INSTALL_DIR "@PACKAGE_BIN_INSTALL_DIR@" ) diff --git a/hip-config-hcc.cmake.in b/hip-config-hcc.cmake.in index b385f5ea8e..c0ffc6e2af 100644 --- a/hip-config-hcc.cmake.in +++ b/hip-config-hcc.cmake.in @@ -1,16 +1,4 @@ @PACKAGE_INIT@ -if(NOT DEFINED HSA_PATH) - if(NOT DEFINED ENV{HSA_PATH}) - set(HSA_PATH "/opt/rocm/hsa" CACHE PATH "Path to which HSA runtime has been installed") - else() - set(HSA_PATH $ENV{HSA_PATH} CACHE PATH "Path to which HSA runtime has been installed") - endif() -endif() -if(IS_ABSOLUTE ${HSA_PATH} AND EXISTS ${HSA_PATH} AND IS_DIRECTORY ${HSA_PATH}) - message(STATUS "Looking for HSA runtime in: " ${HSA_PATH}) -else() - message(FATAL_ERROR "Don't know where to find HSA runtime. Please specify absolute path using -DHSA_PATH") -endif() include(CMakeFindDependencyMacro OPTIONAL RESULT_VARIABLE _CMakeFindDependencyMacro_FOUND) if (NOT _CMakeFindDependencyMacro_FOUND) @@ -55,8 +43,7 @@ set(HIP_COMPILER "@HIP_COMPILER@") set(HIP_RUNTIME "@HIP_RUNTIME@") set_and_check( hip_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@" ) -set_and_check( HSA_INCLUDE_PATH "${HSA_PATH}/include" ) -set( hip_INCLUDE_DIRS "${hip_INCLUDE_DIR}" "${HSA_INCLUDE_PATH}" ) +set_and_check( hip_INCLUDE_DIRS "${hip_INCLUDE_DIR}" ) set_and_check( hip_LIB_INSTALL_DIR "@PACKAGE_LIB_INSTALL_DIR@" ) set_and_check( hip_BIN_INSTALL_DIR "@PACKAGE_BIN_INSTALL_DIR@" ) From 1eb3dbf0658563103239835a3c00406057d4978a Mon Sep 17 00:00:00 2001 From: Jeff Daily Date: Mon, 5 Aug 2019 02:51:02 -0700 Subject: [PATCH 6/9] consolidate thread local storage (#915) * all thread local access now through single struct * clean up old commented-out code, more use of GET_TLS() * fewer calls to GET_TLS by passing tls as a funtion argument * revert unnecessary change to printf * fix failing tests due to TLS change * fix merge conflicts in ihipOccupancyMaxActiveBlocksPerMultiprocessor --- include/hip/hcc_detail/hip_runtime_api.h | 16 ++-- src/functional_grid_launch.inl | 4 +- src/hip_clang.cpp | 1 + src/hip_context.cpp | 39 +++++----- src/hip_device.cpp | 6 +- src/hip_error.cpp | 6 +- src/hip_hcc.cpp | 57 +++++--------- src/hip_hcc_internal.h | 96 ++++++++++++++++-------- src/hip_memory.cpp | 12 +-- src/hip_module.cpp | 44 +++++------ src/hip_peer.cpp | 12 +-- src/hip_stream.cpp | 10 +-- src/hip_texture.cpp | 24 +++--- src/macro_based_grid_launch.inl | 3 +- 14 files changed, 172 insertions(+), 158 deletions(-) diff --git a/include/hip/hcc_detail/hip_runtime_api.h b/include/hip/hcc_detail/hip_runtime_api.h index 7e887d1172..755d15d8aa 100644 --- a/include/hip/hcc_detail/hip_runtime_api.h +++ b/include/hip/hcc_detail/hip_runtime_api.h @@ -3007,10 +3007,12 @@ const char* hipKernelNameRef(const hipFunction_t f); #ifdef __cplusplus +class TlsData; + hipError_t hipBindTexture(size_t* offset, textureReference* tex, const void* devPtr, const hipChannelFormatDesc* desc, size_t size = UINT_MAX); -hipError_t ihipBindTextureImpl(int dim, enum hipTextureReadMode readMode, size_t* offset, +hipError_t ihipBindTextureImpl(TlsData *tls, int dim, enum hipTextureReadMode readMode, size_t* offset, const void* devPtr, const struct hipChannelFormatDesc* desc, size_t size, textureReference* tex); @@ -3032,7 +3034,7 @@ hipError_t ihipBindTextureImpl(int dim, enum hipTextureReadMode readMode, size_t template hipError_t hipBindTexture(size_t* offset, struct texture& tex, const void* devPtr, const struct hipChannelFormatDesc& desc, size_t size = UINT_MAX) { - return ihipBindTextureImpl(dim, readMode, offset, devPtr, &desc, size, &tex); + return ihipBindTextureImpl(nullptr, dim, readMode, offset, devPtr, &desc, size, &tex); } /* @@ -3052,7 +3054,7 @@ hipError_t hipBindTexture(size_t* offset, struct texture& tex, template hipError_t hipBindTexture(size_t* offset, struct texture& tex, const void* devPtr, size_t size = UINT_MAX) { - return ihipBindTextureImpl(dim, readMode, offset, devPtr, &(tex.channelDesc), size, &tex); + return ihipBindTextureImpl(nullptr, dim, readMode, offset, devPtr, &(tex.channelDesc), size, &tex); } // C API @@ -3082,27 +3084,27 @@ hipError_t hipBindTexture2D(size_t* offset, struct texture& te hipError_t hipBindTextureToArray(textureReference* tex, hipArray_const_t array, const hipChannelFormatDesc* desc); -hipError_t ihipBindTextureToArrayImpl(int dim, enum hipTextureReadMode readMode, +hipError_t ihipBindTextureToArrayImpl(TlsData *tls, int dim, enum hipTextureReadMode readMode, hipArray_const_t array, const struct hipChannelFormatDesc& desc, textureReference* tex); template hipError_t hipBindTextureToArray(struct texture& tex, hipArray_const_t array) { - return ihipBindTextureToArrayImpl(dim, readMode, array, tex.channelDesc, &tex); + return ihipBindTextureToArrayImpl(nullptr, dim, readMode, array, tex.channelDesc, &tex); } template hipError_t hipBindTextureToArray(struct texture& tex, hipArray_const_t array, const struct hipChannelFormatDesc& desc) { - return ihipBindTextureToArrayImpl(dim, readMode, array, desc, &tex); + return ihipBindTextureToArrayImpl(nullptr, dim, readMode, array, desc, &tex); } template inline static hipError_t hipBindTextureToArray(struct texture *tex, hipArray_const_t array, const struct hipChannelFormatDesc* desc) { - return ihipBindTextureToArrayImpl(dim, readMode, array, *desc, tex); + return ihipBindTextureToArrayImpl(nullptr, dim, readMode, array, *desc, tex); } // C API diff --git a/src/functional_grid_launch.inl b/src/functional_grid_launch.inl index 13679dcab3..3c611ed468 100644 --- a/src/functional_grid_launch.inl +++ b/src/functional_grid_launch.inl @@ -47,8 +47,8 @@ namespace hip_impl return *static_cast( stream->locked_getAv()->get_hsa_agent()); } - else if ( - ihipGetTlsDefaultCtx() && ihipGetTlsDefaultCtx()->getDevice()) { + GET_TLS(); + if (ihipGetTlsDefaultCtx() && ihipGetTlsDefaultCtx()->getDevice()) { return ihipGetDevice( ihipGetTlsDefaultCtx()->getDevice()->_deviceId)->_hsaAgent; } diff --git a/src/hip_clang.cpp b/src/hip_clang.cpp index b8beb05400..85dfb09f62 100644 --- a/src/hip_clang.cpp +++ b/src/hip_clang.cpp @@ -177,6 +177,7 @@ hipError_t hipConfigureCall( size_t sharedMem, hipStream_t stream) { + GET_TLS(); auto ctx = ihipGetTlsDefaultCtx(); LockedAccessor_CtxCrit_t crit(ctx->criticalData()); diff --git a/src/hip_context.cpp b/src/hip_context.cpp index e85c406cfc..300877f8b5 100644 --- a/src/hip_context.cpp +++ b/src/hip_context.cpp @@ -29,13 +29,10 @@ THE SOFTWARE. #include "hip_hcc_internal.h" #include "trace_helper.h" -// Stack of contexts -thread_local std::stack tls_ctxStack; -thread_local bool tls_getPrimaryCtx = true; - void ihipCtxStackUpdate() { - if (tls_ctxStack.empty()) { - tls_ctxStack.push(ihipGetTlsDefaultCtx()); + GET_TLS(); + if (tls->ctxStack.empty()) { + tls->ctxStack.push(ihipGetTlsDefaultCtx()); } } @@ -62,8 +59,8 @@ hipError_t hipCtxCreate(hipCtx_t* ctx, unsigned int flags, hipDevice_t device) { auto ictx = new ihipCtx_t(deviceHandle, g_deviceCnt, flags); *ctx = ictx; ihipSetTlsDefaultCtx(*ctx); - tls_ctxStack.push(*ctx); - tls_getPrimaryCtx = false; + tls->ctxStack.push(*ctx); + tls->getPrimaryCtx = false; deviceCrit->addContext(ictx); } @@ -119,7 +116,7 @@ hipError_t hipCtxDestroy(hipCtx_t ctx) { } else { if (currentCtx == ctx) { // need to destroy the ctx associated with calling thread - tls_ctxStack.pop(); + tls->ctxStack.pop(); } { auto deviceHandle = ctx->getWriteableDevice(); @@ -140,12 +137,12 @@ hipError_t hipCtxPopCurrent(hipCtx_t* ctx) { auto deviceHandle = currentCtx->getDevice(); *ctx = currentCtx; - if (!tls_ctxStack.empty()) { - tls_ctxStack.pop(); + if (!tls->ctxStack.empty()) { + tls->ctxStack.pop(); } - if (!tls_ctxStack.empty()) { - currentCtx = tls_ctxStack.top(); + if (!tls->ctxStack.empty()) { + currentCtx = tls->ctxStack.top(); } else { currentCtx = deviceHandle->_primaryCtx; } @@ -159,8 +156,8 @@ hipError_t hipCtxPushCurrent(hipCtx_t ctx) { hipError_t e = hipSuccess; if (ctx != NULL) { // TODO- is this check needed? ihipSetTlsDefaultCtx(ctx); - tls_ctxStack.push(ctx); - tls_getPrimaryCtx = false; + tls->ctxStack.push(ctx); + tls->getPrimaryCtx = false; } else { e = hipErrorInvalidContext; } @@ -170,10 +167,10 @@ hipError_t hipCtxPushCurrent(hipCtx_t ctx) { hipError_t hipCtxGetCurrent(hipCtx_t* ctx) { HIP_INIT_API(hipCtxGetCurrent, ctx); hipError_t e = hipSuccess; - if ((tls_getPrimaryCtx) || tls_ctxStack.empty()) { + if ((tls->getPrimaryCtx) || tls->ctxStack.empty()) { *ctx = ihipGetTlsDefaultCtx(); } else { - *ctx = tls_ctxStack.top(); + *ctx = tls->ctxStack.top(); } return ihipLogStatus(e); } @@ -182,11 +179,11 @@ hipError_t hipCtxSetCurrent(hipCtx_t ctx) { HIP_INIT_API(hipCtxSetCurrent, ctx); hipError_t e = hipSuccess; if (ctx == NULL) { - tls_ctxStack.pop(); + tls->ctxStack.pop(); } else { ihipSetTlsDefaultCtx(ctx); - tls_ctxStack.push(ctx); - tls_getPrimaryCtx = false; + tls->ctxStack.push(ctx); + tls->getPrimaryCtx = false; } return ihipLogStatus(e); } @@ -251,7 +248,7 @@ hipError_t hipCtxGetSharedMemConfig(hipSharedMemConfig* pConfig) { hipError_t hipCtxSynchronize(void) { HIP_INIT_API(hipCtxSynchronize, 1); - return ihipLogStatus(ihipSynchronize()); // TODP Shall check validity of ctx? + return ihipLogStatus(ihipSynchronize(tls)); // TODO Shall check validity of ctx? } hipError_t hipCtxGetFlags(unsigned int* flags) { diff --git a/src/hip_device.cpp b/src/hip_device.cpp index 31b3997def..2d74985b64 100644 --- a/src/hip_device.cpp +++ b/src/hip_device.cpp @@ -136,14 +136,14 @@ hipError_t hipSetDevice(int deviceId) { return ihipLogStatus(hipErrorInvalidDevice); } else { ihipSetTlsDefaultCtx(ihipGetPrimaryCtx(deviceId)); - tls_getPrimaryCtx = true; + tls->getPrimaryCtx = true; return ihipLogStatus(hipSuccess); } } hipError_t hipDeviceSynchronize(void) { HIP_INIT_SPECIAL_API(hipDeviceSynchronize, TRACE_SYNC); - return ihipLogStatus(ihipSynchronize()); + return ihipLogStatus(ihipSynchronize(tls)); } hipError_t hipDeviceReset(void) { @@ -171,7 +171,7 @@ hipError_t hipDeviceReset(void) { } -hipError_t ihipDeviceSetState(void) { +hipError_t ihipDeviceSetState(TlsData *tls) { hipError_t e = hipErrorInvalidContext; auto* ctx = ihipGetTlsDefaultCtx(); diff --git a/src/hip_error.cpp b/src/hip_error.cpp index 6f1184d92f..0f876b4f26 100644 --- a/src/hip_error.cpp +++ b/src/hip_error.cpp @@ -33,8 +33,8 @@ hipError_t hipGetLastError() { HIP_INIT_API(hipGetLastError); // Return last error, but then reset the state: - hipError_t e = ihipLogStatus(tls_lastHipError); - tls_lastHipError = hipSuccess; + hipError_t e = ihipLogStatus(tls->lastHipError); + tls->lastHipError = hipSuccess; return e; } @@ -42,7 +42,7 @@ hipError_t hipPeekAtLastError() { HIP_INIT_API(hipPeekAtLastError); // peek at last error, but don't reset it. - return ihipLogStatus(tls_lastHipError); + return ihipLogStatus(tls->lastHipError); } const char* hipGetErrorName(hipError_t hip_error) { diff --git a/src/hip_hcc.cpp b/src/hip_hcc.cpp index ff19227b57..8c47f54cf6 100644 --- a/src/hip_hcc.cpp +++ b/src/hip_hcc.cpp @@ -139,24 +139,12 @@ std::atomic g_lastShortTid(1); std::vector g_dbStartTriggers; std::vector g_dbStopTriggers; -//================================================================================================= -// Thread-local storage: -//================================================================================================= - -// This is the implicit context used by all HIP commands. -// It can be set by hipSetDevice or by the CTX manipulation commands: -thread_local hipError_t tls_lastHipError = hipSuccess; - - -thread_local TidInfo tls_tidInfo; - - //================================================================================================= // Top-level "free" functions: //================================================================================================= -uint64_t recordApiTrace(std::string* fullStr, const std::string& apiStr) { - auto apiSeqNum = tls_tidInfo.apiSeqNum(); - auto tid = tls_tidInfo.tid(); +uint64_t recordApiTrace(TlsData *tls, std::string* fullStr, const std::string& apiStr) { + auto apiSeqNum = tls->tidInfo.apiSeqNum(); + auto tid = tls->tidInfo.tid(); if ((tid < g_dbStartTriggers.size()) && (apiSeqNum >= g_dbStartTriggers[tid].nextTrigger())) { printf("info: resume profiling at %lu\n", apiSeqNum); @@ -179,7 +167,7 @@ uint64_t recordApiTrace(std::string* fullStr, const std::string& apiStr) { if (COMPILE_HIP_DB && HIP_TRACE_API) { - fprintf(stderr, "%s<c_str(), apiStartTick, + fprintf(stderr, "%s<tidInfo.pid(), fullStr->c_str(), apiStartTick, API_COLOR_END); } @@ -206,32 +194,18 @@ ihipCtx_t* ihipGetPrimaryCtx(unsigned deviceIndex) { return device ? device->getPrimaryCtx() : NULL; }; - -static thread_local ihipCtx_t* tls_defaultCtx = nullptr; -void ihipSetTlsDefaultCtx(ihipCtx_t* ctx) { tls_defaultCtx = ctx; } - - -//--- -// TODO - review the context creation strategy here. Really should be: -// - first "non-device" runtime call creates the context for this thread. Allowed to call -// setDevice first. -// - hipDeviceReset destroys the primary context for device? -// - Then context is created again for next usage. -ihipCtx_t* ihipGetTlsDefaultCtx() { - // Per-thread initialization of the TLS: - if ((tls_defaultCtx == nullptr) && (g_deviceCnt > 0)) { - ihipSetTlsDefaultCtx(ihipGetPrimaryCtx(0)); - } - return tls_defaultCtx; -} - -hipError_t ihipSynchronize(void) { +hipError_t ihipSynchronize(TlsData *tls) { ihipGetTlsDefaultCtx()->locked_waitAllStreams(); // ignores non-blocking streams, this waits // for all activity to finish. return (hipSuccess); } +TlsData* tls_get_ptr() { + static thread_local TlsData data; + return &data; +} + //================================================================================================= // ihipStream_t: //================================================================================================= @@ -1482,7 +1456,7 @@ hipError_t hip_init() { } } -hipError_t ihipStreamSynchronize(hipStream_t stream) { +hipError_t ihipStreamSynchronize(TlsData *tls, hipStream_t stream) { hipError_t e = hipSuccess; if (stream == hipStreamNull) { @@ -1503,7 +1477,8 @@ void ihipStreamCallbackHandler(ihipStreamCallback_t* cb) { // Synchronize stream tprintf(DB_SYNC, "ihipStreamCallbackHandler wait on stream %s\n", ToString(cb->_stream).c_str()); - e = ihipStreamSynchronize(cb->_stream); + GET_TLS(); + e = ihipStreamSynchronize(tls, cb->_stream); // Call registered callback function cb->_callback(cb->_stream, e, cb->_userData); @@ -1518,6 +1493,7 @@ void ihipStreamCallbackHandler(ihipStreamCallback_t* cb) { hipStream_t ihipSyncAndResolveStream(hipStream_t stream, bool lockAcquired) { if (stream == hipStreamNull) { // Submitting to NULL stream, call locked_syncDefaultStream to wait for all other streams: + GET_TLS(); ihipCtx_t* ctx = ihipGetTlsDefaultCtx(); tprintf(DB_SYNC, "ihipSyncAndResolveStream %s wait on default stream\n", ToString(stream).c_str()); @@ -1581,15 +1557,16 @@ void ihipPrintKernelLaunch(const char* kernelName, const grid_launch_parm* lp, const hipStream_t stream) { if ((HIP_TRACE_API & (1 << TRACE_KCMD)) || HIP_PROFILE_API || (COMPILE_HIP_DB & HIP_TRACE_API)) { + GET_TLS(); std::stringstream os; - os << tls_tidInfo.pid() << " " << tls_tidInfo.tid() << "." << tls_tidInfo.apiSeqNum() << " hipLaunchKernel '" + os << tls->tidInfo.pid() << " " << tls->tidInfo.tid() << "." << tls->tidInfo.apiSeqNum() << " hipLaunchKernel '" << kernelName << "'" << " gridDim:" << lp->grid_dim << " groupDim:" << lp->group_dim << " sharedMem:+" << lp->dynamic_group_mem_bytes << " " << *stream; if (COMPILE_HIP_DB && HIP_TRACE_API) { std::string fullStr; - recordApiTrace(&fullStr, os.str()); + recordApiTrace(tls, &fullStr, os.str()); } if (HIP_PROFILE_API == 0x1) { diff --git a/src/hip_hcc_internal.h b/src/hip_hcc_internal.h index 7ab3fa6de1..d276aa9caa 100644 --- a/src/hip_hcc_internal.h +++ b/src/hip_hcc_internal.h @@ -130,10 +130,26 @@ struct ProfTrigger { //--- -// Extern tls -extern thread_local hipError_t tls_lastHipError; -extern thread_local TidInfo tls_tidInfo; -extern thread_local bool tls_getPrimaryCtx; +// Extern TLS +// Use a single struct to hold all TLS data. Attempt to reduce TLS accesses. +struct TlsData { + explicit TlsData() { + lastHipError = hipSuccess; + getPrimaryCtx = true; + defaultCtx = nullptr; + } + + hipError_t lastHipError; + TidInfo tidInfo; + // This is the implicit context used by all HIP commands. + // It can be set by hipSetDevice or by the CTX manipulation commands: + ihipCtx_t* defaultCtx; + // Stack of contexts + std::stack ctxStack; + bool getPrimaryCtx; +}; +TlsData* tls_get_ptr(); +#define GET_TLS() TlsData *tls = tls_get_ptr() extern std::vector g_dbStartTriggers; extern std::vector g_dbStopTriggers; @@ -194,7 +210,7 @@ extern const char* API_COLOR_END; // Compile support for trace markers that are displayed on CodeXL GUI at start/stop of each function // boundary. // TODO - currently we print the trace message at the beginning. if we waited, we could also -// tls_tidInfo return codes, and any values returned through ptr-to-args (ie the pointers allocated +// tls->tidInfo return codes, and any values returned through ptr-to-args (ie the pointers allocated // by hipMalloc). #if COMPILE_HIP_ATP_MARKER #include "CXLActivityLogger.h" @@ -251,10 +267,11 @@ static const DbName dbName[] = { #define tprintf(trace_level, ...) \ { \ if (HIP_DB & (1 << (trace_level))) { \ + GET_TLS(); \ char msgStr[1000]; \ snprintf(msgStr, sizeof(msgStr), __VA_ARGS__); \ fprintf(stderr, " %ship-%s pid:%d tid:%d:%s%s", dbName[trace_level]._color, \ - dbName[trace_level]._shortName, tls_tidInfo.pid(), tls_tidInfo.tid(), msgStr, KNRM); \ + dbName[trace_level]._shortName, tls->tidInfo.pid(), tls->tidInfo.tid(), msgStr, KNRM); \ } \ } #else @@ -266,18 +283,19 @@ static const DbName dbName[] = { static inline uint64_t getTicks() { return hc::get_system_ticks(); } //--- -extern uint64_t recordApiTrace(std::string* fullStr, const std::string& apiStr); +extern uint64_t recordApiTrace(TlsData *tls, std::string* fullStr, const std::string& apiStr); #if COMPILE_HIP_ATP_MARKER || (COMPILE_HIP_TRACE_API & 0x1) #define API_TRACE(forceTrace, ...) \ + GET_TLS(); \ uint64_t hipApiStartTick = 0; \ { \ - tls_tidInfo.incApiSeqNum(); \ + tls->tidInfo.incApiSeqNum(); \ if (forceTrace || \ (HIP_PROFILE_API || (COMPILE_HIP_DB && (HIP_TRACE_API & (1 << TRACE_ALL))))) { \ std::string apiStr = std::string(__func__) + " (" + ToString(__VA_ARGS__) + ')'; \ std::string fullStr; \ - hipApiStartTick = recordApiTrace(&fullStr, apiStr); \ + hipApiStartTick = recordApiTrace(tls, &fullStr, apiStr); \ if (HIP_PROFILE_API == 0x1) { \ MARKER_BEGIN(__func__, "HIP") \ } else if (HIP_PROFILE_API == 0x2) { \ @@ -288,10 +306,13 @@ extern uint64_t recordApiTrace(std::string* fullStr, const std::string& apiStr); #else // Swallow API_TRACE -#define API_TRACE(IS_CMD, ...) tls_tidInfo.incApiSeqNum(); +#define API_TRACE(IS_CMD, ...) GET_TLS(); tls->tidInfo.incApiSeqNum(); #endif -#define HIP_SET_DEVICE() ihipDeviceSetState(); +#define ihipGetTlsDefaultCtx() iihipGetTlsDefaultCtx(tls) +#define ihipSetTlsDefaultCtx(ctx) tls->defaultCtx = ctx + +#define HIP_SET_DEVICE() ihipDeviceSetState(tls); // This macro should be called at the beginning of every HIP API. // It initializes the hip runtime (exactly once), and @@ -314,22 +335,22 @@ extern uint64_t recordApiTrace(std::string* fullStr, const std::string& apiStr); // This macro should be called at the end of every HIP API, and only at the end of top-level hip // APIS (not internal hip) It has dual function: logs the last error returned for use by // hipGetLastError, and also prints the closing message when the debug trace is enabled. -#define ihipLogStatus(hipStatus) \ - ({ \ - hipError_t localHipStatus = hipStatus; /*local copy so hipStatus only evaluated once*/ \ - tls_lastHipError = localHipStatus; \ - \ - if ((COMPILE_HIP_TRACE_API & 0x2) && HIP_TRACE_API & (1 << TRACE_ALL)) { \ - auto ticks = getTicks() - hipApiStartTick; \ - fprintf(stderr, " %ship-api pid:%d tid:%d.%lu %-30s ret=%2d (%s)>> +%lu ns%s\n", \ - (localHipStatus == 0) ? API_COLOR : KRED, tls_tidInfo.pid(), tls_tidInfo.tid(), \ - tls_tidInfo.apiSeqNum(), __func__, localHipStatus, \ - ihipErrorString(localHipStatus), ticks, API_COLOR_END); \ - } \ - if (HIP_PROFILE_API) { \ - MARKER_END(); \ - } \ - localHipStatus; \ +#define ihipLogStatus(hipStatus) \ + ({ \ + hipError_t localHipStatus = hipStatus; /*local copy so hipStatus only evaluated once*/ \ + tls->lastHipError = localHipStatus; \ + \ + if ((COMPILE_HIP_TRACE_API & 0x2) && HIP_TRACE_API & (1 << TRACE_ALL)) { \ + auto ticks = getTicks() - hipApiStartTick; \ + fprintf(stderr, " %ship-api pid:%d tid:%d.%lu %-30s ret=%2d (%s)>> +%lu ns%s\n", \ + (localHipStatus == 0) ? API_COLOR : KRED, tls->tidInfo.pid(), tls->tidInfo.tid(), \ + tls->tidInfo.apiSeqNum(), __func__, localHipStatus, \ + ihipErrorString(localHipStatus), ticks, API_COLOR_END); \ + } \ + if (HIP_PROFILE_API) { \ + MARKER_END(); \ + } \ + localHipStatus; \ }) @@ -936,11 +957,9 @@ extern hsa_agent_t* g_allAgents; // CPU agents + all the visible GPU agents. // Extern functions: extern void ihipInit(); extern const char* ihipErrorString(hipError_t); -extern ihipCtx_t* ihipGetTlsDefaultCtx(); -extern void ihipSetTlsDefaultCtx(ihipCtx_t* ctx); -extern hipError_t ihipSynchronize(void); +extern hipError_t ihipSynchronize(TlsData *tls); extern void ihipCtxStackUpdate(); -extern hipError_t ihipDeviceSetState(); +extern hipError_t ihipDeviceSetState(TlsData *tls); extern ihipDevice_t* ihipGetDevice(int); ihipCtx_t* ihipGetPrimaryCtx(unsigned deviceIndex); @@ -949,7 +968,7 @@ hipError_t hipModuleGetFunctionEx(hipFunction_t* hfunc, hipModule_t hmod, hipStream_t ihipSyncAndResolveStream(hipStream_t, bool lockAcquired = 0); -hipError_t ihipStreamSynchronize(hipStream_t stream); +hipError_t ihipStreamSynchronize(TlsData *tls, hipStream_t stream); void ihipStreamCallbackHandler(ihipStreamCallback_t* cb); // Stream printf functions: @@ -1002,5 +1021,18 @@ hipError_t memcpyAsync(void* dst, const void* src, size_t sizeBytes, hipMemcpyKi hipStream_t stream); }; +//--- +// TODO - review the context creation strategy here. Really should be: +// - first "non-device" runtime call creates the context for this thread. Allowed to call +// setDevice first. +// - hipDeviceReset destroys the primary context for device? +// - Then context is created again for next usage. +static inline ihipCtx_t* iihipGetTlsDefaultCtx(TlsData* tls) { + // Per-thread initialization of the TLS: + if ((tls->defaultCtx == nullptr) && (g_deviceCnt > 0)) { + tls->defaultCtx = ihipGetPrimaryCtx(0); + } + return tls->defaultCtx; +} #endif diff --git a/src/hip_memory.cpp b/src/hip_memory.cpp index 99ea4b5b24..61f34db244 100644 --- a/src/hip_memory.cpp +++ b/src/hip_memory.cpp @@ -300,7 +300,7 @@ hipError_t hipExtMallocWithFlags(void** ptr, size_t sizeBytes, unsigned int flag return ihipLogStatus(hip_status); } -hipError_t ihipHostMalloc(void** ptr, size_t sizeBytes, unsigned int flags) { +hipError_t ihipHostMalloc(TlsData *tls, void** ptr, size_t sizeBytes, unsigned int flags) { hipError_t hip_status = hipSuccess; if (HIP_SYNC_HOST_ALLOC) { @@ -372,7 +372,7 @@ hipError_t hipHostMalloc(void** ptr, size_t sizeBytes, unsigned int flags) { HIP_INIT_SPECIAL_API(hipHostMalloc, (TRACE_MEM), ptr, sizeBytes, flags); HIP_SET_DEVICE(); hipError_t hip_status = hipSuccess; - hip_status = ihipHostMalloc(ptr, sizeBytes, flags); + hip_status = ihipHostMalloc(tls, ptr, sizeBytes, flags); return ihipLogStatus(hip_status); } @@ -383,7 +383,7 @@ hipError_t hipMallocManaged(void** devPtr, size_t size, unsigned int flags) { if(flags != hipMemAttachGlobal) hip_status = hipErrorInvalidValue; else - hip_status = ihipHostMalloc(devPtr, size, hipHostMallocDefault); + hip_status = ihipHostMalloc(tls, devPtr, size, hipHostMallocDefault); return ihipLogStatus(hip_status); } @@ -397,7 +397,7 @@ hipError_t hipHostAlloc(void** ptr, size_t sizeBytes, unsigned int flags) { }; // width in bytes -hipError_t ihipMallocPitch(void** ptr, size_t* pitch, size_t width, size_t height, size_t depth) { +hipError_t ihipMallocPitch(TlsData* tls, void** ptr, size_t* pitch, size_t width, size_t height, size_t depth) { hipError_t hip_status = hipSuccess; if(ptr==NULL || pitch == NULL) { @@ -460,7 +460,7 @@ hipError_t hipMallocPitch(void** ptr, size_t* pitch, size_t width, size_t height if (width == 0 || height == 0) return ihipLogStatus(hipErrorUnknown); - hip_status = ihipMallocPitch(ptr, pitch, width, height, 0); + hip_status = ihipMallocPitch(tls, ptr, pitch, width, height, 0); return ihipLogStatus(hip_status); } @@ -475,7 +475,7 @@ hipError_t hipMalloc3D(hipPitchedPtr* pitchedDevPtr, hipExtent extent) { size_t pitch; hip_status = - ihipMallocPitch(&pitchedDevPtr->ptr, &pitch, extent.width, extent.height, extent.depth); + ihipMallocPitch(tls, &pitchedDevPtr->ptr, &pitch, extent.width, extent.height, extent.depth); if (hip_status == hipSuccess) { pitchedDevPtr->pitch = pitch; pitchedDevPtr->xsize = extent.width; diff --git a/src/hip_module.cpp b/src/hip_module.cpp index 496356ef6e..04cdedbb75 100644 --- a/src/hip_module.cpp +++ b/src/hip_module.cpp @@ -137,7 +137,7 @@ hipError_t hipModuleUnload(hipModule_t hmod) { // TODO - improve this synchronization so it is thread-safe. // Currently we want for all inflight activity to complete, but don't prevent another // thread from launching new kernels before we finish this operation. - ihipSynchronize(); + ihipSynchronize(tls); delete hmod; // The ihipModule_t dtor will clean everything up. hmod = nullptr; @@ -145,7 +145,7 @@ hipError_t hipModuleUnload(hipModule_t hmod) { return ihipLogStatus(hipSuccess); } -hipError_t ihipModuleLaunchKernel(hipFunction_t f, uint32_t globalWorkSizeX, +hipError_t ihipModuleLaunchKernel(TlsData *tls, hipFunction_t f, uint32_t globalWorkSizeX, uint32_t globalWorkSizeY, uint32_t globalWorkSizeZ, uint32_t localWorkSizeX, uint32_t localWorkSizeY, uint32_t localWorkSizeZ, size_t sharedMemBytes, @@ -285,7 +285,7 @@ hipError_t hipModuleLaunchKernel(hipFunction_t f, uint32_t gridDimX, uint32_t gr void** kernelParams, void** extra) { HIP_INIT_API(hipModuleLaunchKernel, f, gridDimX, gridDimY, gridDimZ, blockDimX, blockDimY, blockDimZ, sharedMemBytes, hStream, kernelParams, extra); - return ihipLogStatus(ihipModuleLaunchKernel( + return ihipLogStatus(ihipModuleLaunchKernel(tls, f, blockDimX * gridDimX, blockDimY * gridDimY, gridDimZ * blockDimZ, blockDimX, blockDimY, blockDimZ, sharedMemBytes, hStream, kernelParams, extra, nullptr, nullptr, 0)); } @@ -298,7 +298,7 @@ hipError_t hipExtModuleLaunchKernel(hipFunction_t f, uint32_t globalWorkSizeX, hipEvent_t startEvent, hipEvent_t stopEvent, uint32_t flags) { HIP_INIT_API(hipExtModuleLaunchKernel, f, globalWorkSizeX, globalWorkSizeY, globalWorkSizeZ, localWorkSizeX, localWorkSizeY, localWorkSizeZ, sharedMemBytes, hStream, kernelParams, extra); - return ihipLogStatus(ihipModuleLaunchKernel( + return ihipLogStatus(ihipModuleLaunchKernel(tls, f, globalWorkSizeX, globalWorkSizeY, globalWorkSizeZ, localWorkSizeX, localWorkSizeY, localWorkSizeZ, sharedMemBytes, hStream, kernelParams, extra, startEvent, stopEvent, flags)); } @@ -311,14 +311,14 @@ hipError_t hipHccModuleLaunchKernel(hipFunction_t f, uint32_t globalWorkSizeX, hipEvent_t startEvent, hipEvent_t stopEvent) { HIP_INIT_API(hipHccModuleLaunchKernel, f, globalWorkSizeX, globalWorkSizeY, globalWorkSizeZ, localWorkSizeX, localWorkSizeY, localWorkSizeZ, sharedMemBytes, hStream, kernelParams, extra); - return ihipLogStatus(ihipModuleLaunchKernel( + return ihipLogStatus(ihipModuleLaunchKernel(tls, f, globalWorkSizeX, globalWorkSizeY, globalWorkSizeZ, localWorkSizeX, localWorkSizeY, localWorkSizeZ, sharedMemBytes, hStream, kernelParams, extra, startEvent, stopEvent, 0)); } hipError_t hipExtLaunchMultiKernelMultiDevice(hipLaunchParams* launchParamsList, int numDevices, unsigned int flags) { - HIP_INIT_API(hipExtLaunchMultiKernelMultiDevice, launchParamsList,numDevices,flags); + HIP_INIT_API(hipExtLaunchMultiKernelMultiDevice, launchParamsList, numDevices, flags); hipError_t result; if ((numDevices > g_deviceCnt) || (launchParamsList == nullptr)) { @@ -361,7 +361,7 @@ hipError_t hipExtLaunchMultiKernelMultiDevice(hipLaunchParams* launchParamsList, for (int i = 0; i < numDevices; ++i) { const hipLaunchParams& lp = launchParamsList[i]; - result = ihipModuleLaunchKernel(kds[i], + result = ihipModuleLaunchKernel(tls, kds[i], lp.gridDim.x * lp.blockDim.x, lp.gridDim.y * lp.blockDim.y, lp.gridDim.z * lp.blockDim.z, @@ -395,6 +395,7 @@ namespace hip_impl { } hsa_agent_t this_agent() { + GET_TLS(); auto ctx = ihipGetTlsDefaultCtx(); if (!ctx) throw runtime_error{"No active HIP context."}; @@ -574,6 +575,7 @@ hipError_t hipModuleGetGlobal(hipDeviceptr_t* dptr, size_t* bytes, namespace { inline void track(const hip_impl::Agent_global& x, hsa_agent_t agent) { + GET_TLS(); tprintf(DB_MEM, " add variable '%s' with ptr=%p size=%u to tracker\n", x.name, x.address, x.byte_cnt); @@ -693,7 +695,7 @@ namespace hip_impl { } } // Namespace hip_impl. -hipError_t ihipModuleGetFunction(hipFunction_t* func, hipModule_t hmod, const char* name, +hipError_t ihipModuleGetFunction(TlsData *tls, hipFunction_t* func, hipModule_t hmod, const char* name, hsa_agent_t *agent = nullptr) { using namespace hip_impl; @@ -728,14 +730,14 @@ hipError_t ihipModuleGetFunction(hipFunction_t* func, hipModule_t hmod, const ch // Get kernel for the current hsa agent. hipError_t hipModuleGetFunction(hipFunction_t* hfunc, hipModule_t hmod, const char* name) { HIP_INIT_API(hipModuleGetFunction, hfunc, hmod, name); - return ihipLogStatus(ihipModuleGetFunction(hfunc, hmod, name)); + return ihipLogStatus(ihipModuleGetFunction(tls, hfunc, hmod, name)); } // Get kernel for the given hsa agent. Internal use only. hipError_t hipModuleGetFunctionEx(hipFunction_t* hfunc, hipModule_t hmod, const char* name, hsa_agent_t *agent) { HIP_INIT_API(hipModuleGetFunctionEx, hfunc, hmod, name, agent); - return ihipLogStatus(ihipModuleGetFunction(hfunc, hmod, name, agent)); + return ihipLogStatus(ihipModuleGetFunction(tls, hfunc, hmod, name, agent)); } namespace { @@ -743,7 +745,7 @@ const amd_kernel_code_v3_t *header_v3(const ihipModuleSymbol_t& kd) { return reinterpret_cast(kd._header); } -hipFuncAttributes make_function_attributes(const ihipModuleSymbol_t& kd) { +hipFuncAttributes make_function_attributes(TlsData *tls, const ihipModuleSymbol_t& kd) { hipFuncAttributes r{}; hipDeviceProp_t prop{}; @@ -796,12 +798,12 @@ hipError_t hipFuncGetAttributes(hipFuncAttributes* attr, const void* func) if (!kd->_header) throw runtime_error{"Ill-formed Kernel_descriptor."}; - *attr = make_function_attributes(*kd); + *attr = make_function_attributes(tls, *kd); return ihipLogStatus(hipSuccess); } -hipError_t ihipModuleLoadData(hipModule_t* module, const void* image) { +hipError_t ihipModuleLoadData(TlsData *tls, hipModule_t* module, const void* image) { using namespace hip_impl; if (!module) return hipErrorInvalidValue; @@ -839,7 +841,7 @@ hipError_t ihipModuleLoadData(hipModule_t* module, const void* image) { hipError_t hipModuleLoadData(hipModule_t* module, const void* image) { HIP_INIT_API(hipModuleLoadData, module, image); - return ihipLogStatus(ihipModuleLoadData(module,image)); + return ihipLogStatus(ihipModuleLoadData(tls,module,image)); } hipError_t hipModuleLoad(hipModule_t* module, const char* fname) { @@ -853,13 +855,13 @@ hipError_t hipModuleLoad(hipModule_t* module, const char* fname) { vector tmp{istreambuf_iterator{file}, istreambuf_iterator{}}; - return ihipLogStatus(ihipModuleLoadData(module, tmp.data())); + return ihipLogStatus(ihipModuleLoadData(tls, module, tmp.data())); } hipError_t hipModuleLoadDataEx(hipModule_t* module, const void* image, unsigned int numOptions, hipJitOption* options, void** optionValues) { HIP_INIT_API(hipModuleLoadDataEx, module, image, numOptions, options, optionValues); - return ihipLogStatus(ihipModuleLoadData(module, image)); + return ihipLogStatus(ihipModuleLoadData(tls, module, image)); } hipError_t hipModuleGetTexRef(textureReference** texRef, hipModule_t hmod, const char* name) { @@ -903,7 +905,7 @@ void getGprsLdsUsage(hipFunction_t f, size_t* usedVGPRS, size_t* usedSGPRS, size } } -hipError_t ihipOccupancyMaxPotentialBlockSize(uint32_t* gridSize, uint32_t* blockSize, +hipError_t ihipOccupancyMaxPotentialBlockSize(TlsData *tls, uint32_t* gridSize, uint32_t* blockSize, hipFunction_t f, size_t dynSharedMemPerBlk, uint32_t blockSizeLimit) { @@ -1021,12 +1023,12 @@ hipError_t hipOccupancyMaxPotentialBlockSize(uint32_t* gridSize, uint32_t* block { HIP_INIT_API(hipOccupancyMaxPotentialBlockSize, gridSize, blockSize, f, dynSharedMemPerBlk, blockSizeLimit); - return ihipLogStatus(ihipOccupancyMaxPotentialBlockSize( + return ihipLogStatus(ihipOccupancyMaxPotentialBlockSize(tls, gridSize, blockSize, f, dynSharedMemPerBlk, blockSizeLimit)); } hipError_t ihipOccupancyMaxActiveBlocksPerMultiprocessor( - uint32_t* numBlocks, hipFunction_t f, uint32_t blockSize, size_t dynSharedMemPerBlk) + TlsData *tls, uint32_t* numBlocks, hipFunction_t f, uint32_t blockSize, size_t dynSharedMemPerBlk) { using namespace hip_impl; @@ -1083,7 +1085,7 @@ hipError_t hipOccupancyMaxActiveBlocksPerMultiprocessor( HIP_INIT_API(hipOccupancyMaxActiveBlocksPerMultiprocessor, numBlocks, f, blockSize, dynSharedMemPerBlk); return ihipLogStatus(ihipOccupancyMaxActiveBlocksPerMultiprocessor( - numBlocks, f, blockSize, dynSharedMemPerBlk)); + tls, numBlocks, f, blockSize, dynSharedMemPerBlk)); } hipError_t hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( @@ -1093,5 +1095,5 @@ hipError_t hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags( HIP_INIT_API(hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags, numBlocks, f, blockSize, dynSharedMemPerBlk, flags); return ihipLogStatus(ihipOccupancyMaxActiveBlocksPerMultiprocessor( - numBlocks, f, blockSize, dynSharedMemPerBlk)); + tls, numBlocks, f, blockSize, dynSharedMemPerBlk)); } diff --git a/src/hip_peer.cpp b/src/hip_peer.cpp index f2fca94404..7781af1dbe 100644 --- a/src/hip_peer.cpp +++ b/src/hip_peer.cpp @@ -84,7 +84,7 @@ hipError_t hipDeviceCanAccessPeer(int* canAccessPeer, hipCtx_t thisCtx, hipCtx_t //--- // Disable visibility of this device into memory allocated on peer device. // Remove this device from peer device peerlist. -hipError_t ihipDisablePeerAccess(hipCtx_t peerCtx) { +hipError_t ihipDisablePeerAccess(TlsData* tls, hipCtx_t peerCtx) { hipError_t err = hipSuccess; auto thisCtx = ihipGetTlsDefaultCtx(); @@ -119,7 +119,7 @@ hipError_t ihipDisablePeerAccess(hipCtx_t peerCtx) { //--- // Allow the current device to see all memory allocated on peerCtx. // This should add this device to the peer-device peer list. -hipError_t ihipEnablePeerAccess(hipCtx_t peerCtx, unsigned int flags) { +hipError_t ihipEnablePeerAccess(TlsData* tls, hipCtx_t peerCtx, unsigned int flags) { hipError_t err = hipSuccess; if (flags != 0) { err = hipErrorInvalidValue; @@ -186,14 +186,14 @@ hipError_t hipDeviceCanAccessPeer(int* canAccessPeer, int deviceId, int peerDevi hipError_t hipDeviceDisablePeerAccess(int peerDeviceId) { HIP_INIT_API(hipDeviceDisablePeerAccess, peerDeviceId); - return ihipLogStatus(ihipDisablePeerAccess(ihipGetPrimaryCtx(peerDeviceId))); + return ihipLogStatus(ihipDisablePeerAccess(tls, ihipGetPrimaryCtx(peerDeviceId))); } hipError_t hipDeviceEnablePeerAccess(int peerDeviceId, unsigned int flags) { HIP_INIT_API(hipDeviceEnablePeerAccess, peerDeviceId, flags); - return ihipLogStatus(ihipEnablePeerAccess(ihipGetPrimaryCtx(peerDeviceId), flags)); + return ihipLogStatus(ihipEnablePeerAccess(tls, ihipGetPrimaryCtx(peerDeviceId), flags)); } @@ -214,11 +214,11 @@ hipError_t hipMemcpyPeerAsync(void* dst, int dstDevice, const void* src, int src hipError_t hipCtxEnablePeerAccess(hipCtx_t peerCtx, unsigned int flags) { HIP_INIT_API(hipCtxEnablePeerAccess, peerCtx, flags); - return ihipLogStatus(ihipEnablePeerAccess(peerCtx, flags)); + return ihipLogStatus(ihipEnablePeerAccess(tls, peerCtx, flags)); } hipError_t hipCtxDisablePeerAccess(hipCtx_t peerCtx) { HIP_INIT_API(hipCtxDisablePeerAccess, peerCtx); - return ihipLogStatus(ihipDisablePeerAccess(peerCtx)); + return ihipLogStatus(ihipDisablePeerAccess(tls, peerCtx)); } diff --git a/src/hip_stream.cpp b/src/hip_stream.cpp index 7812530dda..e3e4975b7e 100644 --- a/src/hip_stream.cpp +++ b/src/hip_stream.cpp @@ -48,7 +48,7 @@ enum queue_priority #endif //--- -hipError_t ihipStreamCreate(hipStream_t* stream, unsigned int flags, int priority) { +hipError_t ihipStreamCreate(TlsData *tls, hipStream_t* stream, unsigned int flags, int priority) { ihipCtx_t* ctx = ihipGetTlsDefaultCtx(); hipError_t e = hipSuccess; @@ -97,7 +97,7 @@ hipError_t ihipStreamCreate(hipStream_t* stream, unsigned int flags, int priorit hipError_t hipStreamCreateWithFlags(hipStream_t* stream, unsigned int flags) { HIP_INIT_API(hipStreamCreateWithFlags, stream, flags); if(flags == hipStreamDefault || flags == hipStreamNonBlocking) - return ihipLogStatus(ihipStreamCreate(stream, flags, priority_normal)); + return ihipLogStatus(ihipStreamCreate(tls, stream, flags, priority_normal)); else return ihipLogStatus(hipErrorInvalidValue); } @@ -106,7 +106,7 @@ hipError_t hipStreamCreateWithFlags(hipStream_t* stream, unsigned int flags) { hipError_t hipStreamCreate(hipStream_t* stream) { HIP_INIT_API(hipStreamCreate, stream); - return ihipLogStatus(ihipStreamCreate(stream, hipStreamDefault, priority_normal)); + return ihipLogStatus(ihipStreamCreate(tls, stream, hipStreamDefault, priority_normal)); } //--- @@ -115,7 +115,7 @@ hipError_t hipStreamCreateWithPriority(hipStream_t* stream, unsigned int flags, // clamp priority to range [priority_high:priority_low] priority = (priority < priority_high ? priority_high : (priority > priority_low ? priority_low : priority)); - return ihipLogStatus(ihipStreamCreate(stream, flags, priority)); + return ihipLogStatus(ihipStreamCreate(tls, stream, flags, priority)); } //--- @@ -183,7 +183,7 @@ hipError_t hipStreamQuery(hipStream_t stream) { hipError_t hipStreamSynchronize(hipStream_t stream) { HIP_INIT_SPECIAL_API(hipStreamSynchronize, TRACE_SYNC, stream); - return ihipLogStatus(ihipStreamSynchronize(stream)); + return ihipLogStatus(ihipStreamSynchronize(tls, stream)); } diff --git a/src/hip_texture.cpp b/src/hip_texture.cpp index e6cd352008..fe97895381 100644 --- a/src/hip_texture.cpp +++ b/src/hip_texture.cpp @@ -381,9 +381,10 @@ hipError_t hipGetTextureObjectTextureDesc(hipTextureDesc* pTexDesc, } // Texture Reference APIs -hipError_t ihipBindTextureImpl(int dim, enum hipTextureReadMode readMode, size_t* offset, +hipError_t ihipBindTextureImpl(TlsData *tls_, int dim, enum hipTextureReadMode readMode, size_t* offset, const void* devPtr, const struct hipChannelFormatDesc* desc, size_t size, textureReference* tex) { + TlsData *tls = (tls_ == nullptr) ? tls_get_ptr() : tls_; hipError_t hip_status = hipSuccess; enum hipTextureAddressMode addressMode = tex->addressMode[0]; enum hipTextureFilterMode filterMode = tex->filterMode; @@ -447,12 +448,12 @@ hipError_t hipBindTexture(size_t* offset, textureReference* tex, const void* dev HIP_INIT_API(hipBindTexture, offset, tex, devPtr, desc, size); hipError_t hip_status = hipSuccess; // TODO: hipReadModeElementType is default. - hip_status = ihipBindTextureImpl(hipTextureType1D, hipReadModeElementType, offset, devPtr, desc, + hip_status = ihipBindTextureImpl(tls, hipTextureType1D, hipReadModeElementType, offset, devPtr, desc, size, tex); return ihipLogStatus(hip_status); } -hipError_t ihipBindTexture2DImpl(int dim, enum hipTextureReadMode readMode, size_t* offset, +hipError_t ihipBindTexture2DImpl(TlsData *tls, int dim, enum hipTextureReadMode readMode, size_t* offset, const void* devPtr, const struct hipChannelFormatDesc* desc, size_t width, size_t height, textureReference* tex) { hipError_t hip_status = hipSuccess; @@ -519,15 +520,16 @@ hipError_t hipBindTexture2D(size_t* offset, textureReference* tex, const void* d size_t pitch) { HIP_INIT_API(hipBindTexture2D, offset, tex, devPtr, desc, width, height, pitch); hipError_t hip_status = hipSuccess; - hip_status = ihipBindTexture2DImpl(hipTextureType2D, hipReadModeElementType, offset, devPtr, + hip_status = ihipBindTexture2DImpl(tls, hipTextureType2D, hipReadModeElementType, offset, devPtr, desc, width, height, tex); return ihipLogStatus(hip_status); } -hipError_t ihipBindTextureToArrayImpl(int dim, enum hipTextureReadMode readMode, +hipError_t ihipBindTextureToArrayImpl(TlsData *tls_, int dim, enum hipTextureReadMode readMode, hipArray_const_t array, const struct hipChannelFormatDesc& desc, textureReference* tex) { + TlsData *tls = (tls_ == nullptr) ? tls_get_ptr() : tls_; hipError_t hip_status = hipSuccess; enum hipTextureAddressMode addressMode = tex->addressMode[0]; enum hipTextureFilterMode filterMode = tex->filterMode; @@ -617,7 +619,7 @@ hipError_t hipBindTextureToArray(textureReference* tex, hipArray_const_t array, hipError_t hip_status = hipSuccess; // TODO: hipReadModeElementType is default. hip_status = - ihipBindTextureToArrayImpl(array->textureType, hipReadModeElementType, array, *desc, tex); + ihipBindTextureToArrayImpl(tls, array->textureType, hipReadModeElementType, array, *desc, tex); return ihipLogStatus(hip_status); } @@ -629,7 +631,7 @@ hipError_t hipBindTextureToMipmappedArray(textureReference* tex, return ihipLogStatus(hip_status); } -hipError_t ihipUnbindTextureImpl(const hipTextureObject_t& textureObject) { +hipError_t ihipUnbindTextureImpl(TlsData *tls, const hipTextureObject_t& textureObject) { hipError_t hip_status = hipSuccess; auto ctx = ihipGetTlsDefaultCtx(); @@ -654,7 +656,7 @@ hipError_t ihipUnbindTextureImpl(const hipTextureObject_t& textureObject) { hipError_t hipUnbindTexture(const textureReference* tex) { HIP_INIT_API(hipUnbindTexture, tex); hipError_t hip_status = hipSuccess; - hip_status = ihipUnbindTextureImpl(tex->textureObject); + hip_status = ihipUnbindTextureImpl(tls, tex->textureObject); return ihipLogStatus(hip_status); } @@ -726,7 +728,7 @@ hipError_t hipTexRefSetArray(textureReference* tex, hipArray_const_t array, unsi HIP_INIT_API(hipTexRefSetArray, tex, array, flags); hipError_t hip_status = hipSuccess; - hip_status = ihipBindTextureToArrayImpl(array->textureType, hipReadModeElementType, array, + hip_status = ihipBindTextureToArrayImpl(tls, array->textureType, hipReadModeElementType, array, array->desc, tex); return ihipLogStatus(hip_status); } @@ -737,7 +739,7 @@ hipError_t hipTexRefSetAddress(size_t* offset, textureReference* tex, hipDevicep HIP_INIT_API(hipTexRefSetAddress, offset, tex, devPtr, size); hipError_t hip_status = hipSuccess; // TODO: hipReadModeElementType is default. - hip_status = ihipBindTextureImpl(hipTextureType1D, hipReadModeElementType, offset, devPtr, NULL, + hip_status = ihipBindTextureImpl(tls, hipTextureType1D, hipReadModeElementType, offset, devPtr, NULL, size, tex); return ihipLogStatus(hip_status); } @@ -748,7 +750,7 @@ hipError_t hipTexRefSetAddress2D(textureReference* tex, const HIP_ARRAY_DESCRIPT size_t offset; hipError_t hip_status = hipSuccess; // TODO: hipReadModeElementType is default. - hip_status = ihipBindTexture2DImpl(hipTextureType2D, hipReadModeElementType, &offset, devPtr, + hip_status = ihipBindTexture2DImpl(tls, hipTextureType2D, hipReadModeElementType, &offset, devPtr, NULL, desc->Width, desc->Height, tex); return ihipLogStatus(hip_status); } diff --git a/src/macro_based_grid_launch.inl b/src/macro_based_grid_launch.inl index 1e36903c56..2e804f090b 100644 --- a/src/macro_based_grid_launch.inl +++ b/src/macro_based_grid_launch.inl @@ -71,7 +71,8 @@ namespace hip_impl if (COMPILE_HIP_DB && HIP_TRACE_API) { std::string fullStr; - recordApiTrace(&fullStr, os.str()); + GET_TLS(); + recordApiTrace(tls, &fullStr, os.str()); } } } From 3bfff0a23db52a869709b32aa588bdeee77347b0 Mon Sep 17 00:00:00 2001 From: Sarbojit2019 <52527887+SarbojitAMD@users.noreply.github.com> Date: Mon, 5 Aug 2019 15:21:36 +0530 Subject: [PATCH 7/9] Enabled gcc for hip host code (#1214) * Enabled gcc for hip host code * Adding tests for hip code + (gcc & g++), without kernels * Excluding nvcc platforms for gcc and g++ tests + Addressing review comments * minor code clean-up * Add rocm include path * Added relative path for library * Hiding non supported functions for gcc * Incorporating review comments --- hip_prof_gen.py | 7 +++-- include/hip/hcc_detail/hip_runtime_api.h | 18 ++++++++++++- include/hip/hcc_detail/hip_vector_types.h | 21 +++++++++++++++ include/hip/hip_runtime_api.h | 2 ++ .../complex_loading_behavior.cpp | 2 +- tests/src/g++/hipMalloc.cpp | 27 +++++++++++++++++++ tests/src/gcc/hipMalloc.c | 27 +++++++++++++++++++ 7 files changed, 100 insertions(+), 4 deletions(-) diff --git a/hip_prof_gen.py b/hip_prof_gen.py index 587b2d545a..e2876d87bc 100755 --- a/hip_prof_gen.py +++ b/hip_prof_gen.py @@ -333,7 +333,7 @@ def generate_prof_header(f, api_map, opts_map): # Generating the callbacks ID enumaration f.write('\n// Return HIP API string\n') - f.write('static inline const char* hip_api_name(const uint32_t& id) {\n') + f.write('static inline const char* hip_api_name(const uint32_t id) {\n') f.write(' switch(id) {\n') for name in api_map.keys(): f.write(' case HIP_API_ID_' + name + ': return "' + name + '";\n') @@ -353,7 +353,10 @@ def generate_prof_header(f, api_map, opts_map): if len(args) != 0: f.write(' struct {\n') for arg_tuple in args: - f.write(' ' + arg_tuple[0] + ' ' + arg_tuple[1] + ';\n') + if arg_tuple[0] == "hipLimit_t": + f.write(' enum ' + arg_tuple[0] + ' ' + arg_tuple[1] + ';\n') + else: + f.write(' ' + arg_tuple[0] + ' ' + arg_tuple[1] + ';\n') f.write(' } ' + name + ';\n') f.write( ' } args;\n' + diff --git a/include/hip/hcc_detail/hip_runtime_api.h b/include/hip/hcc_detail/hip_runtime_api.h index 755d15d8aa..e8871912fa 100644 --- a/include/hip/hcc_detail/hip_runtime_api.h +++ b/include/hip/hcc_detail/hip_runtime_api.h @@ -45,7 +45,7 @@ THE SOFTWARE. #include #include -#if !__HIP_VDI__ +#if !__HIP_VDI__ && defined(__cplusplus) #include #include #endif @@ -79,9 +79,11 @@ THE SOFTWARE. #define __dparm(x) #endif +#ifdef __cplusplus namespace hip_impl { hipError_t hip_init(); } // namespace hip_impl +#endif // Structure definitions: #ifdef __cplusplus @@ -1459,6 +1461,7 @@ hipError_t hipMemcpyFromSymbolAsync(void* dst, const void* symbolName, #else hipError_t hipModuleGetGlobal(void**, size_t*, hipModule_t, const char*); +#ifdef __cplusplus //Start : Not supported in gcc namespace hip_impl { inline __attribute__((visibility("hidden"))) @@ -1466,6 +1469,7 @@ hipError_t read_agent_global_from_process(hipDeviceptr_t* dptr, size_t* bytes, const char* name); } // Namespace hip_impl. + /** * @brief Copies the memory address of symbol @p symbolName to @p devPtr * @@ -1504,15 +1508,18 @@ hipError_t hipGetSymbolSize(size_t* size, const void* symbolName) { void* devPtr = nullptr; return hip_impl::read_agent_global_from_process(&devPtr, size, (const char*)symbolName); } +#endif // End : Not supported in gcc #if defined(__cplusplus) } // extern "C" #endif +#ifdef __cplusplus namespace hip_impl { hipError_t hipMemcpyToSymbol(void*, const void*, size_t, size_t, hipMemcpyKind, const char*); } // Namespace hip_impl. +#endif #if defined(__cplusplus) extern "C" { @@ -1541,6 +1548,7 @@ extern "C" { * hipMemcpyFromArrayAsync, hipMemcpy2DFromArrayAsync, hipMemcpyToSymbolAsync, * hipMemcpyFromSymbolAsync */ +#ifdef __cplusplus inline __attribute__((visibility("hidden"))) hipError_t hipMemcpyToSymbol(const void* symbolName, const void* src, @@ -1554,11 +1562,13 @@ hipError_t hipMemcpyToSymbol(const void* symbolName, const void* src, return hip_impl::hipMemcpyToSymbol(dst, src, sizeBytes, offset, kind, (const char*)symbolName); } +#endif #if defined(__cplusplus) } // extern "C" #endif +#ifdef __cplusplus namespace hip_impl { hipError_t hipMemcpyToSymbolAsync(void*, const void*, size_t, size_t, hipMemcpyKind, hipStream_t, const char*); @@ -1567,6 +1577,7 @@ hipError_t hipMemcpyFromSymbol(void*, const void*, size_t, size_t, hipError_t hipMemcpyFromSymbolAsync(void*, const void*, size_t, size_t, hipMemcpyKind, hipStream_t, const char*); } // Namespace hip_impl. +#endif #if defined(__cplusplus) extern "C" { @@ -1597,6 +1608,8 @@ extern "C" { * hipMemcpyFromArrayAsync, hipMemcpy2DFromArrayAsync, hipMemcpyToSymbolAsync, * hipMemcpyFromSymbolAsync */ + +#ifdef __cplusplus //Start : Not supported in gcc inline __attribute__((visibility("hidden"))) hipError_t hipMemcpyToSymbolAsync(const void* symbolName, const void* src, @@ -1641,6 +1654,7 @@ hipError_t hipMemcpyFromSymbolAsync(void* dst, const void* symbolName, stream, (const char*)symbolName); } +#endif // End : Not supported in gcc #endif // __HIP_VDI__ /** @@ -2604,6 +2618,7 @@ hipError_t hipFuncGetAttributes(struct hipFuncAttributes* attr, const void* func } // extern "C" #endif +#ifdef __cplusplus namespace hip_impl { class agent_globals_impl; class agent_globals { @@ -2635,6 +2650,7 @@ namespace hip_impl { return get_agent_globals().read_agent_global_from_process(dptr, bytes, name); } } // Namespace hip_impl. +#endif #if defined(__cplusplus) extern "C" { diff --git a/include/hip/hcc_detail/hip_vector_types.h b/include/hip/hcc_detail/hip_vector_types.h index 3407b8a752..a03a46b8cf 100644 --- a/include/hip/hcc_detail/hip_vector_types.h +++ b/include/hip/hcc_detail/hip_vector_types.h @@ -849,6 +849,7 @@ __MAKE_VECTOR_TYPE__(longlong, long long); __MAKE_VECTOR_TYPE__(float, float); __MAKE_VECTOR_TYPE__(double, double); +#ifdef __cplusplus #define DECLOP_MAKE_ONE_COMPONENT(comp, type) \ static inline __device__ __host__ \ type make_##type(comp x) { type r{x}; return r; } @@ -867,6 +868,26 @@ __MAKE_VECTOR_TYPE__(double, double); type r{x, y, z, w}; \ return r; \ } +#else + #define DECLOP_MAKE_ONE_COMPONENT(comp, type) \ + static inline __device__ __host__ \ + type make_##type(comp x) { type r; r.x =x; return r; } + + #define DECLOP_MAKE_TWO_COMPONENT(comp, type) \ + static inline __device__ __host__ \ + type make_##type(comp x, comp y) { type r; r.x=x; r.y=y; return r; } + + #define DECLOP_MAKE_THREE_COMPONENT(comp, type) \ + static inline __device__ __host__ \ + type make_##type(comp x, comp y, comp z) { type r; r.x=x; r.y=y; r.z=z; return r; } + + #define DECLOP_MAKE_FOUR_COMPONENT(comp, type) \ + static inline __device__ __host__ \ + type make_##type(comp x, comp y, comp z, comp w) { \ + type r; r.x=x; r.y=y; r.z=z; r.w=w; \ + return r; \ + } +#endif DECLOP_MAKE_ONE_COMPONENT(unsigned char, uchar1); DECLOP_MAKE_TWO_COMPONENT(unsigned char, uchar2); diff --git a/include/hip/hip_runtime_api.h b/include/hip/hip_runtime_api.h index c067f5bf54..1c8e971545 100644 --- a/include/hip/hip_runtime_api.h +++ b/include/hip/hip_runtime_api.h @@ -255,6 +255,8 @@ typedef enum __HIP_NODISCARD hipError_t { 1071, ///< Produced when the IPC memory attach failed from ROCr. hipErrorAssert = 1081, ///< Produced when the kernel calls assert. + hipErrorNotSupported = + 1082, ///< Produced when the hip API is not supported/implemented hipErrorTbd ///< Marker that more error codes are needed. } hipError_t; diff --git a/tests/src/dynamicLoading/complex_loading_behavior.cpp b/tests/src/dynamicLoading/complex_loading_behavior.cpp index 6ee21a9cad..b8ed0f16e0 100644 --- a/tests/src/dynamicLoading/complex_loading_behavior.cpp +++ b/tests/src/dynamicLoading/complex_loading_behavior.cpp @@ -21,7 +21,7 @@ THE SOFTWARE. */ /* HIT_START - * BUILD_CMD: libfoo_amd %hc %S/%s -o libfoo.so -fPIC -lpthread -shared -DTEST_SHARED_LIBRARY EXCLUDE_HIP_PLATFORM nvcc + * BUILD_CMD: libfoo_amd %hc %S/%s -o libfoo.so -Xcompiler -fPIC -lpthread -shared -DTEST_SHARED_LIBRARY EXCLUDE_HIP_PLATFORM nvcc * BUILD_CMD: libfoo_nvidia %hc %S/%s -o libfoo.so -Xcompiler -fPIC -lpthread -shared -DTEST_SHARED_LIBRARY EXCLUDE_HIP_PLATFORM hcc * BUILD_CMD: %t %hc %S/%s -o %T/%t -ldl * TEST: %t diff --git a/tests/src/g++/hipMalloc.cpp b/tests/src/g++/hipMalloc.cpp index 9c1f695a85..3aab48aad5 100644 --- a/tests/src/g++/hipMalloc.cpp +++ b/tests/src/g++/hipMalloc.cpp @@ -1,7 +1,34 @@ +/* + * Copyright (c) 2019-2020 Advanced Micro Devices, Inc. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANNTY OF ANY KIND, EXPRESS OR + * IMPLIED, INNCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANNY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER INN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR INN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * */ + +/* HIT_START + * BUILD_CMD: hipMalloc %cxx -D__HIP_PLATFORM_HCC__ -I%hip-path/include -I/opt/rocm/include %S/%s -Wl,--rpath=%hip-path/lib %hip-path/lib/libhip_hcc.so -o %T/%t -std=c++11 EXCLUDE_HIP_PLATFORM nvcc + * TEST: %t EXCLUDE_HIP_PLATFORM nvcc + * HIT_END + */ + + #include #include int main() { int* Ad; hipMalloc((void**)&Ad, 1024); + std::cout<<"PASSED!"< #include @@ -5,4 +31,5 @@ int main() { int *Ad; hipMalloc((void**)&Ad, 1024); + printf("PASSED!\n"); } From fbbed603ff19a1c2ec001991dce8e8fe5eb54946 Mon Sep 17 00:00:00 2001 From: Alex Voicu Date: Mon, 5 Aug 2019 12:52:22 +0300 Subject: [PATCH 8/9] Fix hip_throw. (#1285) * Fix hip_throw. * Fix typo * No, really fix typo --- src/hip_hcc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hip_hcc.cpp b/src/hip_hcc.cpp index 8c47f54cf6..dcfdfb6137 100644 --- a/src/hip_hcc.cpp +++ b/src/hip_hcc.cpp @@ -2494,6 +2494,8 @@ namespace hip_impl { [[noreturn]] void hip_throw(const std::exception& ex) { #if defined(__cpp_exceptions) + if (auto rte = dynamic_cast(&ex)) throw *rte; + if (auto lge = dynamic_cast(&ex)) throw *lge; throw ex; #else std::cerr << ex.what() << std::endl; From 739e2df22432bbeb30c86ad8e4ae2392ad821694 Mon Sep 17 00:00:00 2001 From: Evgeny Mankov Date: Mon, 5 Aug 2019 14:49:01 +0300 Subject: [PATCH 9/9] [HIPIFY][doc] Update README.md + cuDNN, Python, and VS supported versions update; + testing output update. --- hipify-clang/README.md | 134 +++++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/hipify-clang/README.md b/hipify-clang/README.md index 470e5db257..670e8206ee 100644 --- a/hipify-clang/README.md +++ b/hipify-clang/README.md @@ -143,9 +143,9 @@ To run it: * Path to cuDNN should be specified by the `CUDA_DNN_ROOT_DIR` option: - - Linux: `-DCUDA_DNN_ROOT_DIR=/srv/CUDNN/cudnn-10.0-v7.6.1.34` + - Linux: `-DCUDA_DNN_ROOT_DIR=/srv/CUDNN/cudnn-10.0-v7.6.2.24` - - Windows: `-DCUDA_DNN_ROOT_DIR=f:/CUDNN/cudnn-9.0-windows10-x64-v7.6.1.34` + - Windows: `-DCUDA_DNN_ROOT_DIR=f:/CUDNN/cudnn-9.0-windows10-x64-v7.6.2.24` 5. Ensure [`python`](https://www.python.org/downloads) of minimum required version 2.7 is installed. @@ -179,9 +179,9 @@ To run it: On Linux the following configurations are tested: -Ubuntu 14: LLVM 5.0.0 - 6.0.1, CUDA 7.0 - 9.0, cudnn-5.0.5 - cudnn-7.6.1.34 +Ubuntu 14: LLVM 5.0.0 - 6.0.1, CUDA 7.0 - 9.0, cudnn-5.0.5 - cudnn-7.6.2.24 -Ubuntu 16-18: LLVM 8.0.0 - 8.0.1, CUDA 8.0 - 10.0, cudnn-5.1.10 - cudnn-7.6.1.34 +Ubuntu 16-18: LLVM 8.0.0 - 8.0.1, CUDA 8.0 - 10.0, cudnn-5.1.10 - cudnn-7.6.2.24 Build system for the above configurations: @@ -196,7 +196,7 @@ cmake -DCMAKE_INSTALL_PREFIX=../dist \ -DCMAKE_PREFIX_PATH=/srv/git/LLVM/8.0.1/dist \ -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.0 \ - -DCUDA_DNN_ROOT_DIR=/srv/CUDNN/cudnn-10.0-v7.6.1.34 \ + -DCUDA_DNN_ROOT_DIR=/srv/CUDNN/cudnn-10.0-v7.6.2.24 \ -DLLVM_EXTERNAL_LIT=/srv/git/LLVM/8.0.1/build/bin/llvm-lit \ .. ``` @@ -248,65 +248,67 @@ Running HIPify regression tests CUDA 10.0 - will be used for testing LLVM 8.0.1 - will be used for testing x86_64 - Platform architecture -Linux 4.13.0-32-generic - Platform OS +Linux 5.2.0-rc1-kfd-compute-roc-master-int-hipclang-623 - Platform OS 64 - hipify-clang binary bitness 64 - python 2.7.12 binary bitness ======================================== --- Testing: 52 tests, 12 threads -- -PASS: hipify :: unit_tests/headers/headers_test_03.cu (1 of 52) -PASS: hipify :: unit_tests/headers/headers_test_02.cu (2 of 52) -PASS: hipify :: unit_tests/headers/headers_test_01.cu (3 of 52) -PASS: hipify :: unit_tests/headers/headers_test_05.cu (4 of 52) -PASS: hipify :: unit_tests/libraries/CAFFE2/caffe2_02.cu (5 of 52) -PASS: hipify :: unit_tests/headers/headers_test_07.cu (6 of 52) -PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_0_based_indexing.cu (7 of 52) -PASS: hipify :: unit_tests/headers/headers_test_06.cu (8 of 52) -PASS: hipify :: unit_tests/headers/headers_test_04.cu (9 of 52) -PASS: hipify :: unit_tests/headers/headers_test_08.cu (10 of 52) -PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_sgemm_matrix_multiplication.cu (11 of 52) -PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_0_based_indexing_rocblas.cu (12 of 52) -PASS: hipify :: unit_tests/libraries/cuComplex/cuComplex_Julia.cu (13 of 52) -PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_1_based_indexing.cu (14 of 52) -PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_1_based_indexing_rocblas.cu (15 of 52) -PASS: hipify :: unit_tests/libraries/cuDNN/cudnn_softmax.cu (16 of 52) -PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_sgemm_matrix_multiplication_rocblas.cu (17 of 52) -PASS: hipify :: unit_tests/libraries/cuFFT/simple_cufft.cu (18 of 52) -PASS: hipify :: unit_tests/libraries/CAFFE2/caffe2_01.cu (19 of 52) -PASS: hipify :: unit_tests/libraries/cuDNN/cudnn_convolution_forward.cu (20 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_03.cu (21 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_02.cu (22 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_01.cu (23 of 52) -PASS: hipify :: unit_tests/libraries/cuRAND/poisson_api_example.cu (24 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_04.cu (25 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_05.cu (26 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_06.cu (27 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_07.cu (28 of 52) -PASS: hipify :: unit_tests/samples/2_Cookbook/11_texture_driver/tex2dKernel.cpp (29 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_08.cu (30 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_09.cu (31 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_11.cu (32 of 52) -PASS: hipify :: unit_tests/headers/headers_test_09.cu (33 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_10.cu (34 of 52) -PASS: hipify :: unit_tests/samples/2_Cookbook/0_MatrixTranspose/MatrixTranspose.cpp (35 of 52) -PASS: hipify :: unit_tests/samples/allocators.cu (36 of 52) -PASS: hipify :: unit_tests/samples/2_Cookbook/11_texture_driver/texture2dDrv.cpp (37 of 52) -PASS: hipify :: unit_tests/samples/coalescing.cu (38 of 52) -PASS: hipify :: unit_tests/samples/2_Cookbook/1_hipEvent/hipEvent.cpp (39 of 52) -PASS: hipify :: unit_tests/samples/2_Cookbook/2_Profiler/Profiler.cpp (40 of 52) -PASS: hipify :: unit_tests/samples/2_Cookbook/7_streams/stream.cpp (41 of 52) -PASS: hipify :: unit_tests/libraries/cuRAND/benchmark_curand_generate.cpp (42 of 52) -PASS: hipify :: unit_tests/samples/axpy.cu (43 of 52) -PASS: hipify :: unit_tests/samples/2_Cookbook/8_peer2peer/peer2peer.cpp (44 of 52) -PASS: hipify :: unit_tests/samples/dynamic_shared_memory.cu (45 of 52) -PASS: hipify :: unit_tests/samples/intro.cu (46 of 52) -PASS: hipify :: unit_tests/samples/square.cu (47 of 52) -PASS: hipify :: unit_tests/samples/cudaRegister.cu (48 of 52) -PASS: hipify :: unit_tests/samples/vec_add.cu (49 of 52) -PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_12.cu (50 of 52) -PASS: hipify :: unit_tests/samples/static_shared_memory.cu (51 of 52) -PASS: hipify :: unit_tests/libraries/cuRAND/benchmark_curand_kernel.cpp (52 of 52) -Testing Time: 3.05s - Expected Passes : 52 +-- Testing: 54 tests, 12 threads -- +PASS: hipify :: unit_tests/headers/headers_test_03.cu (1 of 54) +PASS: hipify :: unit_tests/headers/headers_test_02.cu (2 of 54) +PASS: hipify :: unit_tests/headers/headers_test_01.cu (3 of 54) +PASS: hipify :: unit_tests/headers/headers_test_05.cu (4 of 54) +PASS: hipify :: unit_tests/headers/headers_test_11.cu (5 of 54) +PASS: hipify :: unit_tests/headers/headers_test_10.cu (6 of 54) +PASS: hipify :: unit_tests/headers/headers_test_07.cu (7 of 54) +PASS: hipify :: unit_tests/headers/headers_test_06.cu (8 of 54) +PASS: hipify :: unit_tests/headers/headers_test_04.cu (9 of 54) +PASS: hipify :: unit_tests/headers/headers_test_08.cu (10 of 54) +PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_sgemm_matrix_multiplication.cu (11 of 54) +PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_1_based_indexing.cu (12 of 54) +PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_0_based_indexing.cu (13 of 54) +PASS: hipify :: unit_tests/libraries/cuComplex/cuComplex_Julia.cu (14 of 54) +PASS: hipify :: unit_tests/libraries/CAFFE2/caffe2_02.cu (15 of 54) +PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_0_based_indexing_rocblas.cu (16 of 54) +PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_1_based_indexing_rocblas.cu (17 of 54) +PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_sgemm_matrix_multiplication_rocblas.cu (18 of 54) +PASS: hipify :: unit_tests/libraries/cuDNN/cudnn_softmax.cu (19 of 54) +PASS: hipify :: unit_tests/libraries/cuFFT/simple_cufft.cu (20 of 54) +PASS: hipify :: unit_tests/libraries/CAFFE2/caffe2_01.cu (21 of 54) +PASS: hipify :: unit_tests/libraries/cuRAND/poisson_api_example.cu (22 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_01.cu (23 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_02.cu (24 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_03.cu (25 of 54) +PASS: hipify :: unit_tests/libraries/cuDNN/cudnn_convolution_forward.cu (26 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_04.cu (27 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_05.cu (28 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_06.cu (29 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_07.cu (30 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_08.cu (31 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_10.cu (32 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_09.cu (33 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_11.cu (34 of 54) +PASS: hipify :: unit_tests/headers/headers_test_09.cu (35 of 54) +PASS: hipify :: unit_tests/samples/2_Cookbook/11_texture_driver/tex2dKernel.cpp (36 of 54) +PASS: hipify :: unit_tests/samples/2_Cookbook/0_MatrixTranspose/MatrixTranspose.cpp (37 of 54) +PASS: hipify :: unit_tests/samples/allocators.cu (38 of 54) +PASS: hipify :: unit_tests/samples/coalescing.cu (39 of 54) +PASS: hipify :: unit_tests/samples/2_Cookbook/11_texture_driver/texture2dDrv.cpp (40 of 54) +PASS: hipify :: unit_tests/samples/2_Cookbook/1_hipEvent/hipEvent.cpp (41 of 54) +PASS: hipify :: unit_tests/samples/2_Cookbook/2_Profiler/Profiler.cpp (42 of 54) +PASS: hipify :: unit_tests/samples/2_Cookbook/7_streams/stream.cpp (43 of 54) +PASS: hipify :: unit_tests/samples/2_Cookbook/8_peer2peer/peer2peer.cpp (44 of 54) +PASS: hipify :: unit_tests/samples/dynamic_shared_memory.cu (45 of 54) +PASS: hipify :: unit_tests/samples/axpy.cu (46 of 54) +PASS: hipify :: unit_tests/samples/intro.cu (47 of 54) +PASS: hipify :: unit_tests/libraries/cuRAND/benchmark_curand_generate.cpp (48 of 54) +PASS: hipify :: unit_tests/samples/cudaRegister.cu (49 of 54) +PASS: hipify :: unit_tests/samples/vec_add.cu (50 of 54) +PASS: hipify :: unit_tests/samples/square.cu (51 of 54) +PASS: hipify :: unit_tests/samples/static_shared_memory.cu (52 of 54) +PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_12.cu (53 of 54) +PASS: hipify :: unit_tests/libraries/cuRAND/benchmark_curand_kernel.cpp (54 of 54) +Testing Time: 2.92s + Expected Passes : 54 [100%] Built target test-hipify ``` ### Windows @@ -315,13 +317,13 @@ On Windows 10 the following configurations are tested: LLVM 5.0.0 - 5.0.2, CUDA 8.0, cudnn-5.1.10 - cudnn-7.1.4.18 -LLVM 6.0.0 - 6.0.1, CUDA 9.0, cudnn-7.0.5.15 - cudnn-7.6.1.34 +LLVM 6.0.0 - 6.0.1, CUDA 9.0, cudnn-7.0.5.15 - cudnn-7.6.2.24 -LLVM 7.0.0 - 8.0.1 (with patch*), CUDA 7.5 - 10.0, cudnn-7.0.5.15 - cudnn-7.6.1.34 +LLVM 7.0.0 - 8.0.1 (with patch*), CUDA 7.5 - 10.0, cudnn-7.0.5.15 - cudnn-7.6.2.24 Build system for the above configurations: -Python 3.6 (min), cmake 3.12.3 (min), Visual Studio 15.5.2 2017 - 16.1.6 2019. +Python 3.6 (min), cmake 3.12.3 (min), Visual Studio 2017 (15.5.2) - 2019 (16.2.0). Here is an example of building `hipify-clang` with testing support on `Windows 10` by `Visual Studio 15 2017`: @@ -334,7 +336,7 @@ cmake -DCMAKE_PREFIX_PATH=f:/LLVM/6.0.1/dist \ -DCUDA_TOOLKIT_ROOT_DIR="c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0" \ -DCUDA_SDK_ROOT_DIR="c:/ProgramData/NVIDIA Corporation/CUDA Samples/v9.0" \ - -DCUDA_DNN_ROOT_DIR=f:/CUDNN/cudnn-9.0-windows10-x64-v7.6.1.34 \ + -DCUDA_DNN_ROOT_DIR=f:/CUDNN/cudnn-9.0-windows10-x64-v7.6.2.24 \ -DLLVM_EXTERNAL_LIT=f:/LLVM/6.0.1/build/Release/bin/llvm-lit.py \ -Thost=x64 .. @@ -345,7 +347,7 @@ cmake -- - CMake module path: F:/LLVM/6.0.1/dist/lib/cmake/llvm -- - Include path : F:/LLVM/6.0.1/dist/include -- - Binary path : F:/LLVM/6.0.1/dist/bin --- Found PythonInterp: C:/Program Files/Python36/python.exe (found suitable version "3.6.4", minimum required is "3.6") +-- Found PythonInterp: C:/Program Files/Python36/python.exe (found suitable version "3.7.4", minimum required is "3.6") -- Found lit: C:/Program Files/Python36/Scripts/lit.exe -- Found FileCheck: F:/LLVM/6.0.1/dist/bin/FileCheck.exe -- Found CUDA: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0 (found version "9.0")