diff --git a/projects/clr/rocclr/runtime/device/devkernel.cpp b/projects/clr/rocclr/runtime/device/devkernel.cpp index 9fb0f69144..ad376df33f 100644 --- a/projects/clr/rocclr/runtime/device/devkernel.cpp +++ b/projects/clr/rocclr/runtime/device/devkernel.cpp @@ -1557,7 +1557,7 @@ void Kernel::InitParameters(const amd_comgr_metadata_node_t kernelMD) { uint32_t numParams = params.size(); // Append the hidden arguments to the OCL arguments params.insert(params.end(), hiddenParams.begin(), hiddenParams.end()); - createSignature(params, numParams, amd::KernelSignature::ABIVersion_1); + createSignature(params, numParams, amd::KernelSignature::ABIVersion_2); } #else // not define USE_COMGR_LIBRARY void Kernel::InitParameters(const KernelMD& kernelMD, uint32_t argBufferSize) { @@ -1632,7 +1632,7 @@ void Kernel::InitParameters(const KernelMD& kernelMD, uint32_t argBufferSize) { uint32_t numParams = params.size(); // Append the hidden arguments to the OCL arguments params.insert(params.end(), hiddenParams.begin(), hiddenParams.end()); - createSignature(params, numParams, amd::KernelSignature::ABIVersion_1); + createSignature(params, numParams, amd::KernelSignature::ABIVersion_2); } #endif // defined(USE_COMGR_LIBRARY) #endif // defined(WITH_LIGHTNING_COMPILER) || defined(USE_COMGR_LIBRARY) diff --git a/projects/clr/rocclr/runtime/device/pal/palkernel.cpp b/projects/clr/rocclr/runtime/device/pal/palkernel.cpp index 86b73f3c70..cd615c1161 100644 --- a/projects/clr/rocclr/runtime/device/pal/palkernel.cpp +++ b/projects/clr/rocclr/runtime/device/pal/palkernel.cpp @@ -273,9 +273,10 @@ const HSAILProgram& HSAILKernel::prog() const { hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(VirtualGPU& gpu, const amd::Kernel& kernel, const amd::NDRangeContainer& sizes, - const_address parameters, + const_address params, size_t ldsAddress, uint64_t vmDefQueue, uint64_t* vmParentWrap) const { + const_address parameters = params; uint64_t argList; address aqlArgBuf = gpu.managedBuffer().reserve( argsBufferSize() + sizeof(hsa_kernel_dispatch_packet_t), &argList); @@ -289,7 +290,18 @@ hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(VirtualGPU& gpu, const gpu.addVmMemory(gpu.cb(1)->ActiveMemory()); } - const amd::KernelSignature& signature = kernel.signature(); + // The check below handles a special case of single context with multiple devices + // when the devices use different compilers(HSAIL and LC) and have different signatures + const amd::KernelSignature& signature = + (this->signature().version() == kernel.signature().version()) ? + kernel.signature() : this->signature(); + + // If signatures don't match, then patch the parameters + if (signature.version() != kernel.signature().version()) { + WriteAqlArgAt(aqlArgBuf, parameters, signature.paramsSize() - signature.at(0).offset_, + signature.at(0).offset_); + parameters = aqlArgBuf; + } // Check if runtime has to setup hidden arguments for (uint32_t i = signature.numParameters(); i < signature.numParametersAll(); ++i) { @@ -342,7 +354,10 @@ hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(VirtualGPU& gpu, const } // Load all kernel arguments - WriteAqlArgAt(aqlArgBuf, parameters, argsBufferSize(), 0); + if (signature.version() == kernel.signature().version()) { + WriteAqlArgAt(aqlArgBuf, parameters, argsBufferSize(), 0); + } + // Note: In a case of structs the size won't match, // since HSAIL compiler expects a reference... assert(argsBufferSize() <= signature.paramsSize() && diff --git a/projects/clr/rocclr/runtime/device/pal/palkernel.hpp b/projects/clr/rocclr/runtime/device/pal/palkernel.hpp index 81004b1485..d7beb12fbf 100644 --- a/projects/clr/rocclr/runtime/device/pal/palkernel.hpp +++ b/projects/clr/rocclr/runtime/device/pal/palkernel.hpp @@ -81,7 +81,7 @@ class HSAILKernel : public device::Kernel { VirtualGPU& gpu, //!< Running GPU context const amd::Kernel& kernel, //!< AMD kernel object const amd::NDRangeContainer& sizes, //!< NDrange container - const_address parameters, //!< Application arguments for the kernel + const_address params, //!< Application arguments for the kernel size_t ldsAddress, //!< LDS address that includes all arguments. uint64_t vmDefQueue, //!< GPU VM default queue pointer uint64_t* vmParentWrap //!< GPU VM parent aql wrap object diff --git a/projects/clr/rocclr/runtime/platform/kernel.hpp b/projects/clr/rocclr/runtime/platform/kernel.hpp index f03cd03ed4..bb2e5b9448 100644 --- a/projects/clr/rocclr/runtime/platform/kernel.hpp +++ b/projects/clr/rocclr/runtime/platform/kernel.hpp @@ -48,7 +48,8 @@ class KernelSignature : public HeapObject { public: enum { ABIVersion_0 = 0, //! ABI constructed based on the OCL semantics - ABIVersion_1 = 1 //! ABI constructed based on the HW ABI returned from the compiler + ABIVersion_1 = 1, //! ABI constructed based on the HW ABI returned from HSAIL + ABIVersion_2 = 2 //! ABI constructed based on the HW ABI returned from LC }; //! Default constructor @@ -110,12 +111,12 @@ class KernelParameters : protected HeapObject { std::vector execSvmPtr_; //!< The non argument svm pointers for kernel FGSStatus svmSystemPointersSupport_; //!< The flag for the status of the kernel // support of fine-grain system sharing. - uint32_t memoryObjOffset_; //!< The offset of execInfo - uint32_t samplerObjOffset_; //!< The offset of execInfo - uint32_t queueObjOffset_; //!< The offset of execInfo - amd::Memory** memoryObjects_; //!< The non argument svm pointers for kernel - amd::Sampler** samplerObjects_; //!< The non argument svm pointers for kernel - amd::DeviceQueue** queueObjects_; //!< The non argument svm pointers for kernel + uint32_t memoryObjOffset_; //!< The number of memory objects + uint32_t samplerObjOffset_; //!< The number of sampler objects + uint32_t queueObjOffset_; //!< The number of queue objects + amd::Memory** memoryObjects_; //!< Memory objects, associated with the kernel + amd::Sampler** samplerObjects_; //!< Sampler objects, associated with the kernel + amd::DeviceQueue** queueObjects_; //!< Queue objects, associated with the kernel uint32_t totalSize_; //!< The total size of all captured parameters diff --git a/projects/clr/rocclr/runtime/platform/program.cpp b/projects/clr/rocclr/runtime/platform/program.cpp index 9e86c3309d..7cd5978307 100644 --- a/projects/clr/rocclr/runtime/platform/program.cpp +++ b/projects/clr/rocclr/runtime/platform/program.cpp @@ -635,7 +635,8 @@ bool Program::ParseAllOptions(const std::string& options, option::Options& parse bool Symbol::setDeviceKernel(const Device& device, const device::Kernel* func) { if (deviceKernels_.size() == 0 || - (func->signature().version() > KernelSignature::ABIVersion_0)) { + // Always pick the most recent version in MGPU case + (func->signature().version() > signature_.version())) { signature_ = func->signature(); } deviceKernels_[&device] = func;