OpenCL Queue Families extension 2/n

Disable CL_QUEUE_CAPABILITY_KERNEL_INTEL capability for copy queues

Signed-off-by: Maciej Dziuban <maciej.dziuban@intel.com>
Related-To: NEO-5120
This commit is contained in:
Maciej Dziuban
2020-11-24 14:49:04 +00:00
committed by Compute-Runtime-Automation
parent 438ad860ab
commit 2184ba7ec8
7 changed files with 88 additions and 3 deletions

View File

@ -11,6 +11,7 @@
#include "shared/source/device/device.h" #include "shared/source/device/device.h"
#include "shared/source/device/sub_device.h" #include "shared/source/device/sub_device.h"
#include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/execution_environment/root_device_environment.h"
#include "shared/source/helpers/hw_helper.h"
#include "shared/source/os_interface/driver_info.h" #include "shared/source/os_interface/driver_info.h"
#include "shared/source/os_interface/os_interface.h" #include "shared/source/os_interface/os_interface.h"
#include "shared/source/program/sync_buffer_handler.h" #include "shared/source/program/sync_buffer_handler.h"
@ -201,4 +202,33 @@ bool ClDevice::arePipesSupported() const {
return device.getHardwareInfo().capabilityTable.supportsPipes; return device.getHardwareInfo().capabilityTable.supportsPipes;
} }
cl_command_queue_capabilities_intel ClDevice::getQueueFamilyCapabilitiesAll() {
return CL_QUEUE_CAPABILITY_EVENT_WAIT_LIST_INTEL |
CL_QUEUE_CAPABILITY_EVENTS_INTEL |
CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_INTEL |
CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_RECT_INTEL |
CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL |
CL_QUEUE_CAPABILITY_FILL_BUFFER_INTEL |
CL_QUEUE_CAPABILITY_TRANSFER_IMAGE_INTEL |
CL_QUEUE_CAPABILITY_MAP_IMAGE_INTEL |
CL_QUEUE_CAPABILITY_FILL_IMAGE_INTEL |
CL_QUEUE_CAPABILITY_MARKER_INTEL |
CL_QUEUE_CAPABILITY_BARRIER_INTEL |
CL_QUEUE_CAPABILITY_KERNEL_INTEL;
}
cl_command_queue_capabilities_intel ClDevice::getQueueFamilyCapabilities(EngineGroupType type) {
auto &hwHelper = NEO::HwHelper::get(getHardwareInfo().platform.eRenderCoreFamily);
cl_command_queue_capabilities_intel disabledProperties = 0u;
if (hwHelper.isCopyOnlyEngineType(type)) {
disabledProperties |= CL_QUEUE_CAPABILITY_KERNEL_INTEL;
}
if (disabledProperties != 0) {
return getQueueFamilyCapabilitiesAll() & ~disabledProperties;
}
return CL_QUEUE_CAPABILITY_ALL_INTEL;
}
} // namespace NEO } // namespace NEO

View File

@ -123,6 +123,9 @@ class ClDevice : public BaseObject<_cl_device_id> {
bool isDeviceEnqueueSupported() const; bool isDeviceEnqueueSupported() const;
bool arePipesSupported() const; bool arePipesSupported() const;
static cl_command_queue_capabilities_intel getQueueFamilyCapabilitiesAll();
MOCKABLE_VIRTUAL cl_command_queue_capabilities_intel getQueueFamilyCapabilities(EngineGroupType type);
protected: protected:
void initializeCaps(); void initializeCaps();
void initializeExtensionsWithVersion(); void initializeExtensionsWithVersion();

View File

@ -365,8 +365,9 @@ void ClDevice::initializeCaps() {
for (int queueFamilyIndex = 0; queueFamilyIndex < static_cast<int>(EngineGroupType::MaxEngineGroups); queueFamilyIndex++) { for (int queueFamilyIndex = 0; queueFamilyIndex < static_cast<int>(EngineGroupType::MaxEngineGroups); queueFamilyIndex++) {
const std::vector<EngineControl> &enginesInFamily = queueFamilies.at(queueFamilyIndex); const std::vector<EngineControl> &enginesInFamily = queueFamilies.at(queueFamilyIndex);
if (enginesInFamily.size() > 0) { if (enginesInFamily.size() > 0) {
const auto engineGroupType = static_cast<EngineGroupType>(queueFamilyIndex);
cl_queue_family_properties_intel properties; cl_queue_family_properties_intel properties;
properties.capabilities = CL_QUEUE_CAPABILITY_ALL_INTEL; properties.capabilities = getQueueFamilyCapabilities(engineGroupType);
properties.count = static_cast<cl_uint>(enginesInFamily.size()); properties.count = static_cast<cl_uint>(enginesInFamily.size());
properties.properties = deviceInfo.queueOnHostProperties; properties.properties = deviceInfo.queueOnHostProperties;
deviceInfo.queueFamilyProperties.push_back(properties); deviceInfo.queueFamilyProperties.push_back(properties);

View File

@ -1458,3 +1458,25 @@ TEST_F(DeviceCapsWithModifiedHwInfoTest, givenPlatformWithSourceLevelDebuggerNot
EXPECT_EQ(nullptr, device->getDebugger()); EXPECT_EQ(nullptr, device->getDebugger());
EXPECT_FALSE(caps.debuggerActive); EXPECT_FALSE(caps.debuggerActive);
} }
TEST_F(DeviceGetCapsTest, givenClDeviceWhenInitializingCapsThenUseGetQueueFamilyCapabilitiesMethod) {
struct ClDeviceWithCustomQueueCaps : MockClDevice {
using MockClDevice::MockClDevice;
cl_command_queue_capabilities_intel queueCaps{};
cl_command_queue_capabilities_intel getQueueFamilyCapabilities(EngineGroupType type) override {
return queueCaps;
}
};
auto device = std::make_unique<ClDeviceWithCustomQueueCaps>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
device->deviceInfo = {};
device->queueCaps = CL_QUEUE_CAPABILITY_FILL_IMAGE_INTEL;
device->initializeCaps();
EXPECT_EQ(device->queueCaps, device->getDeviceInfo().queueFamilyProperties[0].capabilities);
device->deviceInfo = {};
device->queueCaps = CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL | CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_INTEL;
device->initializeCaps();
EXPECT_EQ(device->queueCaps, device->getDeviceInfo().queueFamilyProperties[0].capabilities);
}

View File

@ -466,3 +466,30 @@ TEST(DeviceGenEngineTest, givenEmptyGroupsWhenGettingNonEmptyGroupsThenReturnCor
EXPECT_EQ(&engineGroups[3], device->getNonEmptyEngineGroup(1)); EXPECT_EQ(&engineGroups[3], device->getNonEmptyEngineGroup(1));
EXPECT_EQ(nullptr, device->getNonEmptyEngineGroup(2)); EXPECT_EQ(nullptr, device->getNonEmptyEngineGroup(2));
} }
TEST(DeviceGenEngineTest, whenGettingQueueFamilyCapabilitiesAllThenReturnCorrectValue) {
const cl_command_queue_capabilities_intel expectedProperties = CL_QUEUE_CAPABILITY_EVENT_WAIT_LIST_INTEL |
CL_QUEUE_CAPABILITY_EVENTS_INTEL |
CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_INTEL |
CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_RECT_INTEL |
CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL |
CL_QUEUE_CAPABILITY_FILL_BUFFER_INTEL |
CL_QUEUE_CAPABILITY_TRANSFER_IMAGE_INTEL |
CL_QUEUE_CAPABILITY_MAP_IMAGE_INTEL |
CL_QUEUE_CAPABILITY_FILL_IMAGE_INTEL |
CL_QUEUE_CAPABILITY_MARKER_INTEL |
CL_QUEUE_CAPABILITY_BARRIER_INTEL |
CL_QUEUE_CAPABILITY_KERNEL_INTEL;
EXPECT_EQ(expectedProperties, MockClDevice::getQueueFamilyCapabilitiesAll());
}
TEST(DeviceGenEngineTest, givenCopyQueueWhenGettingQueueFamilyCapabilitiesThenDoNotReturnKernel) {
const auto propertiesAll = MockClDevice::getQueueFamilyCapabilitiesAll();
const auto propertiesWithoutKernel = setBits(propertiesAll, false, CL_QUEUE_CAPABILITY_KERNEL_INTEL);
auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get()));
EXPECT_EQ(CL_QUEUE_CAPABILITY_ALL_INTEL, device->getQueueFamilyCapabilities(NEO::EngineGroupType::Compute));
EXPECT_EQ(CL_QUEUE_CAPABILITY_ALL_INTEL, device->getQueueFamilyCapabilities(NEO::EngineGroupType::RenderCompute));
EXPECT_EQ(propertiesWithoutKernel, device->getQueueFamilyCapabilities(NEO::EngineGroupType::Copy));
}

View File

@ -735,7 +735,7 @@ HWTEST_F(GetDeviceInfoQueueFamilyTest, givenSingleDeviceWhenInitializingCapsThen
EXPECT_EQ(3u, families[0].count); EXPECT_EQ(3u, families[0].count);
EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[0].properties); EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[0].properties);
EXPECT_EQ(CL_QUEUE_CAPABILITY_ALL_INTEL, families[1].capabilities); EXPECT_EQ(clDevice.getQueueFamilyCapabilities(EngineGroupType::Copy), families[1].capabilities);
EXPECT_EQ(1u, families[1].count); EXPECT_EQ(1u, families[1].count);
EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[1].properties); EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[1].properties);
} }
@ -760,7 +760,7 @@ HWTEST_F(GetDeviceInfoQueueFamilyTest, givenSubDeviceWhenInitializingCapsThenRet
EXPECT_EQ(3u, families[0].count); EXPECT_EQ(3u, families[0].count);
EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[0].properties); EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[0].properties);
EXPECT_EQ(CL_QUEUE_CAPABILITY_ALL_INTEL, families[1].capabilities); EXPECT_EQ(clDevice.getQueueFamilyCapabilities(EngineGroupType::Copy), families[1].capabilities);
EXPECT_EQ(1u, families[1].count); EXPECT_EQ(1u, families[1].count);
EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[1].properties); EXPECT_EQ(clDevice.getDeviceInfo().queueOnHostProperties, families[1].properties);
} }

View File

@ -34,6 +34,8 @@ class MockClDevice : public ClDevice {
using ClDevice::driverInfo; using ClDevice::driverInfo;
using ClDevice::enabledClVersion; using ClDevice::enabledClVersion;
using ClDevice::getClDeviceName; using ClDevice::getClDeviceName;
using ClDevice::getQueueFamilyCapabilities;
using ClDevice::getQueueFamilyCapabilitiesAll;
using ClDevice::initializeCaps; using ClDevice::initializeCaps;
using ClDevice::name; using ClDevice::name;
using ClDevice::ocl21FeaturesEnabled; using ClDevice::ocl21FeaturesEnabled;