|
|
|
@@ -96,7 +96,7 @@ void CompareOutput(Tensor *output, const float *expect_data, const float atol) { |
|
|
|
for (int l = 0; l < L; ++l) { |
|
|
|
for (int m = 0; m < M; ++m) { |
|
|
|
auto err = std::fabs(output_data[cn] - expect_data[cn]); |
|
|
|
if (first_err_idx == -1 && max_err > atol) { |
|
|
|
if (first_err_idx == -1 && err > atol) { |
|
|
|
first_err_idx = cn; |
|
|
|
} |
|
|
|
if (err > max_err) { |
|
|
|
@@ -128,22 +128,10 @@ void CompareOutput(Tensor *output, const float *expect_data, const float atol) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Format get_op_format(Format input_format) { |
|
|
|
switch (input_format) { |
|
|
|
case Format_NHWC: |
|
|
|
case Format_NHWC4: |
|
|
|
return Format_NHWC4; |
|
|
|
case Format_NCHW: |
|
|
|
return Format_NHWC4; |
|
|
|
default: |
|
|
|
return Format_NC4HW4; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void TEST_MAIN(const std::string &attr, Format input_format, Format output_format, const TypeId data_type, |
|
|
|
const float atol, const float *input_data, const float *weight_data, const float *bias_data, |
|
|
|
const float *expect_data) { |
|
|
|
auto param = std::make_unique<ConvParameter>(); |
|
|
|
void TEST_MAIN(const std::string &attr, Format input_format, Format output_format, Format op_format, |
|
|
|
const TypeId data_type, const float atol, const float *input_data, const float *weight_data, |
|
|
|
const float *bias_data, const float *expect_data) { |
|
|
|
auto param = static_cast<ConvParameter *>(malloc(sizeof(ConvParameter))); |
|
|
|
if (param == nullptr) { |
|
|
|
MS_LOG(ERROR) << "ConvParameter create error."; |
|
|
|
return; |
|
|
|
@@ -179,13 +167,15 @@ void TEST_MAIN(const std::string &attr, Format input_format, Format output_forma |
|
|
|
LoadData(&bias, bias_data); |
|
|
|
|
|
|
|
MS_LOG(DEBUG) << "create OpenCL Kernel"; |
|
|
|
auto kernel = |
|
|
|
ConvolutionOpenCLKernel(reinterpret_cast<OpParameter *>(param.release()), {&input, &weight, &bias}, {&output}); |
|
|
|
kernel.SetFormatType(get_op_format(input_format)); |
|
|
|
kernel.Init(); |
|
|
|
std::vector<lite::Tensor *> inputs{&input, &weight, &bias}; |
|
|
|
std::vector<lite::Tensor *> outputs{&output}; |
|
|
|
auto kernel = std::make_unique<ConvolutionOpenCLKernel>(reinterpret_cast<OpParameter *>(param), inputs, outputs); |
|
|
|
kernel->SetFormatType(op_format); |
|
|
|
kernel->Init(); |
|
|
|
|
|
|
|
MS_LOG(DEBUG) << "create SubGraph"; |
|
|
|
auto sub_graph = new (std::nothrow) SubGraphOpenCLKernel({&input}, {&output}, {&kernel}, {&kernel}, {&kernel}); |
|
|
|
std::vector<kernel::LiteKernel *> kernels{kernel.release()}; |
|
|
|
auto sub_graph = new (std::nothrow) SubGraphOpenCLKernel({&input}, {&output}, kernels, kernels, kernels); |
|
|
|
if (sub_graph == nullptr) { |
|
|
|
return; |
|
|
|
} |
|
|
|
@@ -203,8 +193,8 @@ void TEST_MAIN(const std::string &attr, Format input_format, Format output_forma |
|
|
|
delete sub_graph; |
|
|
|
} |
|
|
|
|
|
|
|
void TEST_MAIN(const std::string &attr, Format input_format, Format output_format, const TypeId data_type, |
|
|
|
const float atol, const std::string &data_path) { |
|
|
|
void TEST_MAIN(const std::string &attr, Format input_format, Format output_format, Format op_format, |
|
|
|
const TypeId data_type, const float atol, const std::string &data_path) { |
|
|
|
auto testcase_path = data_path + "/" + attr + "/"; |
|
|
|
std::map<Format, std::string> format_str{ |
|
|
|
{Format_NCHW, "NCHW"}, {Format_NHWC, "NHWC"}, {Format_NHWC4, "NHWC4"}, {Format_NC4HW4, "NC4HW4"}}; |
|
|
|
@@ -227,27 +217,29 @@ void TEST_MAIN(const std::string &attr, Format input_format, Format output_forma |
|
|
|
printf("bias [0-3]: %7.3f %7.3f %7.3f\n", bias_data[0], bias_data[1], bias_data[2]); |
|
|
|
printf("expect[0-3]: %7.3f %7.3f %7.3f\n", expect_data[0], expect_data[1], expect_data[2]); |
|
|
|
|
|
|
|
TEST_MAIN(attr, input_format, output_format, data_type, atol, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, input_format, output_format, op_format, data_type, atol, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, in1x224x224x3_out1x112x112x32_k33_s22_p0101) { |
|
|
|
std::string attr = |
|
|
|
"inputNHWC_1x224x224x3_outputNHWC_1x112x112x32_kernelHW_3x3_strideHW_2x2_padTopBottomLeftRight_0x1x0x1_dilationHW_" |
|
|
|
"1x1"; |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, kNumberTypeFloat32, 2e-6f, "testcases/mobilenetv2_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, kNumberTypeFloat16, 2e-2f, "testcases/mobilenetv2_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, kNumberTypeFloat32, 2e-6f, "testcases/mobilenetv2_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, kNumberTypeFloat16, 2e-2f, "testcases/mobilenetv2_fp32/"); |
|
|
|
// TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, Format_NHWC4, kNumberTypeFloat32, 2e-6f, |
|
|
|
// "testcases/mobilenetv2_fp32/"); TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, Format_NHWC4, kNumberTypeFloat16, |
|
|
|
// 2e-2f, "testcases/mobilenetv2_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, Format_NHWC4, kNumberTypeFloat32, 2e-6f, "testcases/mobilenetv2_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, Format_NHWC4, kNumberTypeFloat16, 2e-2f, "testcases/mobilenetv2_fp32/"); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, winograd_inputNHWC_1x16x256x96_outputNHWC_1x16x256x80) { |
|
|
|
std::string attr = |
|
|
|
"inputNHWC_1x16x256x96_outputNHWC_1x16x256x80_kernelHW_3x3_strideHW_1x1_padTopBottomLeftRight_1x1x1x1_dilationHW_" |
|
|
|
"1x1"; |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, kNumberTypeFloat32, 1e-4f, "testcases/test_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, kNumberTypeFloat16, 0.6f, "testcases/test_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, kNumberTypeFloat32, 1e-4f, "testcases/test_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, kNumberTypeFloat16, 0.6f, "testcases/test_fp32/"); |
|
|
|
// TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, Format_NHWC4, kNumberTypeFloat32, 1e-4f, "testcases/test_fp32/"); |
|
|
|
// TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, Format_NHWC4, kNumberTypeFloat16, 0.6f, "testcases/test_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, Format_NHWC4, kNumberTypeFloat32, 1e-4f, "testcases/test_fp32/"); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, Format_NHWC4, kNumberTypeFloat16, 0.6f, "testcases/test_fp32/"); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, simple_test0_NHWC) { |
|
|
|
@@ -257,9 +249,12 @@ TEST_F(TestConvolutionOpenCL, simple_test0_NHWC) { |
|
|
|
float weight_data[] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; |
|
|
|
float bias_data[] = {0.0f, 0.0f}; |
|
|
|
float expect_data[] = {1.0f, 1.0f, 5.0f, 5.0f, 9.0f, 9.0f, 13.0f, 13.0f}; |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, simple_test0_NCHW) { |
|
|
|
std::string attr = |
|
|
|
"inputNHWC_1x2x2x2_outputNHWC_1x2x2x2_kernelHW_1x1_strideHW_1x1_padTopBottomLeftRight_0x0x0x0_dilationHW_1x1"; |
|
|
|
@@ -267,8 +262,10 @@ TEST_F(TestConvolutionOpenCL, simple_test0_NCHW) { |
|
|
|
float weight_data[] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; |
|
|
|
float bias_data[] = {0.0f, 0.0f}; |
|
|
|
float expect_data[] = {1.0f, 5.0f, 9.0f, 13.0f, 1.0f, 5.0f, 9.0f, 13.0f}; |
|
|
|
TEST_MAIN(attr, Format_NCHW, Format_NCHW, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NCHW, Format_NCHW, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NCHW, Format_NCHW, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NCHW, Format_NCHW, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, simple_test0_NHWC4_and_NC4HW4) { |
|
|
|
@@ -279,14 +276,14 @@ TEST_F(TestConvolutionOpenCL, simple_test0_NHWC4_and_NC4HW4) { |
|
|
|
float bias_data[] = {0.0f, 0.0f}; |
|
|
|
float expect_data[] = {1.0f, 1.0f, 0.0f, 0.0f, 5.0f, 5.0f, 0.0f, 0.0f, |
|
|
|
9.0f, 9.0f, 0.0f, 0.0f, 13.0f, 13.0f, 0.0f, 0.0f}; |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, |
|
|
|
bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC4, Format_NHWC4, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, |
|
|
|
bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, |
|
|
|
bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NC4HW4, Format_NC4HW4, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, |
|
|
|
bias_data, expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, simple_test1) { |
|
|
|
@@ -296,31 +293,56 @@ TEST_F(TestConvolutionOpenCL, simple_test1) { |
|
|
|
float weight_data[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f}; |
|
|
|
float bias_data[] = {0.5f, -0.5f}; |
|
|
|
float expect_data[] = {2.5f, 3.5f, 8.5f, 17.5f, 14.5f, 31.5f, 20.5f, 45.5f}; |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, simple_test2) { |
|
|
|
std::string attr = |
|
|
|
"inputNHWC_1x2x2x2_outputNHWC_1x2x2x1_kernelHW_2x2_strideHW_1x1_padTopBottomLeftRight_0x0x0x0_dilationHW_1x1"; |
|
|
|
"inputNHWC_1x2x2x2_outputNHWC_1x2x2x1_kernelHW_2x2_strideHW_1x1_padTopBottomLeftRight_0x1x0x1_dilationHW_1x1"; |
|
|
|
float input_data[] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f}; |
|
|
|
float weight_data[] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; |
|
|
|
float bias_data[] = {0.0f}; |
|
|
|
float expect_data[] = {28.0f, 18.0f, 22.0f, 13.0f}; |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, simple_test3) { |
|
|
|
std::string attr = |
|
|
|
"inputNHWC_1x2x2x2_outputNHWC_1x2x2x2_kernelHW_2x2_strideHW_1x1_padTopBottomLeftRight_0x0x0x0_dilationHW_1x1"; |
|
|
|
"inputNHWC_1x2x2x2_outputNHWC_1x2x2x2_kernelHW_2x2_strideHW_1x1_padTopBottomLeftRight_0x1x0x1_dilationHW_1x1"; |
|
|
|
float input_data[] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f}; |
|
|
|
float weight_data[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, |
|
|
|
9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}; |
|
|
|
float bias_data[] = {0.5f, -0.5f}; |
|
|
|
float expect_data[] = {168.5f, 391.5f, 80.5f, 223.5f, 60.5f, 235.5f, 20.5f, 123.5f}; |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
TEST_F(TestConvolutionOpenCL, simple_test3_batch2) { |
|
|
|
std::string attr = |
|
|
|
"inputNHWC_2x2x2x2_outputNHWC_2x2x2x2_kernelHW_2x2_strideHW_1x1_padTopBottomLeftRight_0x1x0x1_dilationHW_1x1"; |
|
|
|
float input_data[] = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f}; |
|
|
|
float weight_data[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, |
|
|
|
9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}; |
|
|
|
float bias_data[] = {0.5f, -0.5f}; |
|
|
|
float expect_data[] = {168.5f, 391.5f, 80.5f, 223.5f, 60.5f, 235.5f, 20.5f, 123.5f, |
|
|
|
168.5f, 391.5f, 80.5f, 223.5f, 60.5f, 235.5f, 20.5f, 123.5f}; |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NHWC4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, bias_data, |
|
|
|
expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NC4HW4, kNumberTypeFloat32, 1e-3f, input_data, weight_data, |
|
|
|
bias_data, expect_data); |
|
|
|
TEST_MAIN(attr, Format_NHWC, Format_NHWC, Format_NC4HW4, kNumberTypeFloat16, 1e-6f, input_data, weight_data, |
|
|
|
bias_data, expect_data); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace mindspore |