Lock BuiltIn to make appendMemory calls thread safe

Change-Id: I14441595d87ef5b0d31cfd96019d3234d4cf29dd
This commit is contained in:
Vinod Tipparaju
2020-08-03 19:33:40 +05:30
parent 15ea74bb5a
commit 7d9d4e743a
3 changed files with 29 additions and 0 deletions

View File

@@ -8,6 +8,7 @@
#pragma once
#include <memory>
#include <mutex>
namespace NEO {
class BuiltIns;
@@ -44,6 +45,7 @@ enum class ImageBuiltin : uint32_t {
};
struct BuiltinFunctionsLib {
using MutexType = std::mutex;
virtual ~BuiltinFunctionsLib() = default;
static std::unique_ptr<BuiltinFunctionsLib> create(Device *device,
NEO::BuiltIns *builtins);
@@ -54,9 +56,12 @@ struct BuiltinFunctionsLib {
virtual void initImageFunctions() = 0;
virtual Kernel *getPageFaultFunction() = 0;
virtual void initPageFaultFunction() = 0;
MOCKABLE_VIRTUAL std::unique_lock<MutexType> obtainUniqueOwnership();
protected:
BuiltinFunctionsLib() = default;
MutexType ownershipMutex;
};
} // namespace L0

View File

@@ -16,6 +16,10 @@ std::unique_ptr<BuiltinFunctionsLib> BuiltinFunctionsLib::create(Device *device,
return std::unique_ptr<BuiltinFunctionsLib>(new BuiltinFunctionsLibImpl(device, builtins));
}
std::unique_lock<BuiltinFunctionsLib::MutexType> BuiltinFunctionsLib::obtainUniqueOwnership() {
return std::unique_lock<BuiltinFunctionsLib::MutexType>(this->ownershipMutex);
}
void BuiltinFunctionsLibImpl::initFunctions() {
for (uint32_t builtId = 0; builtId < static_cast<uint32_t>(Builtin::COUNT); builtId++) {
const char *builtinName = nullptr;

View File

@@ -277,6 +277,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendImageCopyFromMemory(ze_i
rowPitch, slicePitch, bytesPerPixel, {pDstRegion->width, pDstRegion->height, pDstRegion->depth}, {pDstRegion->width, pDstRegion->height, pDstRegion->depth}, imgSize, hEvent);
}
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
Kernel *builtinKernel = nullptr;
switch (bytesPerPixel) {
@@ -391,6 +393,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendImageCopyToMemory(void *
rowPitch, slicePitch, bytesPerPixel, {pSrcRegion->width, pSrcRegion->height, pSrcRegion->depth}, imgSize, {pSrcRegion->width, pSrcRegion->height, pSrcRegion->depth}, hEvent);
}
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
Kernel *builtinKernel = nullptr;
switch (bytesPerPixel) {
@@ -537,6 +541,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendImageCopyRegion(ze_image
dstRowPitch, dstSlicePitch, bytesPerPixel, {srcRegion.width, srcRegion.height, srcRegion.depth}, srcImgSize, dstImgSize, hEvent);
}
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
auto kernel = device->getBuiltinFunctionsLib()->getImageFunction(ImageBuiltin::CopyImageRegion);
if (kernel->suggestGroupSize(groupSizeX, groupSizeY, groupSizeZ, &groupSizeX,
@@ -603,6 +609,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopyKernelWithGA(v
uint32_t elementSize,
Builtin builtin) {
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
auto builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin);
uint32_t groupSizeX = builtinFunction->getImmutableData()
@@ -713,6 +721,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendPageFaultCopy(NEO::Graph
NEO::GraphicsAllocation *srcptr,
size_t size, bool flushHost) {
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
auto builtinFunction = device->getBuiltinFunctionsLib()->getPageFaultFunction();
uint32_t groupSizeX = builtinFunction->getImmutableData()
@@ -758,6 +768,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopy(void *dstptr,
uint32_t numWaitEvents,
ze_event_handle_t *phWaitEvents) {
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
using GfxFamily = typename NEO::GfxFamilyMapper<gfxCoreFamily>::GfxFamily;
uintptr_t start = reinterpret_cast<uintptr_t>(dstptr);
@@ -846,6 +858,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopyRegion(void *d
uint32_t srcPitch,
uint32_t srcSlicePitch,
ze_event_handle_t hSignalEvent) {
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
size_t dstSize = 0;
size_t srcSize = 0;
@@ -917,6 +931,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopyKernel3d(NEO::
uint32_t numWaitEvents,
ze_event_handle_t *phWaitEvents) {
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
auto builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin);
uint32_t groupSizeX = srcRegion->width;
@@ -975,6 +991,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryCopyKernel2d(NEO::
uint32_t numWaitEvents,
ze_event_handle_t *phWaitEvents) {
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
auto builtinFunction = device->getBuiltinFunctionsLib()->getFunction(builtin);
uint32_t groupSizeX = srcRegion->width;
@@ -1061,6 +1079,8 @@ ze_result_t CommandListCoreFamily<gfxCoreFamily>::appendMemoryFill(void *ptr,
size_t srcOffset = 0;
NEO::EncodeSurfaceState<GfxFamily>::getSshAlignedPointer(srcPtr, srcOffset);
auto lock = device->getBuiltinFunctionsLib()->obtainUniqueOwnership();
Kernel *builtinFunction = nullptr;
uint32_t groupSizeX = 1u;