mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Enable sfence instruction programming for DirectSubmission dispatch
Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:

committed by
Compute-Runtime-Automation

parent
f4407064a4
commit
6e9c890890
@ -38,6 +38,12 @@ struct TagData {
|
||||
uint64_t tagValue = 0ull;
|
||||
};
|
||||
|
||||
enum class DirectSubmissionSfenceMode : int32_t {
|
||||
Disabled = 0,
|
||||
BeforeSemaphoreOnly = 1,
|
||||
BeforeAndAfterSemaphore = 2
|
||||
};
|
||||
|
||||
namespace UllsDefaults {
|
||||
constexpr bool defaultDisableCacheFlush = true;
|
||||
constexpr bool defaultDisableMonitorFence = false;
|
||||
@ -153,6 +159,7 @@ class DirectSubmissionHw {
|
||||
uint32_t workloadModeOneExpectedValue = 0u;
|
||||
uint32_t activeTiles = 1u;
|
||||
uint32_t postSyncOffset = 0u;
|
||||
DirectSubmissionSfenceMode sfenceMode = DirectSubmissionSfenceMode::BeforeAndAfterSemaphore;
|
||||
volatile uint32_t reserved = 0u;
|
||||
|
||||
bool ringStart = false;
|
||||
|
@ -39,6 +39,10 @@ DirectSubmissionHw<GfxFamily, Dispatcher>::DirectSubmissionHw(Device &device,
|
||||
disableCacheFlush = !!DebugManager.flags.DirectSubmissionDisableCacheFlush.get();
|
||||
}
|
||||
|
||||
if (DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get() != -1) {
|
||||
sfenceMode = static_cast<DirectSubmissionSfenceMode>(DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get());
|
||||
}
|
||||
|
||||
int32_t disableCacheFlushKey = DebugManager.flags.DirectSubmissionDisableCpuCacheFlush.get();
|
||||
if (disableCacheFlushKey != -1) {
|
||||
disableCpuCacheFlush = disableCacheFlushKey == 1 ? true : false;
|
||||
@ -435,14 +439,14 @@ bool DirectSubmissionHw<GfxFamily, Dispatcher>::dispatchCommandBuffer(BatchBuffe
|
||||
reserved = *ringBufferStart;
|
||||
}
|
||||
|
||||
if (DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get() >= 1) {
|
||||
if (sfenceMode >= DirectSubmissionSfenceMode::BeforeSemaphoreOnly) {
|
||||
CpuIntrinsics::sfence();
|
||||
}
|
||||
|
||||
//unblock GPU
|
||||
semaphoreData->QueueWorkCount = currentQueueWorkCount;
|
||||
|
||||
if (DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get() == 2) {
|
||||
if (sfenceMode == DirectSubmissionSfenceMode::BeforeAndAfterSemaphore) {
|
||||
CpuIntrinsics::sfence();
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "shared/source/command_container/implicit_scaling.h"
|
||||
#include "shared/source/command_stream/submissions_aggregator.h"
|
||||
#include "shared/source/debug_settings/debug_settings_manager.h"
|
||||
#include "shared/source/direct_submission/direct_submission_hw.h"
|
||||
#include "shared/source/direct_submission/dispatchers/render_dispatcher.h"
|
||||
#include "shared/source/helpers/flush_stamp.h"
|
||||
#include "shared/source/utilities/cpuintrinsics.h"
|
||||
@ -708,23 +709,22 @@ HWTEST_F(DirectSubmissionDispatchBufferTest,
|
||||
HWTEST_F(DirectSubmissionDispatchBufferTest, givenDebugFlagSetWhenDispatchingWorkloadThenProgramSfenceInstruction) {
|
||||
DebugManagerStateRestore restorer{};
|
||||
|
||||
DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.set(1);
|
||||
using Dispatcher = BlitterDispatcher<FamilyType>;
|
||||
|
||||
FlushStampTracker flushStamp(true);
|
||||
|
||||
MockDirectSubmissionHw<FamilyType, Dispatcher> directSubmission(*pDevice, *osContext.get());
|
||||
EXPECT_TRUE(directSubmission.initialize(true, true));
|
||||
for (int32_t debugFlag : {-1, 0, 1, 2}) {
|
||||
DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.set(debugFlag);
|
||||
|
||||
auto initialCounterValue = CpuIntrinsicsTests::sfenceCounter.load();
|
||||
MockDirectSubmissionHw<FamilyType, Dispatcher> directSubmission(*pDevice, *osContext.get());
|
||||
EXPECT_TRUE(directSubmission.initialize(true, true));
|
||||
|
||||
EXPECT_TRUE(directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp));
|
||||
auto initialCounterValue = CpuIntrinsicsTests::sfenceCounter.load();
|
||||
|
||||
EXPECT_EQ(initialCounterValue + 1, CpuIntrinsicsTests::sfenceCounter);
|
||||
EXPECT_TRUE(directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp));
|
||||
|
||||
DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.set(2);
|
||||
uint32_t expectedCount = (debugFlag == -1) ? 2 : static_cast<uint32_t>(debugFlag);
|
||||
|
||||
EXPECT_TRUE(directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp));
|
||||
|
||||
EXPECT_EQ(initialCounterValue + 3, CpuIntrinsicsTests::sfenceCounter);
|
||||
EXPECT_EQ(initialCounterValue + expectedCount, CpuIntrinsicsTests::sfenceCounter);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user