Skip to content

Commit 8e33ec0

Browse files
Create separate command stream receiver for every device.
Change-Id: I8073380941e2a3bfe57610e6e437bdc177dcc2d5
1 parent 3f6a941 commit 8e33ec0

File tree

11 files changed

+113
-72
lines changed

11 files changed

+113
-72
lines changed

runtime/command_stream/command_stream_receiver.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,9 +360,6 @@ void CommandStreamReceiver::setExperimentalCmdBuffer(std::unique_ptr<Experimenta
360360
}
361361

362362
bool CommandStreamReceiver::initializeTagAllocation() {
363-
if (tagAllocation) {
364-
return true;
365-
}
366363
auto tagAllocation = memoryManager->allocateGraphicsMemory(sizeof(uint32_t));
367364
if (!tagAllocation) {
368365
return false;

runtime/device/device.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ Device::~Device() {
103103
performanceCounters->shutdown();
104104
}
105105

106-
if (executionEnvironment->commandStreamReceiver) {
107-
executionEnvironment->commandStreamReceiver->flushBatchedSubmissions();
106+
if (commandStreamReceiver) {
107+
commandStreamReceiver->flushBatchedSubmissions();
108108
}
109109

110110
if (deviceInfo.sourceLevelDebuggerActive && executionEnvironment->sourceLevelDebugger) {
@@ -126,15 +126,15 @@ Device::~Device() {
126126
bool Device::createDeviceImpl(const HardwareInfo *pHwInfo, Device &outDevice) {
127127
auto executionEnvironment = outDevice.executionEnvironment;
128128
executionEnvironment->initGmm(pHwInfo);
129-
if (!executionEnvironment->initializeCommandStreamReceiver(pHwInfo)) {
129+
if (!executionEnvironment->initializeCommandStreamReceiver(pHwInfo, outDevice.getDeviceIndex())) {
130130
return false;
131131
}
132-
executionEnvironment->initializeMemoryManager(outDevice.getEnabled64kbPages(), outDevice.getHardwareCapabilities().localMemorySupported);
132+
executionEnvironment->initializeMemoryManager(outDevice.getEnabled64kbPages(), outDevice.getHardwareCapabilities().localMemorySupported, outDevice.getDeviceIndex());
133133

134134
outDevice.osContext = new OsContext(executionEnvironment->osInterface.get());
135135
executionEnvironment->memoryManager->registerOsContext(outDevice.osContext);
136136

137-
outDevice.commandStreamReceiver = executionEnvironment->commandStreamReceiver.get();
137+
outDevice.commandStreamReceiver = executionEnvironment->commandStreamReceivers[outDevice.getDeviceIndex()].get();
138138
if (!outDevice.commandStreamReceiver->initializeTagAllocation()) {
139139
return false;
140140
}
@@ -246,7 +246,7 @@ unique_ptr_if_unused<Device> Device::release() {
246246

247247
bool Device::isSimulation() const {
248248
bool simulation = hwInfo.capabilityTable.isSimulation(hwInfo.pPlatform->usDeviceID);
249-
if (executionEnvironment->commandStreamReceiver->getType() != CommandStreamReceiverType::CSR_HW) {
249+
if (commandStreamReceiver->getType() != CommandStreamReceiverType::CSR_HW) {
250250
simulation = true;
251251
}
252252
if (hwInfo.pSkuTable->ftrSimulationMode) {

runtime/execution_environment/execution_environment.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,32 @@ void ExecutionEnvironment::initGmm(const HardwareInfo *hwInfo) {
4141
gmmHelper.reset(new GmmHelper(hwInfo));
4242
}
4343
}
44-
bool ExecutionEnvironment::initializeCommandStreamReceiver(const HardwareInfo *pHwInfo) {
45-
if (this->commandStreamReceiver) {
44+
bool ExecutionEnvironment::initializeCommandStreamReceiver(const HardwareInfo *pHwInfo, uint32_t deviceIndex) {
45+
if (deviceIndex + 1 > commandStreamReceivers.size()) {
46+
commandStreamReceivers.resize(deviceIndex + 1);
47+
}
48+
49+
if (this->commandStreamReceivers[deviceIndex]) {
4650
return true;
4751
}
48-
CommandStreamReceiver *commandStreamReceiver = createCommandStream(pHwInfo, *this);
52+
std::unique_ptr<CommandStreamReceiver> commandStreamReceiver(createCommandStream(pHwInfo, *this));
4953
if (!commandStreamReceiver) {
5054
return false;
5155
}
5256
if (pHwInfo->capabilityTable.ftrRenderCompressedBuffers || pHwInfo->capabilityTable.ftrRenderCompressedImages) {
5357
commandStreamReceiver->createPageTableManager();
5458
}
55-
this->commandStreamReceiver.reset(commandStreamReceiver);
59+
this->commandStreamReceivers[deviceIndex] = std::move(commandStreamReceiver);
5660
return true;
5761
}
58-
void ExecutionEnvironment::initializeMemoryManager(bool enable64KBpages, bool enableLocalMemory) {
62+
void ExecutionEnvironment::initializeMemoryManager(bool enable64KBpages, bool enableLocalMemory, uint32_t deviceIndex) {
5963
if (this->memoryManager) {
60-
commandStreamReceiver->setMemoryManager(this->memoryManager.get());
64+
commandStreamReceivers[deviceIndex]->setMemoryManager(this->memoryManager.get());
6165
return;
6266
}
6367

64-
memoryManager.reset(commandStreamReceiver->createMemoryManager(enable64KBpages, enableLocalMemory));
65-
commandStreamReceiver->setMemoryManager(memoryManager.get());
66-
68+
memoryManager.reset(commandStreamReceivers[deviceIndex]->createMemoryManager(enable64KBpages, enableLocalMemory));
69+
commandStreamReceivers[deviceIndex]->setMemoryManager(memoryManager.get());
6770
DEBUG_BREAK_IF(!this->memoryManager);
6871
}
6972
void ExecutionEnvironment::initSourceLevelDebugger(const HardwareInfo &hwInfo) {

runtime/execution_environment/execution_environment.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "runtime/utilities/reference_tracked_object.h"
2525

2626
#include <mutex>
27+
#include <vector>
2728

2829
namespace OCLRT {
2930
class GmmHelper;
@@ -48,8 +49,8 @@ class ExecutionEnvironment : public ReferenceTrackedObject<ExecutionEnvironment>
4849
~ExecutionEnvironment() override;
4950

5051
void initGmm(const HardwareInfo *hwInfo);
51-
bool initializeCommandStreamReceiver(const HardwareInfo *pHwInfo);
52-
void initializeMemoryManager(bool enable64KBpages, bool enableLocalMemory);
52+
bool initializeCommandStreamReceiver(const HardwareInfo *pHwInfo, uint32_t deviceIndex);
53+
void initializeMemoryManager(bool enable64KBpages, bool enableLocalMemory, uint32_t deviceIndex);
5354
void initSourceLevelDebugger(const HardwareInfo &hwInfo);
5455

5556
GmmHelper *getGmmHelper() const;
@@ -58,7 +59,7 @@ class ExecutionEnvironment : public ReferenceTrackedObject<ExecutionEnvironment>
5859

5960
std::unique_ptr<OSInterface> osInterface;
6061
std::unique_ptr<MemoryManager> memoryManager;
61-
std::unique_ptr<CommandStreamReceiver> commandStreamReceiver;
62+
std::vector<std::unique_ptr<CommandStreamReceiver>> commandStreamReceivers;
6263
std::unique_ptr<BuiltIns> builtins;
6364
std::unique_ptr<CompilerInterface> compilerInterface;
6465
std::unique_ptr<SourceLevelDebugger> sourceLevelDebugger;

unit_tests/command_stream/aub_command_stream_receiver_tests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ struct AubExecutionEnvironment {
124124
GraphicsAllocation *commandBuffer = nullptr;
125125
template <typename CsrType>
126126
CsrType *getCsr() {
127-
return static_cast<CsrType *>(executionEnvironment->commandStreamReceiver.get());
127+
return static_cast<CsrType *>(executionEnvironment->commandStreamReceivers[0u].get());
128128
}
129129
~AubExecutionEnvironment() {
130130
if (commandBuffer) {
@@ -136,11 +136,11 @@ struct AubExecutionEnvironment {
136136
template <typename CsrType>
137137
std::unique_ptr<AubExecutionEnvironment> getEnvironment(bool createTagAllocation, bool allocateCommandBuffer, bool standalone) {
138138
std::unique_ptr<ExecutionEnvironment> executionEnvironment(new ExecutionEnvironment);
139-
executionEnvironment->commandStreamReceiver.reset(new CsrType(*platformDevices[0], "", standalone, *executionEnvironment));
140-
executionEnvironment->memoryManager.reset(executionEnvironment->commandStreamReceiver->createMemoryManager(false, false));
141-
executionEnvironment->commandStreamReceiver->setMemoryManager(executionEnvironment->memoryManager.get());
139+
executionEnvironment->commandStreamReceivers.push_back(std::make_unique<CsrType>(*platformDevices[0], "", standalone, *executionEnvironment));
140+
executionEnvironment->memoryManager.reset(executionEnvironment->commandStreamReceivers[0u]->createMemoryManager(false, false));
141+
executionEnvironment->commandStreamReceivers[0u]->setMemoryManager(executionEnvironment->memoryManager.get());
142142
if (createTagAllocation) {
143-
executionEnvironment->commandStreamReceiver->initializeTagAllocation();
143+
executionEnvironment->commandStreamReceivers[0u]->initializeTagAllocation();
144144
}
145145

146146
std::unique_ptr<AubExecutionEnvironment> aubExecutionEnvironment(new AubExecutionEnvironment);

unit_tests/command_stream/create_command_stream_receiver_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ HWTEST_P(CreateCommandStreamReceiverTest, givenCreateCommandStreamWhenCsrIsSetTo
5656
overrideCommandStreamReceiverCreation = true;
5757
DebugManager.flags.SetCommandStreamReceiver.set(csrType);
5858
ExecutionEnvironment executionEnvironment;
59-
executionEnvironment.commandStreamReceiver.reset(createCommandStream(&hwInfo, executionEnvironment));
59+
executionEnvironment.commandStreamReceivers.push_back(std::unique_ptr<CommandStreamReceiver>(createCommandStream(&hwInfo, executionEnvironment)));
6060
if (csrType < CommandStreamReceiverType::CSR_TYPES_NUM) {
61-
EXPECT_NE(nullptr, executionEnvironment.commandStreamReceiver.get());
62-
executionEnvironment.memoryManager.reset(executionEnvironment.commandStreamReceiver->createMemoryManager(false, false));
61+
EXPECT_NE(nullptr, executionEnvironment.commandStreamReceivers[0u].get());
62+
executionEnvironment.memoryManager.reset(executionEnvironment.commandStreamReceivers[0u]->createMemoryManager(false, false));
6363
EXPECT_NE(nullptr, executionEnvironment.memoryManager.get());
6464
} else {
65-
EXPECT_EQ(nullptr, executionEnvironment.commandStreamReceiver.get());
65+
EXPECT_EQ(nullptr, executionEnvironment.commandStreamReceivers[0u]);
6666
EXPECT_EQ(nullptr, executionEnvironment.memoryManager.get());
6767
}
6868
}

unit_tests/device/device_tests.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,19 @@ TEST(DeviceCreation, givenMultiDeviceWhenTheyAreCreatedThenEachDeviceHasSeperate
199199
EXPECT_EQ(1u, device2->getDeviceIndex());
200200
}
201201

202+
TEST(DeviceCreation, givenMultiDeviceWhenTheyAreCreatedThenEachDeviceHasSeperateCommandStreamReceiver) {
203+
ExecutionEnvironment executionEnvironment;
204+
executionEnvironment.incRefInternal();
205+
auto device = std::unique_ptr<Device>(Device::create<Device>(nullptr, &executionEnvironment, 0u));
206+
auto device2 = std::unique_ptr<Device>(Device::create<Device>(nullptr, &executionEnvironment, 1u));
207+
208+
EXPECT_EQ(2u, executionEnvironment.commandStreamReceivers.size());
209+
EXPECT_NE(nullptr, executionEnvironment.commandStreamReceivers[0]);
210+
EXPECT_NE(nullptr, executionEnvironment.commandStreamReceivers[1]);
211+
EXPECT_EQ(&device->getCommandStreamReceiver(), executionEnvironment.commandStreamReceivers[0].get());
212+
EXPECT_EQ(&device2->getCommandStreamReceiver(), executionEnvironment.commandStreamReceivers[1].get());
213+
}
214+
202215
TEST(DeviceCreation, givenFtrSimulationModeFlagTrueWhenNoOtherSimulationFlagsArePresentThenIsSimulationReturnsTrue) {
203216
FeatureTable skuTable = *platformDevices[0]->pSkuTable;
204217
skuTable.ftrSimulationMode = true;

unit_tests/execution_environment/execution_environment_tests.cpp

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ TEST(ExecutionEnvironment, givenPlatformWhenItIsCreatedThenItCreatesCommandStrea
8585
Platform platform;
8686
auto executionEnvironment = platform.peekExecutionEnvironment();
8787
platform.initialize();
88-
EXPECT_NE(nullptr, executionEnvironment->commandStreamReceiver);
88+
EXPECT_NE(nullptr, executionEnvironment->commandStreamReceivers[0u].get());
8989
}
9090

9191
TEST(ExecutionEnvironment, givenPlatformWhenItIsCreatedThenItCreatesMemoryManagerInExecutionEnvironment) {
@@ -105,18 +105,42 @@ TEST(ExecutionEnvironment, givenDeviceWhenItIsDestroyedThenMemoryManagerIsStillA
105105

106106
TEST(ExecutionEnvironment, givenExecutionEnvironmentWhenInitializeCommandStreamReceiverIsCalledThenItIsInitalized) {
107107
std::unique_ptr<ExecutionEnvironment> executionEnvironment(new ExecutionEnvironment);
108-
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0]);
109-
EXPECT_NE(nullptr, executionEnvironment->commandStreamReceiver);
108+
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 0u);
109+
EXPECT_NE(nullptr, executionEnvironment->commandStreamReceivers[0u]);
110110
}
111111

112-
TEST(ExecutionEnvironment, givenExecutionEnvironmentWhenInitializeMemoryManagerIsCalledThenItIsInitalized) {
112+
TEST(ExecutionEnvironment, givenExecutionEnvironmentWhenInitializeIsCalledWithDifferentDeviceIndexesThenInternalStorageIsResized) {
113113
std::unique_ptr<ExecutionEnvironment> executionEnvironment(new ExecutionEnvironment);
114-
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0]);
115-
executionEnvironment->initializeMemoryManager(false, false);
116-
EXPECT_NE(nullptr, executionEnvironment->memoryManager);
114+
EXPECT_EQ(0u, executionEnvironment->commandStreamReceivers.size());
115+
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 0u);
116+
EXPECT_EQ(1u, executionEnvironment->commandStreamReceivers.size());
117+
EXPECT_NE(nullptr, executionEnvironment->commandStreamReceivers[0u]);
118+
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 1u);
119+
EXPECT_EQ(2u, executionEnvironment->commandStreamReceivers.size());
120+
EXPECT_NE(nullptr, executionEnvironment->commandStreamReceivers[1u]);
121+
}
122+
123+
TEST(ExecutionEnvironment, givenExecutionEnvironmentWhenInitializeIsCalledMultipleTimesForTheSameIndexThenCommandStreamReceiverIsReused) {
124+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
125+
EXPECT_EQ(0u, executionEnvironment->commandStreamReceivers.size());
126+
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 1u);
127+
128+
auto currentCommandStreamReceiver = executionEnvironment->commandStreamReceivers[1u].get();
129+
130+
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 1u);
131+
132+
EXPECT_EQ(currentCommandStreamReceiver, executionEnvironment->commandStreamReceivers[1u].get());
133+
EXPECT_EQ(2u, executionEnvironment->commandStreamReceivers.size());
134+
EXPECT_EQ(nullptr, executionEnvironment->commandStreamReceivers[0u].get());
117135
}
118136

119-
static_assert(sizeof(ExecutionEnvironment) == sizeof(std::mutex) + (is64bit ? 80 : 44), "New members detected in ExecutionEnvironment, please ensure that destruction sequence of objects is correct");
137+
TEST(ExecutionEnvironment, givenExecutionEnvironmentWhenInitializeMemoryManagerIsCalledThenItIsInitalized) {
138+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
139+
executionEnvironment->initializeCommandStreamReceiver(platformDevices[0], 0u);
140+
executionEnvironment->initializeMemoryManager(false, false, 0u);
141+
EXPECT_NE(nullptr, executionEnvironment->memoryManager);
142+
}
143+
static_assert(sizeof(ExecutionEnvironment) == sizeof(std::vector<std::unique_ptr<CommandStreamReceiver>>) + sizeof(std::mutex) + (is64bit ? 72 : 40), "New members detected in ExecutionEnvironment, please ensure that destruction sequence of objects is correct");
120144

121145
TEST(ExecutionEnvironment, givenExecutionEnvironmentWithVariousMembersWhenItIsDestroyedThenDeleteSequenceIsSpecified) {
122146
uint32_t destructorId = 0u;
@@ -150,7 +174,7 @@ TEST(ExecutionEnvironment, givenExecutionEnvironmentWithVariousMembersWhenItIsDe
150174
executionEnvironment->gmmHelper = std::make_unique<GmmHelperMock>(destructorId, platformDevices[0]);
151175
executionEnvironment->osInterface = std::make_unique<OsInterfaceMock>(destructorId);
152176
executionEnvironment->memoryManager = std::make_unique<MemoryMangerMock>(destructorId);
153-
executionEnvironment->commandStreamReceiver = std::make_unique<CommandStreamReceiverMock>(destructorId);
177+
executionEnvironment->commandStreamReceivers.push_back(std::make_unique<CommandStreamReceiverMock>(destructorId));
154178
executionEnvironment->builtins = std::make_unique<BuiltinsMock>(destructorId);
155179
executionEnvironment->compilerInterface = std::make_unique<CompilerInterfaceMock>(destructorId);
156180
executionEnvironment->sourceLevelDebugger = std::make_unique<SourceLevelDebuggerMock>(destructorId);
@@ -166,7 +190,7 @@ TEST(ExecutionEnvironment, givenMultipleDevicesWhenTheyAreCreatedTheyAllReuseThe
166190
auto memoryManager = device->getMemoryManager();
167191

168192
std::unique_ptr<Device> device2(Device::create<OCLRT::Device>(nullptr, executionEnvironment, 1u));
169-
EXPECT_EQ(&commandStreamReceiver, &device->getCommandStreamReceiver());
193+
EXPECT_NE(&commandStreamReceiver, &device2->getCommandStreamReceiver());
170194
EXPECT_EQ(memoryManager, device2->getMemoryManager());
171195
}
172196

@@ -176,8 +200,8 @@ HWTEST_F(ExecutionEnvironmentHw, givenExecutionEnvironmentWhenCommandStreamRecei
176200
ExecutionEnvironment executionEnvironment;
177201
HardwareInfo localHwInfo = *platformDevices[0];
178202
localHwInfo.capabilityTable.ftrRenderCompressedBuffers = true;
179-
executionEnvironment.initializeCommandStreamReceiver(&localHwInfo);
180-
auto csr = static_cast<UltCommandStreamReceiver<FamilyType> *>(executionEnvironment.commandStreamReceiver.get());
203+
executionEnvironment.initializeCommandStreamReceiver(&localHwInfo, 0u);
204+
auto csr = static_cast<UltCommandStreamReceiver<FamilyType> *>(executionEnvironment.commandStreamReceivers[0u].get());
181205
ASSERT_NE(nullptr, csr);
182206
EXPECT_TRUE(csr->createPageTableManagerCalled);
183207
}
@@ -186,9 +210,9 @@ HWTEST_F(ExecutionEnvironmentHw, givenExecutionEnvironmentWhenCommandStreamRecei
186210
ExecutionEnvironment executionEnvironment;
187211
HardwareInfo localHwInfo = *platformDevices[0];
188212
localHwInfo.capabilityTable.ftrRenderCompressedImages = true;
189-
executionEnvironment.initializeCommandStreamReceiver(&localHwInfo);
190-
EXPECT_NE(nullptr, executionEnvironment.commandStreamReceiver);
191-
auto csr = static_cast<UltCommandStreamReceiver<FamilyType> *>(executionEnvironment.commandStreamReceiver.get());
213+
executionEnvironment.initializeCommandStreamReceiver(&localHwInfo, 0u);
214+
EXPECT_NE(nullptr, executionEnvironment.commandStreamReceivers[0]);
215+
auto csr = static_cast<UltCommandStreamReceiver<FamilyType> *>(executionEnvironment.commandStreamReceivers[0u].get());
192216
ASSERT_NE(nullptr, csr);
193217
EXPECT_TRUE(csr->createPageTableManagerCalled);
194218
}

0 commit comments

Comments
 (0)