diff --git a/rocclr/runtime/device/pal/palconstbuf.cpp b/rocclr/runtime/device/pal/palconstbuf.cpp
index 3a0aa1a1eb..5257ce3477 100644
--- a/rocclr/runtime/device/pal/palconstbuf.cpp
+++ b/rocclr/runtime/device/pal/palconstbuf.cpp
@@ -33,9 +33,10 @@ ManagedBuffer::~ManagedBuffer() {
// ================================================================================================
bool ManagedBuffer::create(Resource::MemoryType type, bool constbuf) {
if (constbuf) {
- // Create sysmem copy for the constant buffer
+ // Create sysmem copy for the constant buffer.
+ // Allocate extra memory to account the internal arguments
sysMemCopy_ = reinterpret_cast
(amd::AlignedMemory::allocate(
- gpu_.dev().info().maxParameterSize_, 256));
+ 2 * gpu_.dev().info().maxParameterSize_, 256));
if (sysMemCopy_ == nullptr) {
LogPrintfError("We couldn't allocate sysmem copy for constant buffer, size(%d)!", size_);
return false;
diff --git a/rocclr/runtime/device/pal/palkernel.cpp b/rocclr/runtime/device/pal/palkernel.cpp
index 05c22fe6f6..4381baf16a 100644
--- a/rocclr/runtime/device/pal/palkernel.cpp
+++ b/rocclr/runtime/device/pal/palkernel.cpp
@@ -874,21 +874,42 @@ void HSAILKernel::findLocalWorkSize(size_t workDim, const amd::NDRange& gblWorkS
}
}
+template
inline static void WriteAqlArg(
unsigned char** dst, //!< The write pointer to the buffer
- const void* src, //!< The source pointer
+ const T* src, //!< The source pointer
uint size, //!< The size in bytes to copy
- uint alignment = 0 //!< The alignment to follow while writing to the buffer
- ) {
- if (alignment == 0) {
- *dst = amd::alignUp(*dst, size);
- } else {
- *dst = amd::alignUp(*dst, alignment);
- }
+ uint alignment //!< The alignment to follow while writing to the buffer
+) {
+ *dst = amd::alignUp(*dst, alignment);
memcpy(*dst, src, size);
*dst += size;
}
+template <>
+inline static void WriteAqlArg(
+ unsigned char** dst, //!< The write pointer to the buffer
+ const uint32_t* src, //!< The source pointer
+ uint size, //!< The size in bytes to copy
+ uint alignment //!< The alignment to follow while writing to the buffer
+) {
+ *dst = amd::alignUp(*dst, alignment);
+ *(reinterpret_cast(*dst)) = *src;
+ *dst += size;
+}
+
+template <>
+inline static void WriteAqlArg(
+ unsigned char** dst, //!< The write pointer to the buffer
+ const uint64_t* src, //!< The source pointer
+ uint size, //!< The size in bytes to copy
+ uint alignment //!< The alignment to follow while writing to the buffer
+) {
+ *dst = amd::alignUp(*dst, alignment);
+ *(reinterpret_cast(*dst)) = *src;
+ *dst += size;
+}
+
const uint16_t kDispatchPacketHeader = (HSA_PACKET_TYPE_KERNEL_DISPATCH << HSA_PACKET_HEADER_TYPE) |
(1 << HSA_PACKET_HEADER_BARRIER) |
(HSA_FENCE_SCOPE_SYSTEM << HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE) |
@@ -989,7 +1010,7 @@ hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(
amd::Memory* mem = nullptr;
if (kernelParams.boundToSvmPointer(dev(), parameters, arg->index_)) {
- WriteAqlArg(&aqlArgBuf, paramaddr, sizeof(paramaddr));
+ WriteAqlArg(&aqlArgBuf, paramaddr, sizeof(paramaddr), sizeof(paramaddr));
mem = amd::SvmManager::FindSvmBuffer(*reinterpret_cast(paramaddr));
if (mem != nullptr) {
gpuMem = dev().getGpuMemory(mem);
@@ -1049,12 +1070,20 @@ hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(
cb->uploadDataToHw(arg->size_);
// Then use a pointer in aqlArgBuffer to CB1
size_t gpuPtr = static_cast(cb->vmAddress() + cb->wrtOffset());
- WriteAqlArg(&aqlArgBuf, &gpuPtr, sizeof(size_t));
+ WriteAqlArg(&aqlArgBuf, &gpuPtr, sizeof(size_t), sizeof(size_t));
gpu.addVmMemory(cb->activeMemory());
break;
}
case HSAIL_ARGTYPE_VALUE:
- WriteAqlArg(&aqlArgBuf, paramaddr, arg->size_, arg->alignment_);
+ if (arg->size_ == sizeof(uint32_t)) {
+ WriteAqlArg(&aqlArgBuf, reinterpret_cast(paramaddr),
+ sizeof(uint32_t), arg->alignment_);
+ } else if (arg->size_ == sizeof(uint64_t)) {
+ WriteAqlArg(&aqlArgBuf, reinterpret_cast(paramaddr),
+ sizeof(uint64_t), arg->alignment_);
+ } else {
+ WriteAqlArg(&aqlArgBuf, paramaddr, arg->size_, arg->alignment_);
+ }
break;
case HSAIL_ARGTYPE_IMAGE: {
Image* image = nullptr;
@@ -1084,11 +1113,11 @@ hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(
cb->uploadDataToHw(HsaImageObjectSize);
// Then use a pointer in aqlArgBuffer to CB1
uint64_t srd = cb->vmAddress() + cb->wrtOffset();
- WriteAqlArg(&aqlArgBuf, &srd, sizeof(srd));
+ WriteAqlArg(&aqlArgBuf, &srd, sizeof(srd), sizeof(srd));
gpu.addVmMemory(cb->activeMemory());
} else {
uint64_t srd = image->hwSrd();
- WriteAqlArg(&aqlArgBuf, &srd, sizeof(srd));
+ WriteAqlArg(&aqlArgBuf, &srd, sizeof(srd), sizeof(srd));
srdResource = true;
}
@@ -1108,7 +1137,7 @@ hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(
const amd::Sampler* sampler = *reinterpret_cast(paramaddr);
const Sampler* gpuSampler = static_cast(sampler->getDeviceSampler(dev()));
uint64_t srd = gpuSampler->hwSrd();
- WriteAqlArg(&aqlArgBuf, &srd, sizeof(srd));
+ WriteAqlArg(&aqlArgBuf, &srd, sizeof(srd), sizeof(srd));
srdResource = true;
break;
}
@@ -1125,7 +1154,7 @@ hsa_kernel_dispatch_packet_t* HSAILKernel::loadArguments(
}
vmQueue = gpu.vQueue()->vmAddress();
}
- WriteAqlArg(&aqlArgBuf, &vmQueue, sizeof(vmQueue));
+ WriteAqlArg(&aqlArgBuf, &vmQueue, sizeof(vmQueue), sizeof(vmQueue));
break;
}
default: