/* * Copyright (C) 2020-2021 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "level_zero/core/source/event/event.h" #include "shared/source/command_stream/command_stream_receiver_hw.h" #include "shared/source/command_stream/csr_definitions.h" #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/device/device.h" #include "shared/source/execution_environment/execution_environment.h" #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/helpers/constants.h" #include "shared/source/helpers/string.h" #include "shared/source/memory_manager/memory_manager.h" #include "shared/source/memory_manager/memory_operations_handler.h" #include "shared/source/utilities/cpuintrinsics.h" #include "shared/source/utilities/wait_util.h" #include "level_zero/core/source/cmdlist/cmdlist.h" #include "level_zero/core/source/cmdqueue/cmdqueue.h" #include "level_zero/core/source/context/context_imp.h" #include "level_zero/core/source/device/device.h" #include "level_zero/core/source/device/device_imp.h" #include "level_zero/core/source/driver/driver_handle_imp.h" #include "level_zero/core/source/hw_helpers/l0_hw_helper.h" #include "level_zero/tools/source/metrics/metric.h" #include // #include "level_zero/core/source/event/event_impl.inl" namespace L0 { template Event *Event::create(EventPool *, const ze_event_desc_t *, Device *); template Event *Event::create(EventPool *, const ze_event_desc_t *, Device *); ze_result_t EventPoolImp::initialize(DriverHandle *driver, Context *context, uint32_t numDevices, ze_device_handle_t *phDevices) { this->context = static_cast(context); std::set rootDeviceIndices; uint32_t maxRootDeviceIndex = 0u; DriverHandleImp *driverHandleImp = static_cast(driver); bool useDevicesFromApi = true; bool useDeviceAlloc = isEventPoolDeviceAllocationFlagSet(); if (numDevices == 0) { numDevices = static_cast(driverHandleImp->devices.size()); useDevicesFromApi = false; } for (uint32_t i = 0u; i < numDevices; i++) { Device *eventDevice = nullptr; if (useDevicesFromApi) { eventDevice = Device::fromHandle(phDevices[i]); } else { eventDevice = driverHandleImp->devices[i]; } if (!eventDevice) { return ZE_RESULT_ERROR_INVALID_ARGUMENT; } devices.push_back(eventDevice); rootDeviceIndices.insert(eventDevice->getNEODevice()->getRootDeviceIndex()); if (maxRootDeviceIndex < eventDevice->getNEODevice()->getRootDeviceIndex()) { maxRootDeviceIndex = eventDevice->getNEODevice()->getRootDeviceIndex(); } } auto &hwHelper = devices[0]->getHwHelper(); eventAlignment = static_cast(hwHelper.getTimestampPacketAllocatorAlignment()); eventSize = static_cast(alignUp(EventPacketsCount::eventPackets * hwHelper.getSingleTimestampPacketSize(), eventAlignment)); size_t alignedSize = alignUp(numEvents * eventSize, MemoryConstants::pageSize64k); NEO::GraphicsAllocation::AllocationType allocationType = isEventPoolTimestampFlagSet() ? NEO::GraphicsAllocation::AllocationType::TIMESTAMP_PACKET_TAG_BUFFER : NEO::GraphicsAllocation::AllocationType::BUFFER_HOST_MEMORY; if (this->devices.size() > 1) { useDeviceAlloc = false; } if (useDeviceAlloc && !isEventPoolTimestampFlagSet()) { allocationType = NEO::GraphicsAllocation::AllocationType::GPU_TIMESTAMP_DEVICE_BUFFER; } eventPoolAllocations = std::make_unique(maxRootDeviceIndex); bool allocatedMemory = false; if (useDeviceAlloc) { NEO::AllocationProperties allocationProperties{*rootDeviceIndices.begin(), alignedSize, allocationType, devices[0]->getNEODevice()->getDeviceBitfield()}; allocationProperties.alignment = eventAlignment; auto graphicsAllocation = driver->getMemoryManager()->allocateGraphicsMemoryWithProperties(allocationProperties); if (graphicsAllocation) { eventPoolAllocations->addAllocation(graphicsAllocation); allocatedMemory = true; } } else { NEO::AllocationProperties allocationProperties{*rootDeviceIndices.begin(), alignedSize, allocationType, systemMemoryBitfield}; allocationProperties.alignment = eventAlignment; std::vector rootDeviceIndicesVector = {rootDeviceIndices.begin(), rootDeviceIndices.end()}; eventPoolPtr = driver->getMemoryManager()->createMultiGraphicsAllocationInSystemMemoryPool(rootDeviceIndicesVector, allocationProperties, *eventPoolAllocations); allocatedMemory = (nullptr != eventPoolPtr); } if (!allocatedMemory) { return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY; } return ZE_RESULT_SUCCESS; } EventPoolImp::~EventPoolImp() { if (eventPoolAllocations) { auto graphicsAllocations = eventPoolAllocations->getGraphicsAllocations(); auto memoryManager = devices[0]->getDriverHandle()->getMemoryManager(); for (auto gpuAllocation : graphicsAllocations) { memoryManager->freeGraphicsMemory(gpuAllocation); } } } ze_result_t EventPoolImp::destroy() { delete this; return ZE_RESULT_SUCCESS; } ze_result_t EventPoolImp::createEvent(const ze_event_desc_t *desc, ze_event_handle_t *phEvent) { if (desc->index > (getNumEvents() - 1)) { return ZE_RESULT_ERROR_INVALID_ARGUMENT; } auto &l0HwHelper = L0HwHelper::get(getDevice()->getHwInfo().platform.eRenderCoreFamily); *phEvent = l0HwHelper.createEvent(this, desc, getDevice()); return ZE_RESULT_SUCCESS; } ze_result_t Event::destroy() { delete this; return ZE_RESULT_SUCCESS; } EventPool *EventPool::create(DriverHandle *driver, Context *context, uint32_t numDevices, ze_device_handle_t *phDevices, const ze_event_pool_desc_t *desc) { auto eventPool = std::make_unique(desc); if (!eventPool) { DEBUG_BREAK_IF(true); return nullptr; } ze_result_t result = eventPool->initialize(driver, context, numDevices, phDevices); if (result) { return nullptr; } return eventPool.release(); } } // namespace L0