90 lines
3.0 KiB
C++
90 lines
3.0 KiB
C++
//===--- 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 Context abstraction.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "L0Context.h"
|
|
#include "L0Plugin.h"
|
|
|
|
namespace llvm::omp::target::plugin {
|
|
|
|
Error L0ContextTy::init() {
|
|
auto cleanupOnError = [&]() {
|
|
if (zeContext) {
|
|
zeContextDestroy(zeContext);
|
|
zeContext = nullptr;
|
|
}
|
|
};
|
|
CALL_ZE_RET_ERROR(zeDriverGetApiVersion, zeDriver, &APIVersion);
|
|
ODBG(OLDT_Init) << "Driver API version is "
|
|
<< llvm::format(PRIx32, APIVersion);
|
|
|
|
ze_context_desc_t Desc{ZE_STRUCTURE_TYPE_CONTEXT_DESC, nullptr, 0};
|
|
CALL_ZE_RET_ERROR(zeContextCreate, zeDriver, &Desc, &zeContext);
|
|
|
|
const auto &Options = Plugin.getOptions();
|
|
bool UseCounterBasedEvents = Options.CommandMode == CommandModeTy::InOrder ||
|
|
Options.CommandMode == CommandModeTy::Sync;
|
|
if (UseCounterBasedEvents)
|
|
ODBG(OLDT_Init) << "Using counter-based events for "
|
|
<< (Options.CommandMode == CommandModeTy::InOrder
|
|
? "InOrder"
|
|
: "Sync")
|
|
<< " command mode";
|
|
|
|
if (auto Err = EventPool.init(zeContext, UseCounterBasedEvents,
|
|
/* Flags */ 0)) {
|
|
cleanupOnError();
|
|
return Err;
|
|
}
|
|
if (auto Err = HostMemAllocator.initHostPool(*this, Plugin.getOptions())) {
|
|
if (auto DeinitErr = EventPool.deinit())
|
|
Err = joinErrors(std::move(Err), std::move(DeinitErr));
|
|
cleanupOnError();
|
|
return Err;
|
|
}
|
|
|
|
ze_result_t RC;
|
|
CALL_ZE(RC, zeDriverGetExtensionFunctionAddress, zeDriver,
|
|
"zexKernelGetArgumentSize", (void **)&zexKernelGetArgumentSize);
|
|
if (RC != ZE_RESULT_SUCCESS)
|
|
zexKernelGetArgumentSize = nullptr;
|
|
|
|
CALL_ZE(RC, zeDriverGetExtensionFunctionAddress, zeDriver,
|
|
"zeCommandListAppendHostFunction",
|
|
(void **)&zeCommandListAppendHostFunction);
|
|
if (RC != ZE_RESULT_SUCCESS)
|
|
zeCommandListAppendHostFunction = nullptr;
|
|
|
|
return Plugin::success();
|
|
}
|
|
|
|
Error L0ContextTy::deinit() {
|
|
if (auto Err = EventPool.deinit())
|
|
return Err;
|
|
if (auto Err = HostMemAllocator.deinit())
|
|
return Err;
|
|
if (zeContext)
|
|
CALL_ZE_RET_ERROR(zeContextDestroy, zeContext);
|
|
return Plugin::success();
|
|
}
|
|
|
|
StagingBufferTy &L0ContextTy::getStagingBuffer() {
|
|
auto &TLS = Plugin.getContextTLS(getZeContext());
|
|
auto &Buffer = TLS.getStagingBuffer();
|
|
const auto &Options = Plugin.getOptions();
|
|
if (!Buffer.initialized())
|
|
Buffer.init(getZeContext(), Options.StagingBufferSize,
|
|
Options.StagingBufferCount);
|
|
return Buffer;
|
|
}
|
|
|
|
} // namespace llvm::omp::target::plugin
|