/* * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/offline_compiler/source/ocloc_fatbinary.h" #include "shared/source/helpers/hw_helper.h" #include "gtest/gtest.h" #include TEST(OclocFatBinaryRequestedFatBinary, WhenDeviceArgMissingThenReturnsFalse) { const char *args[] = {"ocloc", "-aaa", "*", "-device", "*"}; EXPECT_FALSE(NEO::requestedFatBinary(0, nullptr)); EXPECT_FALSE(NEO::requestedFatBinary(1, args)); EXPECT_FALSE(NEO::requestedFatBinary(2, args)); EXPECT_FALSE(NEO::requestedFatBinary(3, args)); EXPECT_FALSE(NEO::requestedFatBinary(4, args)); } TEST(OclocFatBinaryRequestedFatBinary, WhenDeviceArgProvidedAndContainsFatbinaryArgFormatThenReturnsTrue) { const char *allPlatforms[] = {"ocloc", "-device", "*"}; const char *manyPlatforms[] = {"ocloc", "-device", "a,b"}; const char *manyGens[] = {"ocloc", "-device", "gen0,gen1"}; const char *gen[] = {"ocloc", "-device", "gen0"}; const char *rangePlatformFrom[] = {"ocloc", "-device", "skl-"}; const char *rangePlatformTo[] = {"ocloc", "-device", "-skl"}; const char *rangePlatformBounds[] = {"ocloc", "-device", "skl-icllp"}; const char *rangeGenFrom[] = {"ocloc", "-device", "gen0-"}; const char *rangeGenTo[] = {"ocloc", "-device", "-gen5"}; const char *rangeGenBounds[] = {"ocloc", "-device", "gen0-gen5"}; EXPECT_TRUE(NEO::requestedFatBinary(3, allPlatforms)); EXPECT_TRUE(NEO::requestedFatBinary(3, manyPlatforms)); EXPECT_TRUE(NEO::requestedFatBinary(3, manyGens)); EXPECT_TRUE(NEO::requestedFatBinary(3, gen)); EXPECT_TRUE(NEO::requestedFatBinary(3, rangePlatformFrom)); EXPECT_TRUE(NEO::requestedFatBinary(3, rangePlatformTo)); EXPECT_TRUE(NEO::requestedFatBinary(3, rangePlatformBounds)); EXPECT_TRUE(NEO::requestedFatBinary(3, rangeGenFrom)); EXPECT_TRUE(NEO::requestedFatBinary(3, rangeGenTo)); EXPECT_TRUE(NEO::requestedFatBinary(3, rangeGenBounds)); } TEST(OclocFatBinaryRequestedFatBinary, WhenDeviceArgProvidedButDoesnNotContainFatbinaryArgFormatThenReturnsFalse) { const char *skl[] = {"ocloc", "-device", "skl"}; EXPECT_FALSE(NEO::requestedFatBinary(3, skl)); } TEST(OclocFatBinaryGetAllSupportedTargetPlatforms, WhenRequestedThenReturnsAllPlatformsWithNonNullHardwarePrefixes) { auto platforms = NEO::getAllSupportedTargetPlatforms(); std::unordered_set platformsSet(platforms.begin(), platforms.end()); for (unsigned int productId = 0; productId < IGFX_MAX_PRODUCT; ++productId) { if (nullptr != NEO::hardwarePrefix[productId]) { EXPECT_EQ(1U, platformsSet.count(static_cast(productId))) << productId; } else { EXPECT_EQ(0U, platformsSet.count(static_cast(productId))) << productId; } } } TEST(OclocFatBinaryToProductNames, GivenListOfProductIdsThenReturnsListOfHardwarePrefixes) { auto platforms = NEO::getAllSupportedTargetPlatforms(); auto names = NEO::toProductNames(platforms); EXPECT_EQ(names.size(), platforms.size()); } TEST(OclocFatBinaryAsProductId, GivenEnabledPlatformNameThenReturnsProperPlatformId) { auto platforms = NEO::getAllSupportedTargetPlatforms(); auto names = NEO::toProductNames(platforms); for (size_t i = 0; i < platforms.size(); ++i) { auto idByName = NEO::asProductId(names[i], platforms); EXPECT_EQ(idByName, platforms[i]) << names[i] << " : " << platforms[i] << " != " << idByName; } } TEST(OclocFatBinaryAsProductId, GivenDisabledPlatformNameThenReturnsUnknownPlatformId) { auto platforms = NEO::getAllSupportedTargetPlatforms(); auto names = NEO::toProductNames(platforms); platforms.clear(); for (size_t i = 0; i < platforms.size(); ++i) { auto idByName = NEO::asProductId(names[i], platforms); EXPECT_EQ(IGFX_UNKNOWN, platforms[i]) << names[i] << " : IGFX_UNKNOWN != " << idByName; } } TEST(OclocFatBinaryAsGfxCoreId, GivenEnabledGfxCoreNameThenReturnsProperGfxCoreId) { for (unsigned int coreId = 0; coreId < IGFX_MAX_CORE; ++coreId) { if (nullptr != NEO::familyName[coreId]) { EXPECT_NE(IGFX_UNKNOWN_CORE, NEO::asGfxCoreId(ConstStringRef(NEO::familyName[coreId], strlen(NEO::familyName[coreId])))); std::string caseInsesitive = NEO::familyName[coreId]; caseInsesitive[0] = 'g'; EXPECT_NE(IGFX_UNKNOWN_CORE, NEO::asGfxCoreId(caseInsesitive)); } } } TEST(OclocFatBinaryAsGfxCoreId, GivenDisabledGfxCoreNameThenReturnsProperGfxCoreId) { EXPECT_EQ(IGFX_UNKNOWN_CORE, NEO::asGfxCoreId(ConstStringRef("genA"))); EXPECT_EQ(IGFX_UNKNOWN_CORE, NEO::asGfxCoreId(ConstStringRef("gen0"))); EXPECT_EQ(IGFX_UNKNOWN_CORE, NEO::asGfxCoreId(ConstStringRef("gen1"))); EXPECT_EQ(IGFX_UNKNOWN_CORE, NEO::asGfxCoreId(ConstStringRef("gen2"))); } TEST(OclocFatBinaryAppendPlatformsForGfxCore, GivenCoreIdThenAppendsEnabledProductIdsThatMatch) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); auto platform0 = allEnabledPlatforms[0]; auto gfxCore0 = NEO::hardwareInfoTable[platform0]->platform.eRenderCoreFamily; std::vector appendedPlatforms; NEO::appendPlatformsForGfxCore(gfxCore0, allEnabledPlatforms, appendedPlatforms); std::unordered_set appendedPlatformsSet(appendedPlatforms.begin(), appendedPlatforms.end()); EXPECT_EQ(1U, appendedPlatformsSet.count(platform0)); for (auto platformId : allEnabledPlatforms) { if (gfxCore0 == NEO::hardwareInfoTable[platformId]->platform.eRenderCoreFamily) { EXPECT_EQ(1U, appendedPlatformsSet.count(platformId)) << platformId; } else { EXPECT_EQ(0U, appendedPlatformsSet.count(platformId)) << platformId; } } NEO::appendPlatformsForGfxCore(gfxCore0, allEnabledPlatforms, appendedPlatforms); EXPECT_EQ(2 * appendedPlatformsSet.size(), appendedPlatforms.size()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenAsterixThenReturnAllEnabledPlatforms) { auto allEnabledPlatformsIds = NEO::getAllSupportedTargetPlatforms(); auto expected = NEO::toProductNames(allEnabledPlatformsIds); auto got = NEO::getTargetPlatformsForFatbinary("*"); EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenGenThenReturnAllEnabledPlatformsThatMatch) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); auto platform0 = allEnabledPlatforms[0]; auto gfxCore0 = NEO::hardwareInfoTable[platform0]->platform.eRenderCoreFamily; std::string genName = NEO::familyName[gfxCore0]; genName[0] = 'g'; // ocloc uses lower case std::vector platformsForGen; NEO::appendPlatformsForGfxCore(gfxCore0, allEnabledPlatforms, platformsForGen); auto expected = NEO::toProductNames(platformsForGen); auto got = NEO::getTargetPlatformsForFatbinary(genName); EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenMutiplePlatformThenReturnThosePlatforms) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); if (allEnabledPlatforms.size() < 2) { return; } auto platform0 = allEnabledPlatforms[0]; std::string platform0Name = NEO::hardwarePrefix[platform0]; auto platform1 = allEnabledPlatforms[1]; std::string platform1Name = NEO::hardwarePrefix[platform1]; std::vector expected{platform0Name, platform1Name}; auto got = NEO::getTargetPlatformsForFatbinary(platform0Name + "," + platform1Name); EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenPlatformOpenRangeFromThenReturnAllEnabledPlatformsThatMatch) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); if (allEnabledPlatforms.size() < 3) { return; } auto platform0 = allEnabledPlatforms[allEnabledPlatforms.size() / 2]; std::string platformName = NEO::hardwarePrefix[platform0]; std::vector expectedPlatforms; auto platformFrom = std::find(allEnabledPlatforms.begin(), allEnabledPlatforms.end(), platform0); expectedPlatforms.insert(expectedPlatforms.end(), platformFrom, allEnabledPlatforms.end()); auto expected = NEO::toProductNames(expectedPlatforms); auto got = NEO::getTargetPlatformsForFatbinary(platformName + "-"); EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenPlatformOpenRangeToThenReturnAllEnabledPlatformsThatMatch) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); if (allEnabledPlatforms.size() < 3) { return; } auto platform0 = allEnabledPlatforms[allEnabledPlatforms.size() / 2]; std::string platformName = NEO::hardwarePrefix[platform0]; std::vector expectedPlatforms; auto platformTo = std::find(allEnabledPlatforms.begin(), allEnabledPlatforms.end(), platform0); expectedPlatforms.insert(expectedPlatforms.end(), allEnabledPlatforms.begin(), platformTo + 1); auto expected = NEO::toProductNames(expectedPlatforms); auto got = NEO::getTargetPlatformsForFatbinary("-" + platformName); EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenPlatformClosedRangeThenReturnAllEnabledPlatformsThatMatch) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); if (allEnabledPlatforms.size() < 4) { return; } auto platformFrom = allEnabledPlatforms[1]; auto platformTo = allEnabledPlatforms[allEnabledPlatforms.size() - 2]; std::string platformNameFrom = NEO::hardwarePrefix[platformFrom]; std::string platformNameTo = NEO::hardwarePrefix[platformTo]; std::vector expectedPlatforms; expectedPlatforms.insert(expectedPlatforms.end(), allEnabledPlatforms.begin() + 1, allEnabledPlatforms.begin() + allEnabledPlatforms.size() - 1); auto expected = NEO::toProductNames(expectedPlatforms); auto got = NEO::getTargetPlatformsForFatbinary(platformNameFrom + "-" + platformNameTo); EXPECT_EQ(expected, got); got = NEO::getTargetPlatformsForFatbinary(platformNameTo + "-" + platformNameFrom); // swap min with max implicitly EXPECT_EQ(expected, got); } std::vector getEnabledCores() { std::vector ret; for (unsigned int coreId = 0; coreId < IGFX_MAX_CORE; ++coreId) { if (nullptr != NEO::familyName[coreId]) { ret.push_back(static_cast(coreId)); } } return ret; } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenGenOpenRangeFromThenReturnAllEnabledPlatformsThatMatch) { auto allSupportedPlatforms = NEO::getAllSupportedTargetPlatforms(); auto allEnabledCores = getEnabledCores(); if (allEnabledCores.size() < 3) { return; } auto core0 = allEnabledCores[allEnabledCores.size() / 2]; std::string genName = NEO::familyName[core0]; genName[0] = 'g'; // ocloc uses lower case std::vector expectedPlatforms; unsigned int coreIt = core0; while (coreIt < static_cast(IGFX_MAX_CORE)) { NEO::appendPlatformsForGfxCore(static_cast(coreIt), allSupportedPlatforms, expectedPlatforms); ++coreIt; } auto expected = NEO::toProductNames(expectedPlatforms); auto got = NEO::getTargetPlatformsForFatbinary(genName + "-"); EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenGenOpenRangeToThenReturnAllEnabledPlatformsThatMatch) { auto allSupportedPlatforms = NEO::getAllSupportedTargetPlatforms(); auto allEnabledCores = getEnabledCores(); if (allEnabledCores.size() < 3) { return; } auto core0 = allEnabledCores[allEnabledCores.size() / 2]; std::string genName = NEO::familyName[core0]; genName[0] = 'g'; // ocloc uses lower case std::vector expectedPlatforms; unsigned int coreIt = IGFX_UNKNOWN_CORE; ++coreIt; while (coreIt <= static_cast(core0)) { NEO::appendPlatformsForGfxCore(static_cast(coreIt), allSupportedPlatforms, expectedPlatforms); ++coreIt; } auto expected = NEO::toProductNames(expectedPlatforms); auto got = NEO::getTargetPlatformsForFatbinary("-" + genName); EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenGenClosedRangeThenReturnAllEnabledPlatformsThatMatch) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); auto allEnabledCores = getEnabledCores(); if (allEnabledCores.size() < 4) { return; } auto genFrom = allEnabledCores[1]; auto genTo = allEnabledCores[allEnabledCores.size() - 2]; std::string genNameFrom = NEO::familyName[genFrom]; genNameFrom[0] = 'g'; std::string genNameTo = NEO::familyName[genTo]; genNameTo[0] = 'g'; std::vector expectedPlatforms; auto genIt = genFrom; while (genIt <= genTo) { NEO::appendPlatformsForGfxCore(static_cast(genIt), allEnabledPlatforms, expectedPlatforms); genIt = static_cast(static_cast(genIt) + 1); } auto expected = NEO::toProductNames(expectedPlatforms); auto got = NEO::getTargetPlatformsForFatbinary(genNameFrom + "-" + genNameTo); EXPECT_EQ(expected, got); got = NEO::getTargetPlatformsForFatbinary(genNameTo + "-" + genNameFrom); // swap min with max implicitly EXPECT_EQ(expected, got); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenUnkownGenThenReturnEmptyList) { auto got = NEO::getTargetPlatformsForFatbinary("gen0"); EXPECT_TRUE(got.empty()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenMutiplePlatformWhenAnyOfPlatformsIsUnknownThenReturnEmptyList) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); auto platform0 = allEnabledPlatforms[0]; std::string platform0Name = NEO::hardwarePrefix[platform0]; auto got = NEO::getTargetPlatformsForFatbinary(platform0Name + ",unk"); EXPECT_TRUE(got.empty()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenPlatformOpenRangeFromWhenPlatformsIsUnkownThenReturnEmptyList) { auto got = NEO::getTargetPlatformsForFatbinary("unk-"); EXPECT_TRUE(got.empty()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenPlatformOpenRangeToWhenPlatformsIsUnkownThenReturnEmptyList) { auto got = NEO::getTargetPlatformsForFatbinary("-unk"); EXPECT_TRUE(got.empty()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenPlatformClosedRangeWhenAnyOfPlatformsIsUnkownThenReturnEmptyList) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); auto platform0 = allEnabledPlatforms[0]; std::string platform0Name = NEO::hardwarePrefix[platform0]; auto got = NEO::getTargetPlatformsForFatbinary("unk-" + platform0Name); EXPECT_TRUE(got.empty()); got = NEO::getTargetPlatformsForFatbinary(platform0Name + "-unk"); EXPECT_TRUE(got.empty()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenGenOpenRangeFromWhenGenIsUnknownTheReturnEmptyList) { auto got = NEO::getTargetPlatformsForFatbinary("gen2-"); EXPECT_TRUE(got.empty()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenGenOpenRangeToWhenGenIsUnknownTheReturnEmptyList) { auto got = NEO::getTargetPlatformsForFatbinary("-gen2"); EXPECT_TRUE(got.empty()); } TEST(OclocFatBinaryGetTargetPlatformsForFatbinary, GivenGenClosedRangeWhenAnyOfGensIsUnknownThenReturnEmptyList) { auto allEnabledPlatforms = NEO::getAllSupportedTargetPlatforms(); auto platform0 = allEnabledPlatforms[0]; auto gfxCore0 = NEO::hardwareInfoTable[platform0]->platform.eRenderCoreFamily; std::string genName = NEO::familyName[gfxCore0]; genName[0] = 'g'; // ocloc uses lower case auto got = NEO::getTargetPlatformsForFatbinary("gen2-" + genName); EXPECT_TRUE(got.empty()); got = NEO::getTargetPlatformsForFatbinary(genName + "-gen2"); EXPECT_TRUE(got.empty()); }