SWDEV-372790 - Copy AQL packet from runtime setup

Scheduler in device queue requires relaunching itself. Make sure
scheduler uses exactly the same AQL packet as the host launch.

Change-Id: I4eb03c4c91bf2408a6d4607731f081a2e2c2c8ae


[ROCm/clr commit: b23c759746]
This commit is contained in:
German Andryeyev
2023-01-23 17:40:30 -05:00
parent 115f0c2f43
commit 45ed09d0cb
3 changed files with 18 additions and 24 deletions
+3 -21
View File
@@ -2181,7 +2181,7 @@ bool KernelBlitManager::fillBuffer3D(device::Memory& memory, const void* pattern
// ================================================================================================
bool KernelBlitManager::copyBuffer(device::Memory& srcMemory, device::Memory& dstMemory,
const amd::Coord3D& srcOrigin, const amd::Coord3D& dstOrigin,
const amd::Coord3D& sizeIn, bool entire,
const amd::Coord3D& sizeIn, bool entire,
amd::CopyMetadata copyMetadata) const {
amd::ScopedLock k(lockXferOps_);
bool result = false;
@@ -2681,31 +2681,13 @@ bool KernelBlitManager::runScheduler(uint64_t vqVM, amd::Memory* schedulerParam,
Memory* schedulerMem = dev().getRocMemory(schedulerParam);
sp->kernarg_address = reinterpret_cast<uint64_t>(schedulerMem->getDeviceMemory());
sp->hidden_global_offset_x = 0;
sp->hidden_global_offset_y = 0;
sp->hidden_global_offset_z = 0;
sp->thread_counter = 0;
sp->child_queue = reinterpret_cast<uint64_t>(schedulerQueue);
sp->complete_signal = schedulerSignal;
hsa_signal_store_relaxed(schedulerSignal, kInitSignalValueOne);
sp->scheduler_aql.header = (HSA_PACKET_TYPE_KERNEL_DISPATCH << HSA_PACKET_HEADER_TYPE) |
(1 << HSA_PACKET_HEADER_BARRIER) |
(HSA_FENCE_SCOPE_SYSTEM << HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE) |
(HSA_FENCE_SCOPE_SYSTEM << HSA_PACKET_HEADER_RELEASE_FENCE_SCOPE);
sp->scheduler_aql.setup = 1;
sp->scheduler_aql.workgroup_size_x = 1;
sp->scheduler_aql.workgroup_size_y = 1;
sp->scheduler_aql.workgroup_size_z = 1;
sp->scheduler_aql.grid_size_x = threads;
sp->scheduler_aql.grid_size_y = 1;
sp->scheduler_aql.grid_size_z = 1;
sp->scheduler_aql.kernel_object = gpuKernel.KernelCodeHandle();
sp->scheduler_aql.kernarg_address = (void*)sp->kernarg_address;
sp->scheduler_aql.private_segment_size = 0;
sp->scheduler_aql.group_segment_size = 0;
sp->vqueue_header = vqVM;
sp->parentAQL = sp->kernarg_address + sizeof(SchedulerParam);
@@ -2720,7 +2702,7 @@ bool KernelBlitManager::runScheduler(uint64_t vqVM, amd::Memory* schedulerParam,
address parameters = captureArguments(kernels_[Scheduler]);
if (!gpu().submitKernelInternal(ndrange, *kernels_[Scheduler],
parameters, nullptr)) {
parameters, nullptr, 0, nullptr, &sp->scheduler_aql)) {
return false;
}
releaseArguments(parameters);