From f8648f412df31907f89dc26afbb68f6ce698f18b Mon Sep 17 00:00:00 2001 From: foreman Date: Fri, 2 Oct 2015 14:19:07 -0400 Subject: [PATCH] P4 to Git Change 1196584 by gandryey@gera-dev-w7 on 2015/10/02 14:01:41 SWDEV-77880 - Enable memory dependency tracking for HSAIL path - Use read/write attribute provided by the compiler for async execution optimization Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.cpp#299 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.hpp#118 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#384 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.hpp#136 edit --- rocclr/runtime/device/gpu/gpukernel.cpp | 18 ++++ rocclr/runtime/device/gpu/gpukernel.hpp | 7 ++ rocclr/runtime/device/gpu/gpuvirtual.cpp | 124 ++++++++++++++--------- rocclr/runtime/device/gpu/gpuvirtual.hpp | 5 +- 4 files changed, 102 insertions(+), 52 deletions(-) diff --git a/rocclr/runtime/device/gpu/gpukernel.cpp b/rocclr/runtime/device/gpu/gpukernel.cpp index 404df210dd..5eded3fe2c 100644 --- a/rocclr/runtime/device/gpu/gpukernel.cpp +++ b/rocclr/runtime/device/gpu/gpukernel.cpp @@ -2893,6 +2893,23 @@ GetHSAILArgAlignment(const aclArgData* argInfo) } } +inline static HSAIL_ACCESS_TYPE +GetHSAILArgAccessType(const aclArgData* argInfo) +{ + if (argInfo->type == ARG_TYPE_POINTER) { + switch (argInfo->arg.pointer.type) { + case ACCESS_TYPE_RO: + return HSAIL_ACCESS_TYPE_RO; + case ACCESS_TYPE_WO: + return HSAIL_ACCESS_TYPE_WO; + case ACCESS_TYPE_RW: + default: + return HSAIL_ACCESS_TYPE_RW; + } + } + return HSAIL_ACCESS_TYPE_NONE; +} + inline static HSAIL_ADDRESS_QUALIFIER GetHSAILAddrQual(const aclArgData* argInfo) { @@ -3268,6 +3285,7 @@ HSAILKernel::initHsailArgs(const aclArgData* aclArg) (aclArg->arg.value.data != DATATYPE_struct)) ? aclArg->arg.value.numElements : 1; arg->alignment_ = GetHSAILArgAlignment(aclArg); + arg->access_ = GetHSAILArgAccessType(aclArg); offset += GetHSAILArgSize(aclArg); arguments_.push_back(arg); } diff --git a/rocclr/runtime/device/gpu/gpukernel.hpp b/rocclr/runtime/device/gpu/gpukernel.hpp index d38721463e..f79f019a94 100644 --- a/rocclr/runtime/device/gpu/gpukernel.hpp +++ b/rocclr/runtime/device/gpu/gpukernel.hpp @@ -807,6 +807,12 @@ enum HSAIL_DATA_TYPE{ HSAIL_DATATYPE_MAX_TYPES }; +enum HSAIL_ACCESS_TYPE { + HSAIL_ACCESS_TYPE_NONE = 0, + HSAIL_ACCESS_TYPE_RO, + HSAIL_ACCESS_TYPE_WO, + HSAIL_ACCESS_TYPE_RW +}; class HSAILKernel : public device::Kernel { @@ -822,6 +828,7 @@ public: HSAIL_ADDRESS_QUALIFIER addrQual_; //!< Address qualifier of the argument HSAIL_DATA_TYPE dataType_; //!< The type of data uint numElem_; //!< Number of elements + HSAIL_ACCESS_TYPE access_; //!< Access type for the argument }; // Max number of possible extra (hidden) kernel arguments diff --git a/rocclr/runtime/device/gpu/gpuvirtual.cpp b/rocclr/runtime/device/gpu/gpuvirtual.cpp index f8e0b622de..ea1915f271 100644 --- a/rocclr/runtime/device/gpu/gpuvirtual.cpp +++ b/rocclr/runtime/device/gpu/gpuvirtual.cpp @@ -1665,54 +1665,17 @@ VirtualGPU::submitKernelInternalHSA( std::vector memList; bool printfEnabled = (hsaKernel.printfInfo().size() > 0) ? true:false; - if (!printfDbgHSA().init(*this, printfEnabled )){ + if (!printfDbgHSA().init(*this, printfEnabled )) { LogError( "Printf debug buffer initialization failed!"); return false; } - bool deviceSupportFGS = 0 != (dev().info().svmCapabilities_ & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM); - bool supportFineGrainedSystem = deviceSupportFGS; - FGSStatus status = kernel.parameters().getSvmSystemPointersSupport(); - switch (status) { - case FGS_YES: - if (!deviceSupportFGS) { - return false; - } - supportFineGrainedSystem = true; - break; - case FGS_NO: - supportFineGrainedSystem = false; - break; - case FGS_DEFAULT: - default: - break; + // Check memory dependency and SVM objects + if (!processMemObjectsHSA(kernel, parameters, nativeMem, &memList)) { + LogError("Wrong memory objects!"); + return false; } - size_t count = kernel.parameters().getNumberOfSvmPtr(); - size_t execInfoOffset = kernel.parameters().getExecInfoOffset(); - amd::Memory* memory = NULL; - //get svm non arugment information - void* const* svmPtrArray = reinterpret_cast(parameters + execInfoOffset); - for (size_t i = 0; i < count; i++) { - memory = amd::SvmManager::FindSvmBuffer(svmPtrArray[i]); - if (NULL == memory) { - if (!supportFineGrainedSystem) { - return false; - } - } - else { - Memory* gpuMemory = dev().getGpuMemory(memory); - if (NULL != gpuMemory) { - memList.push_back(gpuMemory); - } - else { - return false; - } - } - } - - // Check memory dependency and cache coherency - processMemObjectsHSA(kernel, parameters, nativeMem); cal_.memCount_ = 0; if (hsaKernel.dynamicParallelism()) { @@ -3217,22 +3180,79 @@ VirtualGPU::profileEvent(EngineType engine, bool type) const } } -void +bool VirtualGPU::processMemObjectsHSA( const amd::Kernel& kernel, const_address params, - bool nativeMem) + bool nativeMem, + std::vector* memList) { static const bool NoAlias = true; const HSAILKernel& hsaKernel = static_cast (*(kernel.getDeviceKernel(dev(), NoAlias))); + const amd::KernelSignature& signature = kernel.signature(); + const amd::KernelParameters& kernelParams = kernel.parameters(); // Mark the tracker with a new kernel, // so we can avoid checks of the aliased objects memoryDependency().newKernel(); - const amd::KernelSignature& signature = kernel.signature(); - const amd::KernelParameters& kernelParams = kernel.parameters(); + bool deviceSupportFGS = 0 != (dev().info().svmCapabilities_ & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM); + bool supportFineGrainedSystem = deviceSupportFGS; + FGSStatus status = kernelParams.getSvmSystemPointersSupport(); + switch (status) { + case FGS_YES: + if (!deviceSupportFGS) { + return false; + } + supportFineGrainedSystem = true; + break; + case FGS_NO: + supportFineGrainedSystem = false; + break; + case FGS_DEFAULT: + default: + break; + } + + size_t count = kernelParams.getNumberOfSvmPtr(); + size_t execInfoOffset = kernelParams.getExecInfoOffset(); + bool sync = true; + + amd::Memory* memory = NULL; + //get svm non arugment information + void* const* svmPtrArray = + reinterpret_cast(params + execInfoOffset); + for (size_t i = 0; i < count; i++) { + memory = amd::SvmManager::FindSvmBuffer(svmPtrArray[i]); + if (NULL == memory) { + if (!supportFineGrainedSystem) { + return false; + } + else if (sync) { + flushCUCaches(); + // Clear memory dependency state + const static bool All = true; + memoryDependency().clear(!All); + } + } + else { + Memory* gpuMemory = dev().getGpuMemory(memory); + if (NULL != gpuMemory) { + // Synchronize data with other memory instances if necessary + gpuMemory->syncCacheFromHost(*this); + + const static bool IsReadOnly = false; + // Validate SVM passed in the non argument list + memoryDependency().validate(*this, gpuMemory, IsReadOnly); + + memList->push_back(gpuMemory); + } + else { + return false; + } + } + } // Check all parameters for the current kernel for (size_t i = 0; i < signature.numParameters(); ++i) { @@ -3248,9 +3268,10 @@ VirtualGPU::processMemObjectsHSA( svmMem = amd::SvmManager::FindSvmBuffer( *reinterpret_cast(params + desc.offset_)); if (!svmMem) { - //!\todo Do we have to sync cache coherency or wait for SDMA? flushCUCaches(); - break; + // Clear memory dependency state + const static bool All = true; + memoryDependency().clear(!All); } } @@ -3271,10 +3292,11 @@ VirtualGPU::processMemObjectsHSA( } if (memory != NULL) { - //!@todo The code below can handle images only, - //! but the qualifier is broken anyway + // Check image readOnly = (desc.accessQualifier_ == CL_KERNEL_ARG_ACCESS_READ_ONLY) ? true : false; + // Check buffer + readOnly |= (arg->access_ == HSAIL_ACCESS_TYPE_RO) ? true : false; // Validate memory for a dependency in the queue memoryDependency().validate(*this, memory, readOnly); } @@ -3286,6 +3308,8 @@ VirtualGPU::processMemObjectsHSA( // Validate global store for a dependency in the queue memoryDependency().validate(*this, mem, IsReadOnly); } + + return true; } amd::Memory* diff --git a/rocclr/runtime/device/gpu/gpuvirtual.hpp b/rocclr/runtime/device/gpu/gpuvirtual.hpp index 818d9d9d6b..a2964d24c5 100644 --- a/rocclr/runtime/device/gpu/gpuvirtual.hpp +++ b/rocclr/runtime/device/gpu/gpuvirtual.hpp @@ -463,10 +463,11 @@ private: ); //! Detects memory dependency for HSAIL kernels and flushes caches - void processMemObjectsHSA( + bool processMemObjectsHSA( const amd::Kernel& kernel, //!< AMD kernel object for execution const_address params, //!< Pointer to the param's store - bool nativeMem //!< Native memory objects + bool nativeMem, //!< Native memory objects + std::vector* memList //!< Memory list for KMD tracking ); //! Common function for fill memory used by both svm Fill and non-svm fill