/
pccc
/
pccc-mlir
Обзор
Документация
Войти
/
pccc
/
pccc-mlir
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
offload/plugins-nextgen/level_zero/src/L0Event.cpp
107 строк
3 KB
obitotsky
fork mlir
19 июл 2026, 07:05
Верифицирован
19 июл 2026, 07:05
6422b87
Код
Авторство
О чём код?
//===--- Level Zero Target RTL Implementation -----------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Level Zero Event and Event Pool implementations. // //===----------------------------------------------------------------------===// #include "L0Event.h" #include "L0Device.h" #include "L0Trace.h" namespace llvm::omp::target::plugin { Expected<ze_event_handle_t> EventPoolTy::getEventLocked() { if (Events.empty()) { // Need to create a new L0 pool. ze_event_pool_desc_t Desc{/* stype */ ZE_STRUCTURE_TYPE_EVENT_POOL_DESC, /* pNext */ nullptr, /* flags */ 0, /* count */ 0}; Desc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE | Flags; Desc.count = static_cast<uint32_t>(PoolSize); ze_event_pool_counter_based_exp_desc_t CounterBasedDesc = { ZE_STRUCTURE_TYPE_COUNTER_BASED_EVENT_POOL_EXP_DESC, /* pNext */ nullptr, /* flags */ 0}; CounterBasedDesc.flags = ZE_EVENT_POOL_COUNTER_BASED_EXP_FLAG_IMMEDIATE; if (UseCounterBasedEvents) Desc.pNext = &CounterBasedDesc; ze_event_pool_handle_t Pool; CALL_ZE_RET_ERROR(zeEventPoolCreate, Context, &Desc, 0, nullptr, &Pool); Pools.push_back(Pool); // Create events. ze_event_desc_t EventDesc{ZE_STRUCTURE_TYPE_EVENT_DESC, nullptr, 0, 0, 0}; EventDesc.wait = 0; EventDesc.signal = ZE_EVENT_SCOPE_FLAG_HOST; uint32_t CreatedEvents = 0; for (uint32_t EventIdx = 0; EventIdx < PoolSize; EventIdx++) { EventDesc.index = EventIdx; ze_event_handle_t Event; ze_result_t RC; CALL_ZE(RC, zeEventCreate, Pool, &EventDesc, &Event); if (RC != ZE_RESULT_SUCCESS) { // Log the error and skip this event. ODBG(OLDT_Init) << "Warning: zeEventCreate failed at index " << EventIdx << " with code " << RC << ". Skipping this event."; continue; } Events.push_back(Event); CreatedEvents++; } PoolSize = CreatedEvents; ODBG(OLDT_Init) << "Created a new event pool " << Pool << " with " << PoolSize << " events"; } auto Ret = Events.back(); Events.pop_back(); return Ret; } /// Return an event to the pool. Error EventPoolTy::releaseEvent(ze_event_handle_t Event) { std::lock_guard<std::mutex> Lock(*Mtx); if (!UseCounterBasedEvents) CALL_ZE_RET_ERROR(zeEventHostReset, Event); Events.push_back(Event); return Plugin::success(); } Expected<L0EventTy *> EventPoolTy::getEventObject() { std::lock_guard<std::mutex> Lock(*Mtx); if (EventObjects.empty()) { auto EventOrErr = getEventLocked(); if (!EventOrErr) return EventOrErr.takeError(); auto Event = *EventOrErr; auto *EventObj = new L0EventTy(Event, UseCounterBasedEvents); return EventObj; } auto *Ret = EventObjects.back(); if (auto Err = Ret->reset()) return std::move(Err); EventObjects.pop_back(); return Ret; } Error EventPoolTy::releaseEventObject(L0EventTy *EventObj) { std::lock_guard<std::mutex> Lock(*Mtx); EventObjects.push_back(EventObj); return Plugin::success(); } } // namespace llvm::omp::target::plugin