Skip to content

Commit 8785f5a

Browse files
Dont use default engine in immediate cmdlist
Related-To: NEO-4913 Change-Id: I15b5bb700e37ea49c34931bc81de7314ec1ac4dc Signed-off-by: Maciej Plewka <maciej.plewka@intel.com>
1 parent d49a729 commit 8785f5a

File tree

7 files changed

+111
-32
lines changed

7 files changed

+111
-32
lines changed

level_zero/core/source/cmdlist/cmdlist_imp.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,8 @@ CommandList *CommandList::createImmediate(uint32_t productFamily, Device *device
6868
const ze_command_queue_desc_t *desc,
6969
bool internalUsage, bool isCopyOnly) {
7070

71-
auto deviceImp = static_cast<DeviceImp *>(device);
7271
NEO::CommandStreamReceiver *csr = nullptr;
73-
if (internalUsage) {
74-
csr = deviceImp->neoDevice->getInternalEngine().commandStreamReceiver;
75-
} else if (isCopyOnly) {
76-
auto &selectorCopyEngine = deviceImp->neoDevice->getDeviceById(0)->getSelectorCopyEngine();
77-
csr = deviceImp->neoDevice->getDeviceById(0)->getEngine(NEO::EngineHelpers::getBcsEngineType(deviceImp->neoDevice->getHardwareInfo(), selectorCopyEngine), false).commandStreamReceiver;
78-
} else {
79-
csr = deviceImp->neoDevice->getDefaultEngine().commandStreamReceiver;
80-
}
72+
device->getCsrForOrdinalAndIndex(&csr, desc->ordinal, desc->index);
8173

8274
auto commandQueue = CommandQueue::create(productFamily, device, csr, desc, isCopyOnly);
8375
if (!commandQueue) {

level_zero/core/source/device/device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ struct Device : _ze_device_handle_t {
122122
virtual NEO::GraphicsAllocation *allocateMemoryFromHostPtr(const void *buffer, size_t size) = 0;
123123
virtual void setSysmanHandle(SysmanDevice *pSysmanDevice) = 0;
124124
virtual SysmanDevice *getSysmanHandle() = 0;
125+
virtual ze_result_t getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr, uint32_t ordinal, uint32_t index) = 0;
126+
virtual ze_result_t mapOrdinalForAvailableEngineGroup(uint32_t *ordinal) = 0;
125127
};
126128

127129
} // namespace L0

level_zero/core/source/device/device_imp.cpp

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,9 @@ ze_result_t DeviceImp::createCommandList(const ze_command_list_desc_t *desc,
9595
ze_result_t DeviceImp::createCommandListImmediate(const ze_command_queue_desc_t *desc,
9696
ze_command_list_handle_t *phCommandList) {
9797
auto productFamily = neoDevice->getHardwareInfo().platform.eProductFamily;
98-
99-
bool useBliter = false;
100-
if (desc->ordinal == static_cast<uint32_t>(NEO::EngineGroupType::Copy)) {
101-
useBliter = true;
102-
}
98+
uint32_t engineGroupIndex = desc->ordinal;
99+
mapOrdinalForAvailableEngineGroup(&engineGroupIndex);
100+
bool useBliter = engineGroupIndex == static_cast<uint32_t>(NEO::EngineGroupType::Copy);
103101
*phCommandList = CommandList::createImmediate(productFamily, this, desc, false, useBliter);
104102

105103
return ZE_RESULT_SUCCESS;
@@ -110,22 +108,12 @@ ze_result_t DeviceImp::createCommandQueue(const ze_command_queue_desc_t *desc,
110108
auto productFamily = neoDevice->getHardwareInfo().platform.eProductFamily;
111109

112110
NEO::CommandStreamReceiver *csr = nullptr;
113-
bool useBliter = desc->ordinal == static_cast<uint32_t>(NEO::EngineGroupType::Copy);
114-
115-
if (desc->ordinal >= static_cast<uint32_t>(NEO::EngineGroupType::MaxEngineGroups)) {
116-
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
117-
}
118-
119-
if (this->getNEODevice()->getNumAvailableDevices() > 1) {
120-
if (desc->index >= this->neoDevice->getDeviceById(0)->getEngineGroups()[desc->ordinal].size()) {
121-
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
122-
}
123-
csr = this->neoDevice->getDeviceById(0)->getEngineGroups()[desc->ordinal][desc->index].commandStreamReceiver;
124-
} else {
125-
if (desc->index >= this->neoDevice->getEngineGroups()[desc->ordinal].size()) {
126-
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
127-
}
128-
csr = this->neoDevice->getEngineGroups()[desc->ordinal][desc->index].commandStreamReceiver;
111+
uint32_t engineGroupIndex = desc->ordinal;
112+
mapOrdinalForAvailableEngineGroup(&engineGroupIndex);
113+
bool useBliter = engineGroupIndex == static_cast<uint32_t>(NEO::EngineGroupType::Copy);
114+
auto ret = getCsrForOrdinalAndIndex(&csr, desc->ordinal, desc->index);
115+
if (ret != ZE_RESULT_SUCCESS) {
116+
return ret;
129117
}
130118

131119
UNRECOVERABLE_IF(csr == nullptr);
@@ -725,4 +713,41 @@ NEO::GraphicsAllocation *DeviceImp::allocateMemoryFromHostPtr(const void *buffer
725713
return allocation;
726714
}
727715

716+
ze_result_t DeviceImp::getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr, uint32_t ordinal, uint32_t index) {
717+
if (ordinal >= static_cast<uint32_t>(NEO::EngineGroupType::MaxEngineGroups)) {
718+
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
719+
}
720+
uint32_t engineGroupIndex = ordinal;
721+
auto ret = mapOrdinalForAvailableEngineGroup(&engineGroupIndex);
722+
if (ret != ZE_RESULT_SUCCESS) {
723+
return ret;
724+
}
725+
if (this->getNEODevice()->getNumAvailableDevices() > 1) {
726+
if (index >= this->neoDevice->getDeviceById(0)->getEngineGroups()[engineGroupIndex].size()) {
727+
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
728+
}
729+
*csr = this->neoDevice->getDeviceById(0)->getEngineGroups()[engineGroupIndex][index].commandStreamReceiver;
730+
} else {
731+
if (index >= this->neoDevice->getEngineGroups()[engineGroupIndex].size()) {
732+
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
733+
}
734+
*csr = this->neoDevice->getEngineGroups()[engineGroupIndex][index].commandStreamReceiver;
735+
}
736+
return ZE_RESULT_SUCCESS;
737+
}
738+
ze_result_t DeviceImp::mapOrdinalForAvailableEngineGroup(uint32_t *ordinal) {
739+
auto engines = this->getNEODevice()->getEngineGroups();
740+
uint32_t numNonEmptyGroups = 0;
741+
uint32_t i = 0;
742+
for (; i < engines.size() && numNonEmptyGroups <= *ordinal; i++) {
743+
if (!engines[i].empty()) {
744+
numNonEmptyGroups++;
745+
}
746+
}
747+
if (*ordinal + 1 > numNonEmptyGroups) {
748+
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
749+
}
750+
*ordinal = i - 1;
751+
return ZE_RESULT_SUCCESS;
752+
};
728753
} // namespace L0

level_zero/core/source/device/device_imp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ struct DeviceImp : public Device {
6767
void setDriverHandle(DriverHandle *driverHandle) override;
6868
NEO::PreemptionMode getDevicePreemptionMode() const override;
6969
const NEO::DeviceInfo &getDeviceInfo() const override;
70+
7071
NEO::Device *getNEODevice() override;
7172
void activateMetricGroups() override;
7273
void processAdditionalKernelProperties(NEO::HwHelper &hwHelper, ze_device_module_properties_t *pKernelProperties);
@@ -77,6 +78,8 @@ struct DeviceImp : public Device {
7778
NEO::GraphicsAllocation *allocateMemoryFromHostPtr(const void *buffer, size_t size) override;
7879
void setSysmanHandle(SysmanDevice *pSysman) override;
7980
SysmanDevice *getSysmanHandle() override;
81+
ze_result_t getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr, uint32_t ordinal, uint32_t index) override;
82+
ze_result_t mapOrdinalForAvailableEngineGroup(uint32_t *ordinal) override;
8083

8184
NEO::Device *neoDevice = nullptr;
8285
bool isSubdevice = false;

level_zero/core/test/unit_tests/mocks/mock_device.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,13 @@ struct Mock<Device> : public Device {
252252
getSysmanHandle,
253253
(),
254254
(override));
255+
ze_result_t getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr, uint32_t ordinal, uint32_t index) override {
256+
return ZE_RESULT_SUCCESS;
257+
}
258+
259+
ze_result_t mapOrdinalForAvailableEngineGroup(uint32_t *ordinal) override {
260+
return ZE_RESULT_SUCCESS;
261+
}
255262
};
256263

257264
template <>

level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,31 @@ TEST_F(CommandListCreate, whenCreatingImmediateCommandListThenItHasImmediateComm
179179
EXPECT_NE(nullptr, commandList->cmdQImmediate);
180180
}
181181

182+
TEST_F(CommandListCreate, givenQueueDescriptionwhenCreatingImmediateCommandListForEveryEnigneThenItHasImmediateCommandQueueCreated) {
183+
auto engines = neoDevice->getEngineGroups();
184+
uint32_t numaAvailableEngineGroups = 0;
185+
for (uint32_t ordinal = 0; ordinal < static_cast<uint32_t>(NEO::EngineGroupType::MaxEngineGroups); ordinal++) {
186+
if (engines[ordinal].size()) {
187+
numaAvailableEngineGroups++;
188+
}
189+
}
190+
for (uint32_t ordinal = 0; ordinal < numaAvailableEngineGroups; ordinal++) {
191+
uint32_t engineGroupIndex = ordinal;
192+
device->mapOrdinalForAvailableEngineGroup(&engineGroupIndex);
193+
for (uint32_t index = 0; index < engines[engineGroupIndex].size(); index++) {
194+
ze_command_queue_desc_t desc = {};
195+
desc.ordinal = ordinal;
196+
desc.index = index;
197+
std::unique_ptr<L0::CommandList> commandList(CommandList::createImmediate(productFamily, device, &desc, false, false));
198+
ASSERT_NE(nullptr, commandList);
199+
200+
EXPECT_EQ(device, commandList->device);
201+
EXPECT_EQ(CommandList::CommandListType::TYPE_IMMEDIATE, commandList->cmdListType);
202+
EXPECT_NE(nullptr, commandList->cmdQImmediate);
203+
}
204+
}
205+
}
206+
182207
TEST_F(CommandListCreate, givenInvalidProductFamilyThenReturnsNullPointer) {
183208
std::unique_ptr<L0::CommandList> commandList(CommandList::create(IGFX_UNKNOWN, device, false));
184209
EXPECT_EQ(nullptr, commandList);

level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,17 @@ TEST_F(ContextCreateCommandQueueTest, givenCallToContextCreateCommandQueueThenCa
273273

274274
HWTEST_F(ContextCreateCommandQueueTest, givenEveryPossibleGroupIndexWhenCreatingCommandQueueThenCommandQueueIsCreated) {
275275
ze_command_queue_handle_t commandQueue = {};
276+
auto engines = neoDevice->getEngineGroups();
277+
uint32_t numaAvailableEngineGroups = 0;
276278
for (uint32_t ordinal = 0; ordinal < static_cast<uint32_t>(NEO::EngineGroupType::MaxEngineGroups); ordinal++) {
277-
auto engines = neoDevice->getEngineGroups();
278-
for (uint32_t index = 0; index < engines[ordinal].size(); index++) {
279+
if (engines[ordinal].size()) {
280+
numaAvailableEngineGroups++;
281+
}
282+
}
283+
for (uint32_t ordinal = 0; ordinal < numaAvailableEngineGroups; ordinal++) {
284+
uint32_t engineGroupIndex = ordinal;
285+
device->mapOrdinalForAvailableEngineGroup(&engineGroupIndex);
286+
for (uint32_t index = 0; index < engines[engineGroupIndex].size(); index++) {
279287
ze_command_queue_desc_t desc = {};
280288
desc.ordinal = ordinal;
281289
desc.index = index;
@@ -288,6 +296,23 @@ HWTEST_F(ContextCreateCommandQueueTest, givenEveryPossibleGroupIndexWhenCreating
288296
}
289297
}
290298

299+
HWTEST_F(ContextCreateCommandQueueTest, givenOrdinalBigerThanAvailableEnginesWhenCreatingCommandQueueThenInvalidArgReturned) {
300+
ze_command_queue_handle_t commandQueue = {};
301+
auto engines = neoDevice->getEngineGroups();
302+
uint32_t numaAvailableEngineGroups = 0;
303+
for (uint32_t ordinal = 0; ordinal < static_cast<uint32_t>(NEO::EngineGroupType::MaxEngineGroups); ordinal++) {
304+
if (engines[ordinal].size()) {
305+
numaAvailableEngineGroups++;
306+
}
307+
}
308+
ze_command_queue_desc_t desc = {};
309+
desc.ordinal = numaAvailableEngineGroups;
310+
desc.index = 0;
311+
ze_result_t res = context->createCommandQueue(device, &desc, &commandQueue);
312+
EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, res);
313+
EXPECT_EQ(nullptr, commandQueue);
314+
}
315+
291316
using CommandQueueSynchronizeTest = Test<ContextFixture>;
292317

293318
HWTEST_F(CommandQueueSynchronizeTest, givenCallToSynchronizeThenCorrectEnableTimeoutAndTimeoutValuesAreUsed) {

0 commit comments

Comments
 (0)