mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-10 12:53:42 +08:00
Fix: Flush on svmMap on multi device 2/n
Previous fix was causing the runtime to get buffer size without gfx allocation, causing a seg fault. This commit moves the fix logic to enqueue handler, only changing the enqueueProperties. Related-To: NEO-6948 Signed-off-by: Dominik Dabek <dominik.dabek@intel.com>
This commit is contained in:

committed by
Compute-Runtime-Automation

parent
6ab6e1abff
commit
39dfaf64bc
@ -41,13 +41,7 @@ void CommandQueueHw<Family>::submitCacheFlush(Surface **surfaces,
|
||||
|
||||
template <>
|
||||
bool CommandQueueHw<Family>::isCacheFlushCommand(uint32_t commandType) const {
|
||||
if (commandType == CL_COMMAND_RESOURCE_BARRIER) {
|
||||
return true;
|
||||
} else if (commandType == CL_COMMAND_SVM_MAP) {
|
||||
CommandStreamReceiver &computeCommandStreamReceiver = this->getGpgpuCommandStreamReceiver();
|
||||
return computeCommandStreamReceiver.isDirectSubmissionEnabled() && computeCommandStreamReceiver.isUpdateTagFromWaitEnabled();
|
||||
}
|
||||
return false;
|
||||
return commandType == CL_COMMAND_RESOURCE_BARRIER;
|
||||
}
|
||||
|
||||
template <>
|
||||
|
@ -255,7 +255,8 @@ cl_int CommandQueueHw<GfxFamily>::enqueueHandler(Surface **surfacesForResidency,
|
||||
}
|
||||
|
||||
CompletionStamp completionStamp = {CompletionStamp::notReady, taskLevel, 0};
|
||||
const EnqueueProperties enqueueProperties(false, !multiDispatchInfo.empty(), isCacheFlushCommand(commandType),
|
||||
bool svmMapNeedsDcFlush = commandType == CL_COMMAND_SVM_MAP && computeCommandStreamReceiver.isDirectSubmissionEnabled() && computeCommandStreamReceiver.isUpdateTagFromWaitEnabled();
|
||||
const EnqueueProperties enqueueProperties(false, !multiDispatchInfo.empty(), isCacheFlushCommand(commandType) || svmMapNeedsDcFlush,
|
||||
flushDependenciesForNonKernelCommand, isMarkerWithProfiling, &blitPropertiesContainer);
|
||||
|
||||
if (!blockQueue && isOOQEnabled()) {
|
||||
|
@ -5,6 +5,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "shared/source/memory_manager/unified_memory_manager.h"
|
||||
#include "shared/test/common/helpers/unit_test_helper.h"
|
||||
#include "shared/test/common/mocks/mock_allocation_properties.h"
|
||||
#include "shared/test/common/mocks/mock_builtins.h"
|
||||
@ -1161,32 +1162,57 @@ HWTEST_F(CommandQueueHwTest, givenNoGpuHangWhenFinishingCommandQueueHwThenWaitFo
|
||||
EXPECT_EQ(CL_SUCCESS, finishResult);
|
||||
}
|
||||
|
||||
HWTEST2_F(CommandQueueHwTest, givenCommandSvmMapAndDirectSubmissionEnabledAndUpdateTagFromWaitEnabledWhenCheckIsCacheFlushCommandThenReturnTrue, IsAtLeastXeHpCore) {
|
||||
HWTEST2_F(CommandQueueHwTest, givenDirectSubmissionEnabledAndUpdateTagFromWaitEnabledWhenEnqueueSvmMapThenOperationTypeIsExplicitCacheFlush, IsAtLeastXeHpCore) {
|
||||
DebugManagerStateRestore restorer;
|
||||
RootDeviceIndicesContainer rootDeviceIndices = {rootDeviceIndex, rootDeviceIndex};
|
||||
std::map<uint32_t, DeviceBitfield> deviceBitfields{{rootDeviceIndex, pDevice->getDeviceBitfield()}};
|
||||
|
||||
MockCommandQueueHw<FamilyType> mockCmdQueueHw{context, pClDevice, nullptr};
|
||||
auto allocation = context->getSVMAllocsManager()->createSVMAlloc(1, SVMAllocsManager::SvmAllocationProperties{}, rootDeviceIndices, deviceBitfields);
|
||||
|
||||
{
|
||||
mockCmdQueueHw.getUltCommandStreamReceiver().directSubmissionAvailable = false;
|
||||
ASSERT_FALSE(mockCmdQueueHw.getUltCommandStreamReceiver().isDirectSubmissionEnabled());
|
||||
DebugManager.flags.UpdateTaskCountFromWait.set(0);
|
||||
ASSERT_FALSE(mockCmdQueueHw.getUltCommandStreamReceiver().isUpdateTagFromWaitEnabled());
|
||||
EXPECT_FALSE(mockCmdQueueHw.isCacheFlushCommand(CL_COMMAND_SVM_MAP));
|
||||
|
||||
mockCmdQueueHw.getUltCommandStreamReceiver().directSubmissionAvailable = true;
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isDirectSubmissionEnabled());
|
||||
DebugManager.flags.UpdateTaskCountFromWait.set(0);
|
||||
ASSERT_FALSE(mockCmdQueueHw.getUltCommandStreamReceiver().isUpdateTagFromWaitEnabled());
|
||||
EXPECT_FALSE(mockCmdQueueHw.isCacheFlushCommand(CL_COMMAND_SVM_MAP));
|
||||
|
||||
mockCmdQueueHw.getUltCommandStreamReceiver().directSubmissionAvailable = false;
|
||||
ASSERT_FALSE(mockCmdQueueHw.getUltCommandStreamReceiver().isDirectSubmissionEnabled());
|
||||
DebugManager.flags.UpdateTaskCountFromWait.set(3);
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isUpdateTagFromWaitEnabled());
|
||||
EXPECT_FALSE(mockCmdQueueHw.isCacheFlushCommand(CL_COMMAND_SVM_MAP));
|
||||
|
||||
mockCmdQueueHw.getUltCommandStreamReceiver().directSubmissionAvailable = true;
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isDirectSubmissionEnabled());
|
||||
DebugManager.flags.UpdateTaskCountFromWait.set(3);
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isUpdateTagFromWaitEnabled());
|
||||
EXPECT_TRUE(mockCmdQueueHw.isCacheFlushCommand(CL_COMMAND_SVM_MAP));
|
||||
EXPECT_FALSE(mockCmdQueueHw.isCacheFlushCommand(CL_COMMAND_NDRANGE_KERNEL));
|
||||
auto status = mockCmdQueueHw.enqueueSVMMap(true, 0, allocation, 1, 0, nullptr, nullptr, false);
|
||||
ASSERT_EQ(status, CL_SUCCESS);
|
||||
EXPECT_EQ(mockCmdQueueHw.latestSentEnqueueType, EnqueueProperties::Operation::EnqueueWithoutSubmission);
|
||||
}
|
||||
|
||||
{
|
||||
mockCmdQueueHw.getUltCommandStreamReceiver().directSubmissionAvailable = true;
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isDirectSubmissionEnabled());
|
||||
DebugManager.flags.UpdateTaskCountFromWait.set(0);
|
||||
ASSERT_FALSE(mockCmdQueueHw.getUltCommandStreamReceiver().isUpdateTagFromWaitEnabled());
|
||||
|
||||
auto status = mockCmdQueueHw.enqueueSVMMap(true, 0, allocation, 1, 0, nullptr, nullptr, false);
|
||||
ASSERT_EQ(status, CL_SUCCESS);
|
||||
EXPECT_EQ(mockCmdQueueHw.latestSentEnqueueType, EnqueueProperties::Operation::EnqueueWithoutSubmission);
|
||||
}
|
||||
|
||||
{
|
||||
mockCmdQueueHw.getUltCommandStreamReceiver().directSubmissionAvailable = false;
|
||||
ASSERT_FALSE(mockCmdQueueHw.getUltCommandStreamReceiver().isDirectSubmissionEnabled());
|
||||
DebugManager.flags.UpdateTaskCountFromWait.set(3);
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isUpdateTagFromWaitEnabled());
|
||||
|
||||
auto status = mockCmdQueueHw.enqueueSVMMap(true, 0, allocation, 1, 0, nullptr, nullptr, false);
|
||||
ASSERT_EQ(status, CL_SUCCESS);
|
||||
EXPECT_EQ(mockCmdQueueHw.latestSentEnqueueType, EnqueueProperties::Operation::EnqueueWithoutSubmission);
|
||||
}
|
||||
|
||||
{
|
||||
mockCmdQueueHw.getUltCommandStreamReceiver().directSubmissionAvailable = true;
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isDirectSubmissionEnabled());
|
||||
DebugManager.flags.UpdateTaskCountFromWait.set(3);
|
||||
ASSERT_TRUE(mockCmdQueueHw.getUltCommandStreamReceiver().isUpdateTagFromWaitEnabled());
|
||||
|
||||
auto status = mockCmdQueueHw.enqueueSVMMap(true, 0, allocation, 1, 0, nullptr, nullptr, false);
|
||||
ASSERT_EQ(status, CL_SUCCESS);
|
||||
EXPECT_EQ(mockCmdQueueHw.latestSentEnqueueType, EnqueueProperties::Operation::ExplicitCacheFlush);
|
||||
}
|
||||
|
||||
context->getSVMAllocsManager()->freeSVMAlloc(allocation);
|
||||
}
|
Reference in New Issue
Block a user