Allow Explicit RTDispatch args and remove multi free of rtMemoryBackedBuffer

Signed-off-by: Neil R Spruit <neil.r.spruit@intel.com>
This commit is contained in:
Neil R Spruit 2021-12-21 01:05:25 +00:00 committed by Compute-Runtime-Automation
parent 6ab4b566aa
commit 64ca4b3456
3 changed files with 93 additions and 51 deletions

View File

@ -887,18 +887,23 @@ ze_result_t KernelImp::initialize(const ze_kernel_desc_t *desc) {
kernelDescriptor.kernelAttributes.hasNonKernelArgAtomic; kernelDescriptor.kernelAttributes.hasNonKernelArgAtomic;
if (this->usesRayTracing()) { if (this->usesRayTracing()) {
uint32_t bvhLevels = NEO::RayTracingHelper::maxBvhLevels; if (this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize > 0) {
neoDevice->initializeRayTracing(bvhLevels); uint32_t bvhLevels = NEO::RayTracingHelper::maxBvhLevels;
auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(bvhLevels); neoDevice->initializeRayTracing(bvhLevels);
if (rtDispatchGlobals == nullptr) { auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(bvhLevels);
return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY; if (rtDispatchGlobals == nullptr) {
} return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY;
this->residencyContainer.push_back(neoDevice->getRTMemoryBackedBuffer()); }
this->residencyContainer.push_back(rtDispatchGlobals); this->residencyContainer.push_back(neoDevice->getRTMemoryBackedBuffer());
this->residencyContainer.push_back(rtDispatchGlobals);
NEO::patchPointer(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize), NEO::patchPointer(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize),
this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals, this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals,
static_cast<uintptr_t>(rtDispatchGlobals->getGpuAddressToPatch())); static_cast<uintptr_t>(rtDispatchGlobals->getGpuAddressToPatch()));
} else {
neoDevice->initializeRayTracing(0);
this->residencyContainer.push_back(neoDevice->getRTMemoryBackedBuffer());
}
} }
return ZE_RESULT_SUCCESS; return ZE_RESULT_SUCCESS;

View File

@ -608,6 +608,7 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenRayTracingIsInitialized
std::unique_ptr<MockImmutableData> mockKernelImmutableData = std::unique_ptr<MockImmutableData> mockKernelImmutableData =
std::make_unique<MockImmutableData>(32u); std::make_unique<MockImmutableData>(32u);
mockKernelImmutableData->kernelDescriptor = &mockDescriptor; mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4;
ModuleBuildLog *moduleBuildLog = nullptr; ModuleBuildLog *moduleBuildLog = nullptr;
module = std::make_unique<MockModule>(device, module = std::make_unique<MockModule>(device,
@ -643,6 +644,81 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenRayTracingIsInitialized
EXPECT_EQ(kernel->getResidencyContainer()[residencySize - 1], rtDispatchGlobals); EXPECT_EQ(kernel->getResidencyContainer()[residencySize - 1], rtDispatchGlobals);
} }
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueButKernelDoesNotHaveRTDGAllocationTokenThenRayTracingStillEnabledWithoutAllocation) {
KernelDescriptorRTCallsTrue mockDescriptor = {};
mockDescriptor.kernelMetadata.kernelName = "rt_test";
for (auto i = 0u; i < 3u; i++) {
mockDescriptor.kernelAttributes.requiredWorkgroupSize[i] = 0;
}
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
std::make_unique<MockImmutableData>(32u);
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
ModuleBuildLog *moduleBuildLog = nullptr;
module = std::make_unique<MockModule>(device,
moduleBuildLog,
ModuleType::User,
32u,
mockKernelImmutableData.get());
module->maxGroupSize = 10;
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
ze_kernel_desc_t kernelDesc = {};
kernelDesc.pKernelName = "rt_test";
auto immDataVector =
const_cast<std::vector<std::unique_ptr<KernelImmutableData>> *>(&module.get()->getKernelImmutableDataVector());
immDataVector->push_back(std::move(mockKernelImmutableData));
auto result = kernel->initialize(&kernelDesc);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_NE(nullptr, module.get()->getDevice()->getNEODevice()->getRTMemoryBackedBuffer());
auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(NEO::RayTracingHelper::maxBvhLevels);
EXPECT_EQ(nullptr, rtDispatchGlobals);
}
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueAndNoRTDispatchGlobalsIsAllocatedThenRayTracingIsNotInitialized) {
KernelDescriptorRTCallsTrue mockDescriptor = {};
mockDescriptor.kernelMetadata.kernelName = "rt_test";
for (auto i = 0u; i < 3u; i++) {
mockDescriptor.kernelAttributes.requiredWorkgroupSize[i] = 0;
}
mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4;
NEO::MemoryManager *currMemoryManager = new NEO::FailMemoryManager(0, *neoDevice->executionEnvironment);
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
std::make_unique<MockImmutableData>(32u);
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
ModuleBuildLog *moduleBuildLog = nullptr;
module = std::make_unique<MockModule>(device,
moduleBuildLog,
ModuleType::User,
32u,
mockKernelImmutableData.get());
module->maxGroupSize = 10;
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
ze_kernel_desc_t kernelDesc = {};
kernelDesc.pKernelName = "rt_test";
auto immDataVector =
const_cast<std::vector<std::unique_ptr<KernelImmutableData>> *>(&module.get()->getKernelImmutableDataVector());
immDataVector->push_back(std::move(mockKernelImmutableData));
neoDevice->injectMemoryManager(currMemoryManager);
EXPECT_EQ(ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY, kernel->initialize(&kernelDesc));
}
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsFalseThenRayTracingIsNotInitialized) { TEST_F(KernelImmutableDataTests, whenHasRTCallsIsFalseThenRayTracingIsNotInitialized) {
KernelDescriptorRTCallsFalse mockDescriptor = {}; KernelDescriptorRTCallsFalse mockDescriptor = {};
mockDescriptor.kernelMetadata.kernelName = "rt_test"; mockDescriptor.kernelMetadata.kernelName = "rt_test";
@ -677,42 +753,6 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsFalseThenRayTracingIsNotInitial
EXPECT_EQ(nullptr, module.get()->getDevice()->getNEODevice()->getRTMemoryBackedBuffer()); EXPECT_EQ(nullptr, module.get()->getDevice()->getNEODevice()->getRTMemoryBackedBuffer());
} }
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueAndNoRTDispatchGlobalsIsAllocatedThenRayTracingIsNotInitialized) {
KernelDescriptorRTCallsTrue mockDescriptor = {};
mockDescriptor.kernelMetadata.kernelName = "rt_test";
for (auto i = 0u; i < 3u; i++) {
mockDescriptor.kernelAttributes.requiredWorkgroupSize[i] = 0;
}
NEO::MemoryManager *currMemoryManager = new NEO::FailMemoryManager(0, *neoDevice->executionEnvironment);
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
std::make_unique<MockImmutableData>(32u);
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
ModuleBuildLog *moduleBuildLog = nullptr;
module = std::make_unique<MockModule>(device,
moduleBuildLog,
ModuleType::User,
32u,
mockKernelImmutableData.get());
module->maxGroupSize = 10;
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
ze_kernel_desc_t kernelDesc = {};
kernelDesc.pKernelName = "rt_test";
auto immDataVector =
const_cast<std::vector<std::unique_ptr<KernelImmutableData>> *>(&module.get()->getKernelImmutableDataVector());
immDataVector->push_back(std::move(mockKernelImmutableData));
neoDevice->injectMemoryManager(currMemoryManager);
EXPECT_EQ(ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY, kernel->initialize(&kernelDesc));
}
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenCrossThreadDataIsPatched) { TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenCrossThreadDataIsPatched) {
KernelDescriptorRTCallsTrue mockDescriptor = {}; KernelDescriptorRTCallsTrue mockDescriptor = {};
mockDescriptor.kernelMetadata.kernelName = "rt_test"; mockDescriptor.kernelMetadata.kernelName = "rt_test";
@ -723,6 +763,7 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenCrossThreadDataIsPatche
std::unique_ptr<MockImmutableData> mockKernelImmutableData = std::unique_ptr<MockImmutableData> mockKernelImmutableData =
std::make_unique<MockImmutableData>(32u); std::make_unique<MockImmutableData>(32u);
mockKernelImmutableData->kernelDescriptor = &mockDescriptor; mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4;
ModuleBuildLog *moduleBuildLog = nullptr; ModuleBuildLog *moduleBuildLog = nullptr;
module = std::make_unique<MockModule>(device, module = std::make_unique<MockModule>(device,

View File

@ -43,12 +43,8 @@ Device::~Device() {
} }
finalizeRayTracing(); finalizeRayTracing();
getMemoryManager()->freeGraphicsMemory(rtMemoryBackedBuffer);
rtMemoryBackedBuffer = nullptr;
DEBUG_BREAK_IF(nullptr == executionEnvironment->memoryManager.get()); DEBUG_BREAK_IF(nullptr == executionEnvironment->memoryManager.get());
getMemoryManager()->freeGraphicsMemory(rtMemoryBackedBuffer);
rtMemoryBackedBuffer = nullptr;
if (performanceCounters) { if (performanceCounters) {
performanceCounters->shutdown(); performanceCounters->shutdown();