feature: Add Initial Support for Get Vector Width Properties

- Added support for L0 to query Vector Width Properties which allows for
querying all the supported vector widths and their prefferred and
native vector widths per data type.
- Updated shared code to support querying the same values thru
getPreferredVectorWidth* and getNativeVectorWidth* helper functions
for OpenCL and Level Zero.
- Initial support for reporting base values for the vector
widths with future support for reporting different values per platform and
based on the SIMD/SIMT size used.

Related-To: NEO-13745

Signed-off-by: Neil R. Spruit <neil.r.spruit@intel.com>
This commit is contained in:
Neil R. Spruit
2025-06-24 22:48:43 +00:00
committed by Compute-Runtime-Automation
parent 39b28474ae
commit 532c663da6
15 changed files with 233 additions and 17 deletions

View File

@@ -105,6 +105,18 @@ class GfxCoreHelper {
virtual bool isWaDisableRccRhwoOptimizationRequired() const = 0;
virtual uint32_t getMinimalSIMDSize() const = 0;
virtual uint32_t getPreferredVectorWidthChar(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getPreferredVectorWidthShort(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getPreferredVectorWidthInt(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getPreferredVectorWidthLong(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getPreferredVectorWidthFloat(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getPreferredVectorWidthHalf(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getNativeVectorWidthChar(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getNativeVectorWidthShort(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getNativeVectorWidthInt(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getNativeVectorWidthLong(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getNativeVectorWidthFloat(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getNativeVectorWidthHalf(uint32_t vectorWidthSize) const = 0;
virtual uint32_t getMinimalGrfSize() const = 0;
virtual bool isOffsetToSkipSetFFIDGPWARequired(const HardwareInfo &hwInfo, const ProductHelper &productHelper) const = 0;
virtual bool isFusedEuDispatchEnabled(const HardwareInfo &hwInfo, bool disableEUFusionForKernel) const = 0;
@@ -337,6 +349,19 @@ class GfxCoreHelperHw : public GfxCoreHelper {
uint32_t getMinimalSIMDSize() const override;
uint32_t getPreferredVectorWidthChar(uint32_t vectorWidthSize) const override;
uint32_t getPreferredVectorWidthShort(uint32_t vectorWidthSize) const override;
uint32_t getPreferredVectorWidthInt(uint32_t vectorWidthSize) const override;
uint32_t getPreferredVectorWidthLong(uint32_t vectorWidthSize) const override;
uint32_t getPreferredVectorWidthFloat(uint32_t vectorWidthSize) const override;
uint32_t getPreferredVectorWidthHalf(uint32_t vectorWidthSize) const override;
uint32_t getNativeVectorWidthChar(uint32_t vectorWidthSize) const override;
uint32_t getNativeVectorWidthShort(uint32_t vectorWidthSize) const override;
uint32_t getNativeVectorWidthInt(uint32_t vectorWidthSize) const override;
uint32_t getNativeVectorWidthLong(uint32_t vectorWidthSize) const override;
uint32_t getNativeVectorWidthFloat(uint32_t vectorWidthSize) const override;
uint32_t getNativeVectorWidthHalf(uint32_t vectorWidthSize) const override;
uint32_t getMinimalGrfSize() const override;
uint64_t getGpuTimeStampInNS(uint64_t timeStamp, double resolution) const override;

View File

@@ -463,6 +463,66 @@ inline uint32_t GfxCoreHelperHw<GfxFamily>::getMinimalSIMDSize() const {
return 8u;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getPreferredVectorWidthChar(uint32_t vectorWidthSize) const {
return 16;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getPreferredVectorWidthShort(uint32_t vectorWidthSize) const {
return 8;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getPreferredVectorWidthInt(uint32_t vectorWidthSize) const {
return 4;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getPreferredVectorWidthLong(uint32_t vectorWidthSize) const {
return 1;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getPreferredVectorWidthFloat(uint32_t vectorWidthSize) const {
return 1;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getPreferredVectorWidthHalf(uint32_t vectorWidthSize) const {
return 8;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getNativeVectorWidthChar(uint32_t vectorWidthSize) const {
return 16;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getNativeVectorWidthShort(uint32_t vectorWidthSize) const {
return 8;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getNativeVectorWidthInt(uint32_t vectorWidthSize) const {
return 4;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getNativeVectorWidthLong(uint32_t vectorWidthSize) const {
return 1;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getNativeVectorWidthFloat(uint32_t vectorWidthSize) const {
return 1;
}
template <typename GfxFamily>
uint32_t GfxCoreHelperHw<GfxFamily>::getNativeVectorWidthHalf(uint32_t vectorWidthSize) const {
return 8;
}
template <typename GfxFamily>
std::unique_ptr<TagAllocatorBase> GfxCoreHelperHw<GfxFamily>::createTimestampPacketAllocator(const RootDeviceIndicesContainer &rootDeviceIndices, MemoryManager *memoryManager,
size_t initialTagCount, CommandStreamReceiverType csrType, DeviceBitfield deviceBitfield) const {

View File

@@ -1061,6 +1061,26 @@ HWTEST_F(GfxCoreHelperTest, givenDefaultGfxCoreHelperHwWhenMinimalSIMDSizeIsQuer
EXPECT_EQ(8u, gfxCoreHelper.getMinimalSIMDSize());
}
HWTEST_F(GfxCoreHelperTest, givenDefaultGfxCoreHelperHwWhenGettingPreferredVectorWidthsThenCorrectValuesAreReturned) {
const auto &gfxCoreHelper = getHelper<GfxCoreHelper>();
EXPECT_EQ(16u, gfxCoreHelper.getPreferredVectorWidthChar(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(8u, gfxCoreHelper.getPreferredVectorWidthShort(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(4u, gfxCoreHelper.getPreferredVectorWidthInt(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(1u, gfxCoreHelper.getPreferredVectorWidthLong(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(1u, gfxCoreHelper.getPreferredVectorWidthFloat(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(8u, gfxCoreHelper.getPreferredVectorWidthHalf(gfxCoreHelper.getMinimalSIMDSize()));
}
HWTEST_F(GfxCoreHelperTest, givenDefaultGfxCoreHelperHwWhenGettingNativeVectorWidthsThenCorrectValuesAreReturned) {
const auto &gfxCoreHelper = getHelper<GfxCoreHelper>();
EXPECT_EQ(16u, gfxCoreHelper.getNativeVectorWidthChar(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(8u, gfxCoreHelper.getNativeVectorWidthShort(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(4u, gfxCoreHelper.getNativeVectorWidthInt(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(1u, gfxCoreHelper.getNativeVectorWidthLong(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(1u, gfxCoreHelper.getNativeVectorWidthFloat(gfxCoreHelper.getMinimalSIMDSize()));
EXPECT_EQ(8u, gfxCoreHelper.getNativeVectorWidthHalf(gfxCoreHelper.getMinimalSIMDSize()));
}
HWTEST_F(GfxCoreHelperTest, givenDefaultGfxCoreHelperHwWhenMinimalGrfSizeIsQueriedThen128IsReturned) {
const auto &gfxCoreHelper = getHelper<GfxCoreHelper>();
EXPECT_EQ(128u, gfxCoreHelper.getMinimalGrfSize());