Add cpuid check for CLFLUSH

Change-Id: Ie76f314f7dac0cbc6bf987eab95ad0508f994fb7
Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz 2019-07-31 18:43:05 -07:00 committed by sys_ocldev
parent a43bbc13e3
commit d36e7972f3
12 changed files with 184 additions and 58 deletions

View File

@ -6,6 +6,7 @@
set(NEO_CORE_UTILITIES_TESTS
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/cpuinfo_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/spinlock_tests.cpp
)

View File

@ -0,0 +1,143 @@
/*
* Copyright (C) 2017-2019 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "core/utilities/cpu_info.h"
#include "gtest/gtest.h"
using namespace NEO;
void mockCpuidEnableAll(int cpuInfo[4], int functionId) {
cpuInfo[0] = -1;
cpuInfo[1] = -1;
cpuInfo[2] = -1;
cpuInfo[3] = -1;
}
void mockCpuidFunctionAvailableDisableAll(int cpuInfo[4], int functionId) {
cpuInfo[0] = -1;
cpuInfo[1] = 0;
cpuInfo[2] = 0;
cpuInfo[3] = 0;
}
void mockCpuidFunctionNotAvailableDisableAll(int cpuInfo[4], int functionId) {
cpuInfo[0] = 0;
cpuInfo[1] = 0;
cpuInfo[2] = 0;
cpuInfo[3] = 0;
}
TEST(CpuInfoTest, giveFunctionIsNotAvailableWhenFeatureIsNotSupportedThenMaskBitIsOff) {
void (*defaultCpuidFunc)(int[4], int) = CpuInfo::cpuidFunc;
CpuInfo::cpuidFunc = mockCpuidFunctionNotAvailableDisableAll;
CpuInfo testCpuInfo;
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureFpu));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureCmov));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureMmx));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureFxsave));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSse));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE2));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE3));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSssE3));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE41));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE42));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureMovbe));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featurePopcnt));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featurePclmulqdq));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureAes));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureF16C));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureAvx));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureRdrnd));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureFma));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureBmi));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureLzcnt));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureHle));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureRtm));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureAvX2));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureClflush));
CpuInfo::cpuidFunc = defaultCpuidFunc;
}
TEST(CpuInfoTest, giveFunctionIsAvailableWhenFeatureIsNotSupportedThenMaskBitIsOff) {
void (*defaultCpuidFunc)(int[4], int) = CpuInfo::cpuidFunc;
CpuInfo::cpuidFunc = mockCpuidFunctionAvailableDisableAll;
CpuInfo testCpuInfo;
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureFpu));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureCmov));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureMmx));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureFxsave));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSse));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE2));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE3));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSssE3));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE41));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE42));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureMovbe));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featurePopcnt));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featurePclmulqdq));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureAes));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureF16C));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureAvx));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureRdrnd));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureFma));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureBmi));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureLzcnt));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureHle));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureRtm));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureAvX2));
EXPECT_FALSE(testCpuInfo.isFeatureSupported(CpuInfo::featureClflush));
CpuInfo::cpuidFunc = defaultCpuidFunc;
}
TEST(CpuInfoTest, whenFeatureIsSupportedThenMaskBitIsOn) {
void (*defaultCpuidFunc)(int[4], int) = CpuInfo::cpuidFunc;
CpuInfo::cpuidFunc = mockCpuidEnableAll;
CpuInfo testCpuInfo;
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureFpu));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureCmov));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureMmx));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureFxsave));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureSse));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE2));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE3));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureSssE3));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE41));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureSsE42));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureMovbe));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featurePopcnt));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featurePclmulqdq));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureAes));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureF16C));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureAvx));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureRdrnd));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureFma));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureBmi));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureLzcnt));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureHle));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureRtm));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureAvX2));
EXPECT_TRUE(testCpuInfo.isFeatureSupported(CpuInfo::featureClflush));
CpuInfo::cpuidFunc = defaultCpuidFunc;
}
TEST(CpuInfo, cpuidex) {
const CpuInfo &cpuInfo = CpuInfo::getInstance();
uint32_t cpuRegsInfo[4];
uint32_t subleaf = 0;
cpuInfo.cpuidex(cpuRegsInfo, 4, subleaf);
}

View File

@ -6,7 +6,18 @@
set(NEO_CORE_UTILITIES
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/cpu_info.h
${CMAKE_CURRENT_SOURCE_DIR}/spinlock.h
)
set(NEO_CORE_UTILITIES_WINDOWS
${CMAKE_CURRENT_SOURCE_DIR}/windows/cpu_info.cpp
)
set(NEO_CORE_UTILITIES_LINUX
${CMAKE_CURRENT_SOURCE_DIR}/linux/cpu_info.cpp
)
set_property(GLOBAL PROPERTY NEO_CORE_UTILITIES ${NEO_CORE_UTILITIES})
set_property(GLOBAL PROPERTY NEO_CORE_UTILITIES_WINDOWS ${NEO_CORE_UTILITIES_WINDOWS})
set_property(GLOBAL PROPERTY NEO_CORE_UTILITIES_LINUX ${NEO_CORE_UTILITIES_LINUX})

View File

@ -48,6 +48,7 @@ struct CpuInfo {
static const uint64_t featureAvX512Cd = 0x400000000ULL;
static const uint64_t featureSha = 0x800000000ULL;
static const uint64_t featureMpx = 0x1000000000ULL;
static const uint64_t featureClflush = 0x2000000000ULL;
CpuInfo() : features(featureNone) {
}
@ -140,6 +141,10 @@ struct CpuInfo {
{
features |= cpuInfo[2] & BIT(30) ? featureRdrnd : featureNone;
}
{
features |= cpuInfo[3] & BIT(19) ? featureClflush : featureNone;
}
}
if (numFunctionIds >= 7u) {
@ -186,6 +191,7 @@ struct CpuInfo {
}
static void (*cpuidexFunc)(int *, int, int);
static void (*cpuidFunc)(int[4], int);
protected:
mutable uint64_t features;

View File

@ -5,24 +5,29 @@
*
*/
#include "runtime/utilities/cpu_info.h"
#include "core/utilities/cpu_info.h"
#include <cpuid.h>
namespace NEO {
void cpuid_linux_wrapper(int cpuInfo[4], int functionId) {
__cpuid_count(functionId, 0, cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]);
}
void cpuidex_linux_wrapper(int *cpuInfo, int functionId, int subfunctionId) {
__cpuid_count(functionId, subfunctionId, cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]);
}
void (*CpuInfo::cpuidexFunc)(int *, int, int) = cpuidex_linux_wrapper;
void (*CpuInfo::cpuidFunc)(int[4], int) = cpuid_linux_wrapper;
const CpuInfo CpuInfo::instance;
void CpuInfo::cpuid(
uint32_t cpuInfo[4],
uint32_t functionId) const {
__cpuid_count(functionId, 0, cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]);
cpuidFunc(reinterpret_cast<int *>(cpuInfo), functionId);
}
void CpuInfo::cpuidex(

View File

@ -5,24 +5,29 @@
*
*/
#include "runtime/utilities/cpu_info.h"
#include "core/utilities/cpu_info.h"
#include <intrin.h>
namespace NEO {
void cpuid_windows_wrapper(int cpuInfo[4], int functionId) {
__cpuid(cpuInfo, functionId);
}
void cpuidex_windows_wrapper(int *cpuInfo, int functionId, int subfunctionId) {
__cpuidex(cpuInfo, functionId, subfunctionId);
}
void (*CpuInfo::cpuidexFunc)(int *, int, int) = cpuidex_windows_wrapper;
void (*CpuInfo::cpuidFunc)(int[4], int) = cpuid_windows_wrapper;
const CpuInfo CpuInfo::instance;
void CpuInfo::cpuid(
uint32_t cpuInfo[4],
uint32_t functionId) const {
__cpuid(reinterpret_cast<int *>(cpuInfo), functionId);
cpuidFunc(reinterpret_cast<int *>(cpuInfo), functionId);
}
void CpuInfo::cpuidex(

View File

@ -7,8 +7,8 @@
#include "runtime/command_queue/local_id_gen.h"
#include "core/utilities/cpu_info.h"
#include "runtime/helpers/aligned_memory.h"
#include "runtime/utilities/cpu_info.h"
#include <array>

View File

@ -7,6 +7,7 @@
#include "runtime/os_interface/hw_info_config.h"
#include "core/utilities/cpu_info.h"
#include "runtime/command_stream/preemption.h"
#include "runtime/gen_common/hw_cmds.h"
#include "runtime/helpers/hw_helper.h"
@ -15,7 +16,6 @@
#include "runtime/os_interface/debug_settings_manager.h"
#include "runtime/os_interface/linux/drm_neo.h"
#include "runtime/os_interface/linux/os_interface.h"
#include "runtime/utilities/cpu_info.h"
#include <cstring>

View File

@ -8,7 +8,6 @@ set(RUNTIME_SRCS_UTILITIES_BASE
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/api_intercept.h
${CMAKE_CURRENT_SOURCE_DIR}/arrayref.h
${CMAKE_CURRENT_SOURCE_DIR}/cpu_info.h
${CMAKE_CURRENT_SOURCE_DIR}/debug_file_reader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/debug_file_reader.h
${CMAKE_CURRENT_SOURCE_DIR}/debug_settings_reader_creator.h
@ -35,15 +34,19 @@ list(APPEND RUNTIME_SRCS_UTILITIES_BASE ${NEO_CORE_UTILITIES})
set(RUNTIME_SRCS_UTILITIES_WINDOWS
${CMAKE_CURRENT_SOURCE_DIR}/windows/directory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/windows/timer_util.cpp
${CMAKE_CURRENT_SOURCE_DIR}/windows/cpu_info.cpp
)
get_property(NEO_CORE_UTILITIES_WINDOWS GLOBAL PROPERTY NEO_CORE_UTILITIES_WINDOWS)
list(APPEND RUNTIME_SRCS_UTILITIES_WINDOWS ${NEO_CORE_UTILITIES_WINDOWS})
set(RUNTIME_SRCS_UTILITIES_LINUX
${CMAKE_CURRENT_SOURCE_DIR}/linux/directory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/linux/timer_util.cpp
${CMAKE_CURRENT_SOURCE_DIR}/linux/cpu_info.cpp
)
get_property(NEO_CORE_UTILITIES_LINUX GLOBAL PROPERTY NEO_CORE_UTILITIES_LINUX)
list(APPEND RUNTIME_SRCS_UTILITIES_LINUX ${NEO_CORE_UTILITIES_LINUX})
target_sources(${NEO_STATIC_LIB_NAME} PRIVATE ${RUNTIME_SRCS_UTILITIES_BASE})
set_property(GLOBAL PROPERTY RUNTIME_SRCS_UTILITIES_BASE ${RUNTIME_SRCS_UTILITIES_BASE})
set_property(GLOBAL PROPERTY RUNTIME_SRCS_UTILITIES_LINUX ${RUNTIME_SRCS_UTILITIES_LINUX})

View File

@ -7,9 +7,9 @@
#pragma once
#include "core/utilities/cpu_info.h"
#include "runtime/os_interface/hw_info_config.h"
#include "runtime/os_interface/os_interface.h"
#include "runtime/utilities/cpu_info.h"
#include "unit_tests/os_interface/hw_info_config_tests.h"
#include "unit_tests/os_interface/linux/drm_mock.h"

View File

@ -9,7 +9,6 @@ set(IGDRCL_SRCS_tests_utilities
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/containers_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/containers_tests_helpers
${CMAKE_CURRENT_SOURCE_DIR}/cpuinfo_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/debug_file_reader_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/debug_file_reader_tests.inl
${CMAKE_CURRENT_SOURCE_DIR}/debug_settings_reader_tests.cpp

View File

@ -1,47 +0,0 @@
/*
* Copyright (C) 2017-2019 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "runtime/utilities/cpu_info.h"
#include "gtest/gtest.h"
using namespace NEO;
TEST(CpuInfo, detectsSSE4) {
const CpuInfo &cpuInfo = CpuInfo::getInstance();
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureFpu));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureCmov));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureMmx));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureFxsave));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureSse));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureSsE2));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureSsE3));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureSssE3));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureSsE41));
EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::featureSsE42));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_MOVBE));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_POPCNT));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_PCLMULQDQ));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_AES));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_F16C));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_AVX));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_RDRND));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_FMA));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_BMI));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_LZCNT));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_HLE));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_RTM));
//EXPECT_TRUE(cpuInfo.isFeatureSupported(CpuInfo::_FEATURE_AVX2));
}
TEST(CpuInfo, cpuidex) {
const CpuInfo &cpuInfo = CpuInfo::getInstance();
uint32_t cpuRegsInfo[4];
uint32_t subleaf = 0;
cpuInfo.cpuidex(cpuRegsInfo, 4, subleaf);
}