SWDEV-433820 - Optimize queue initialization (ROCM)

Change-Id: I0619a9f66ae3d64a0f3fc36384f46adb302e725d


[ROCm/clr commit: 5e1de3cc26]
Bu işleme şunda yer alıyor:
Alex Xie
2023-11-29 16:26:40 -05:00
işlemeyi yapan: Maneesh Gupta
ebeveyn 7e7e4b93ee
işleme 2fa724e0bd
+24 -31
Dosyayı Görüntüle
@@ -2857,50 +2857,43 @@ bool VirtualGPU::createVirtualQueue(uint deviceQueueSize)
}
uint64_t vqVA = reinterpret_cast<uint64_t>(vqMem->getDeviceMemory());
uint64_t pattern = 0;
amd::Coord3D origin(0, 0, 0);
amd::Coord3D region(virtualQueue_->getSize(), 1, 1);
if (!dev().xferMgr().fillBuffer(*vqMem, &pattern, sizeof(pattern), region, origin, region)) {
return false;
}
// Use shadow to prepare the data structure in host.
auto shadow = std::make_unique<uint8_t[]>(allocSize);
AmdVQueueHeader header = {};
std::memset(&shadow[0], 0, allocSize);
AmdVQueueHeader* header = reinterpret_cast<AmdVQueueHeader*>(&shadow[0]);
// Initialize the virtual queue header
header.aql_slot_num = numSlots;
header.event_slot_num = dev().settings().numDeviceEvents_;
header.event_slot_mask = vqVA + eventMaskOffs;
header.event_slots = vqVA + eventsOffs;
header.aql_slot_mask = vqVA + slotMaskOffs;
header.wait_size = dev().settings().numWaitEvents_;
header.arg_size = dev().info().maxParameterSize_ + 64;
header.mask_groups = maskGroups_;
amd::Coord3D origin_header(0);
amd::Coord3D region_header(sizeof(AmdVQueueHeader));
if (!dev().xferMgr().writeBuffer(&header, *vqMem, origin_header, region_header)) {
return false;
}
header->aql_slot_num = numSlots;
header->event_slot_num = dev().settings().numDeviceEvents_;
header->event_slot_mask = vqVA + eventMaskOffs;
header->event_slots = vqVA + eventsOffs;
header->aql_slot_mask = vqVA + slotMaskOffs;
header->wait_size = dev().settings().numWaitEvents_;
header->arg_size = dev().info().maxParameterSize_ + 64;
header->mask_groups = maskGroups_;
// Go over all slots and perform initialization
AmdAqlWrap slot = {};
size_t offset = sizeof(AmdVQueueHeader);
for (uint i = 0; i < numSlots; ++i) {
AmdAqlWrap * slot = reinterpret_cast<AmdAqlWrap*>(&shadow[0] + offset);
uint64_t argStart = vqVA + argOffs + i * singleArgSize;
amd::Coord3D origin_slot(offset);
amd::Coord3D region_slot(sizeof(AmdAqlWrap));
slot.aql.kernarg_address = reinterpret_cast<void*>(argStart);
slot.wait_list = argStart + dev().info().maxParameterSize_ + 64;
if (!dev().xferMgr().writeBuffer(&slot, *vqMem, origin_slot, region_slot)) {
return false;
}
slot->aql.kernarg_address = reinterpret_cast<void*>(argStart);
slot->wait_list = argStart + dev().info().maxParameterSize_ + 64;
offset += sizeof(AmdAqlWrap);
}
amd::Coord3D origin (0, 0, 0);
amd::Coord3D region (allocSize, 1, 1);
// copy the data structure from host to GPU
if (!dev().xferMgr().writeBuffer(&shadow[0], *vqMem, origin, region)) {
return false;
}
deviceQueueSize_ = deviceQueueSize;
schedulerThreads_ = numSlots / (DeviceQueueMaskSize * maskGroups_);