Skip to content

Commit e59a8a2

Browse files
[CPU] Add test case for precision fp16 (#19721)
### Details: - *#16500 (comment) - *add test case for conv dconv fullconnect matmul mvn pad pooling subgraph softmax* ### Tickets: - *CVS-110112* --------- Signed-off-by: HU Yuan2 <[email protected]>
1 parent 5dab586 commit e59a8a2

32 files changed

+1110
-110
lines changed

src/inference/dev_api/openvino/runtime/system_conf.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ OPENVINO_RUNTIME_API bool with_cpu_x86_avx512_core_amx_int8();
146146
*/
147147
OPENVINO_RUNTIME_API bool with_cpu_x86_avx512_core_amx_bf16();
148148

149+
/**
150+
* @brief Checks whether CPU supports AMX fp16 capability
151+
* @ingroup ov_dev_api_system_conf
152+
* @return `True` is tAMX_FP16 instructions are available, `false` otherwise
153+
*/
154+
OPENVINO_RUNTIME_API bool with_cpu_x86_avx512_core_amx_fp16();
155+
149156
/**
150157
* @brief Checks whether CPU supports AMX capability
151158
* @ingroup ov_dev_api_system_conf

src/inference/src/system_conf.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ bool with_cpu_x86_avx512_core_amx_bf16() {
9292
return get_cpu_info().has(Xbyak::util::Cpu::tAMX_BF16);
9393
}
9494

95+
bool with_cpu_x86_avx512_core_amx_fp16() {
96+
return get_cpu_info().has(Xbyak::util::Cpu::tAMX_FP16);
97+
}
98+
9599
bool with_cpu_x86_avx512_core_amx() {
96100
return with_cpu_x86_avx512_core_amx_int8() || with_cpu_x86_avx512_core_amx_bf16();
97101
}
@@ -131,6 +135,9 @@ bool with_cpu_x86_avx512_core_amx_int8() {
131135
bool with_cpu_x86_avx512_core_amx_bf16() {
132136
return false;
133137
}
138+
bool with_cpu_x86_avx512_core_amx_fp16() {
139+
return false;
140+
}
134141
bool with_cpu_x86_avx512_core_amx() {
135142
return false;
136143
}

src/plugins/intel_cpu/src/graph.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1832,7 +1832,7 @@ void Graph::EnforceInferencePrecision() {
18321832

18331833
for (size_t i = 0; i < node->getOriginalInputsNumber(); i++) {
18341834
auto keepOriginalInputPrecisionAtPort = [](const NodePtr& node, const size_t inPort) {
1835-
// keep non-float precisions
1835+
// keep non-float32 precisions
18361836
if (node->getOriginalInputPrecisionAtPort(inPort) != ov::element::f32)
18371837
return true;
18381838

@@ -1876,7 +1876,7 @@ void Graph::EnforceInferencePrecision() {
18761876
}
18771877

18781878
for (size_t i = 0; i < node->getOriginalOutputsNumber(); i++) {
1879-
// keep non-float precisions
1879+
// keep non-float32 precisions
18801880
if (node->getOriginalOutputPrecisionAtPort(i) != ov::element::f32)
18811881
continue;
18821882

src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/convolution.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,16 @@ void ConvolutionLayerCPUTest::SetUp() {
160160
init_input_shapes({inputShape});
161161

162162
auto it = configuration.find(ov::hint::inference_precision.name());
163-
if (it != configuration.end() && it->second.as<ov::element::Type>() == ov::element::bf16) {
163+
ov::element::Type inference_precision = (it != configuration.end()) ?
164+
it->second.as<ov::element::Type>() : ov::element::undefined;
165+
if (inference_precision == ov::element::bf16) {
164166
selectedType += "_BF16";
165167
rel_threshold = 1e-2f;
166168
if (selectedType == "jit_gemm_BF16")
167169
rel_threshold = 0.05f;
170+
} else if (inference_precision == ov::element::f16) {
171+
selectedType += "_FP16";
172+
rel_threshold = 0.00125f;
168173
} else {
169174
selectedType = makeSelectedTypeStr(selectedType, netType);
170175
}

src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/convolution_backprop_data.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,15 @@ void DeconvolutionLayerCPUTest::SetUp() {
196196

197197
std::tie(kernel, stride, padBegin, padEnd, dilation, convOutChannels, padType, outPadding) = basicParamsSet;
198198

199-
if (additionalConfig[ov::hint::inference_precision.name()] == ov::element::bf16) {
199+
auto it = configuration.find(ov::hint::inference_precision.name());
200+
ov::element::Type inference_precision = (it != configuration.end()) ?
201+
it->second.as<ov::element::Type>() : ov::element::undefined;
202+
if (inference_precision == ov::element::bf16) {
200203
inType = outType = prec = ElementType::bf16;
201204
rel_threshold = 1e-2f;
205+
} else if (inference_precision == ov::element::f16) {
206+
inType = outType = prec = ElementType::f16;
207+
rel_threshold = 0.00125f;
202208
} else {
203209
inType = outType = prec;
204210
}

src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/matmul.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,22 @@ void MatMulLayerCPUTest::SetUp() {
118118
configuration.insert(additionalConfig.begin(), additionalConfig.end());
119119

120120
auto it = additionalConfig.find(ov::hint::inference_precision.name());
121-
if (it != additionalConfig.end() && it->second.as<ov::element::Type>() == ov::element::bf16) {
121+
ov::element::Type inference_precision = (it != additionalConfig.end()) ?
122+
it->second.as<ov::element::Type>() : ov::element::undefined;
123+
if (inference_precision == ov::element::bf16) {
122124
inType = outType = netType = ElementType::bf16;
123125
rel_threshold = abs_threshold = 1e-2f;
126+
} else if (inference_precision == ov::element::f16) {
127+
inType = outType = netType = ElementType::f16;
128+
rel_threshold = abs_threshold = 1e-4f;
124129
} else {
125130
inType = outType = netType;
126131
rel_threshold = 1e-4f;
127132
abs_threshold = 5e-4f;
128133
}
129134

130135
cpuNodeType = nodeType == MatMulNodeType::MatMul ? "MatMul" : "FullyConnected";
131-
selectedType = makeSelectedTypeStr(selectedType, outType);
136+
selectedType = makeSelectedTypeStr(selectedType, deduce_expected_precision(outType, configuration));
132137

133138
ov::ParameterVector params{std::make_shared<ov::op::v0::Parameter>(netType, inShapeA)};
134139

src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/pooling.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ std::string PoolingLayerCPUTest::getTestCaseName(const testing::TestParamInfo<po
1919
bool isInt8;
2020
CPUSpecificParams cpuParams;
2121
fusingSpecificParams fusingParams;
22-
std::tie(basicParamsSet, inputShapes, inPrc, isInt8, cpuParams, fusingParams) = obj.param;
22+
ov::AnyMap additionalConfig;
23+
std::tie(basicParamsSet, inputShapes, inPrc, isInt8, cpuParams, fusingParams, additionalConfig) = obj.param;
2324

2425
utils::PoolingTypes poolType;
2526
std::vector<size_t> kernel, stride;
@@ -53,6 +54,12 @@ std::string PoolingLayerCPUTest::getTestCaseName(const testing::TestParamInfo<po
5354
results << "Rounding=" << roundingType << "_";
5455
results << "AutoPad=" << padType << "_";
5556
results << "INT8=" << isInt8 << "_";
57+
if (!additionalConfig.empty()) {
58+
results << "_PluginConf";
59+
for (auto& item : additionalConfig) {
60+
results << "_" << item.first << "=" << item.second.as<std::string>();
61+
}
62+
}
5663

5764
results << CPUTestsBase::getTestCaseName(cpuParams);
5865
results << CpuTestWithFusing::getTestCaseName(fusingParams);
@@ -68,7 +75,9 @@ void PoolingLayerCPUTest::SetUp() {
6875
bool isInt8;
6976
CPUSpecificParams cpuParams;
7077
fusingSpecificParams fusingParams;
71-
std::tie(basicParamsSet, inputShapes, inPrc, isInt8, cpuParams, fusingParams) = this->GetParam();
78+
ov::AnyMap additionalConfig;
79+
std::tie(basicParamsSet, inputShapes, inPrc, isInt8, cpuParams, fusingParams, additionalConfig) = this->GetParam();
80+
configuration.insert(additionalConfig.begin(), additionalConfig.end());
7281

7382
utils::PoolingTypes poolType;
7483
std::vector<size_t> kernel, stride;
@@ -87,7 +96,7 @@ void PoolingLayerCPUTest::SetUp() {
8796
if (isInt8)
8897
selectedType = selectedType + "_I8";
8998
else
90-
selectedType = makeSelectedTypeStr(selectedType, inPrc);
99+
selectedType = makeSelectedTypeStr(selectedType, deduce_expected_precision(inPrc, configuration));
91100

92101
init_input_shapes({inputShapes});
93102

@@ -119,7 +128,8 @@ std::string MaxPoolingV8LayerCPUTest::getTestCaseName(
119128
InputShape inputShapes;
120129
ElementType inPrc;
121130
CPUSpecificParams cpuParams;
122-
std::tie(basicParamsSet, inputShapes, inPrc, cpuParams) = obj.param;
131+
ov::AnyMap additionalConfig;
132+
std::tie(basicParamsSet, inputShapes, inPrc, cpuParams, additionalConfig) = obj.param;
123133

124134
std::vector<size_t> kernel, stride, dilation;
125135
std::vector<size_t> padBegin, padEnd;
@@ -146,6 +156,12 @@ std::string MaxPoolingV8LayerCPUTest::getTestCaseName(
146156
results << "PE" << ov::test::utils::vec2str(padEnd) << "_";
147157
results << "Rounding=" << roundingType << "_";
148158
results << "AutoPad=" << padType << "_";
159+
if (!additionalConfig.empty()) {
160+
results << "_PluginConf";
161+
for (auto& item : additionalConfig) {
162+
results << "_" << item.first << "=" << item.second.as<std::string>();
163+
}
164+
}
149165

150166
results << CPUTestsBase::getTestCaseName(cpuParams);
151167
return results.str();
@@ -158,7 +174,9 @@ void MaxPoolingV8LayerCPUTest::SetUp() {
158174
InputShape inputShapes;
159175
ElementType inPrc;
160176
CPUSpecificParams cpuParams;
161-
std::tie(basicParamsSet, inputShapes, inPrc, cpuParams) = this->GetParam();
177+
ov::AnyMap additionalConfig;
178+
std::tie(basicParamsSet, inputShapes, inPrc, cpuParams, additionalConfig) = this->GetParam();
179+
configuration.insert(additionalConfig.begin(), additionalConfig.end());
162180

163181
std::vector<size_t> kernel, stride, dilation;
164182
std::vector<size_t> padBegin, padEnd;
@@ -172,7 +190,7 @@ void MaxPoolingV8LayerCPUTest::SetUp() {
172190
if (selectedType.empty()) {
173191
selectedType = getPrimitiveType();
174192
}
175-
selectedType = makeSelectedTypeStr(selectedType, inPrc);
193+
selectedType = makeSelectedTypeStr(selectedType, deduce_expected_precision(inPrc, configuration));
176194

177195
init_input_shapes({inputShapes});
178196

src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/pooling.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ using poolLayerCpuTestParamsSet = std::tuple<poolSpecificParams,
1919
ElementType, //inPrc
2020
bool, // isInt8
2121
CPUSpecificParams,
22-
fusingSpecificParams>;
22+
fusingSpecificParams,
23+
ov::AnyMap>;
24+
2325

2426
using maxPoolV8LayerCpuTestParamsSet = std::tuple<maxPoolV8SpecificParams,
2527
InputShape,
2628
ElementType,
27-
CPUSpecificParams>;
29+
CPUSpecificParams,
30+
ov::AnyMap>;
2831

2932
class PoolingLayerCPUTest : public testing::WithParamInterface<poolLayerCpuTestParamsSet>,
3033
virtual public SubgraphBaseTest, public CpuTestWithFusing {

src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/softmax.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ std::string SoftMaxLayerCPUTest::getTestCaseName(const testing::TestParamInfo<so
1616
ElementType inType;
1717
SoftMaxConfig config;
1818
std::string targetDevice;
19-
std::tie(inType, config, targetDevice, cpuParams) = obj.param;
19+
ov::AnyMap additionalConfig;
20+
std::tie(inType, config, targetDevice, cpuParams, additionalConfig) = obj.param;
2021

2122
std::ostringstream result;
2223
result << "netPRC=" << inType << "_";
@@ -30,6 +31,12 @@ std::string SoftMaxLayerCPUTest::getTestCaseName(const testing::TestParamInfo<so
3031
result << "axis=" << config.axis << "_";
3132
result << "trgDev=" << targetDevice;
3233
result << CPUTestsBase::getTestCaseName(cpuParams);
34+
if (!additionalConfig.empty()) {
35+
result << "_PluginConf";
36+
for (auto& item : additionalConfig) {
37+
result << "_" << item.first << "=" << item.second.as<std::string>();
38+
}
39+
}
3340

3441
return result.str();
3542
}
@@ -38,7 +45,9 @@ void SoftMaxLayerCPUTest::SetUp() {
3845
ElementType inType;
3946
SoftMaxConfig config;
4047
CPUSpecificParams cpuParams;
41-
std::tie(inType, config, targetDevice, cpuParams) = this->GetParam();
48+
ov::AnyMap additionalConfig;
49+
std::tie(inType, config, targetDevice, cpuParams, additionalConfig) = this->GetParam();
50+
configuration.insert(additionalConfig.begin(), additionalConfig.end());
4251

4352
std::tie(inFmts, outFmts, priority, selectedType) = cpuParams;
4453
if (selectedType.empty()) {
@@ -47,8 +56,10 @@ void SoftMaxLayerCPUTest::SetUp() {
4756

4857
if (inType == ElementType::bf16) {
4958
rel_threshold = 2e-2f;
59+
} else if (inType == ElementType::f16) {
60+
rel_threshold = 0.0025f;
5061
}
51-
selectedType = makeSelectedTypeStr(selectedType, inType);
62+
selectedType = makeSelectedTypeStr(selectedType, deduce_expected_precision(inType, configuration));
5263
init_input_shapes({config.inputShape});
5364
ov::ParameterVector params;
5465
for (auto&& shape : inputDynamicShapes)

src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/softmax.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ struct SoftMaxConfig {
1818
typedef std::tuple<ElementType, // netPrecision
1919
SoftMaxConfig, // softmaxTestConfig
2020
std::string, // targetDevice
21-
CPUSpecificParams>
21+
CPUSpecificParams,
22+
ov::AnyMap> //device_config
2223
softmaxCPUTestParams;
2324

2425
class SoftMaxLayerCPUTest : public testing::WithParamInterface<softmaxCPUTestParams>,

0 commit comments

Comments
 (0)