blob: e32a25febf661b098a9f9d24e7378e36aaf85f10 [file] [log] [blame]
saoste0150db26c2018-10-24 12:33:42 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#include "../DriverTestHelpers.hpp"
6#include <boost/test/unit_test.hpp>
7#include <boost/array.hpp>
8#include <log/log.h>
9#include "../TestTensor.hpp"
10#include "OperationsUtils.h"
11#include <boost/test/data/test_case.hpp>
12
13#include <cmath>
14
15BOOST_AUTO_TEST_SUITE(TransposeTests)
16
17using namespace android::hardware;
18using namespace driverTestHelpers;
19using namespace armnn_driver;
20
21namespace
22{
23
Kevin Mayedc5ffa2019-05-22 12:02:53 +010024#ifndef ARMCOMPUTECL_ENABLED
25 static const boost::array<armnn::Compute, 1> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef }};
26#else
27 static const boost::array<armnn::Compute, 2> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef, armnn::Compute::GpuAcc }};
28#endif
saoste0150db26c2018-10-24 12:33:42 +010029
30void TransposeTestImpl(const TestTensor & inputs, int32_t perm[],
31 const TestTensor & expectedOutputTensor, armnn::Compute computeDevice)
32{
33 auto driver = std::make_unique<ArmnnDriver>(DriverOptions(computeDevice));
34 V1_1::Model model = {};
35
36 AddInputOperand(model,inputs.GetDimensions());
Sadik Armagand6539c52019-05-22 18:00:30 +010037 AddTensorOperand(model, hidl_vec<uint32_t>{4}, perm, V1_0::OperandType::TENSOR_INT32);
saoste0150db26c2018-10-24 12:33:42 +010038 AddOutputOperand(model, expectedOutputTensor.GetDimensions());
39
40 model.operations.resize(1);
41 model.operations[0].type = V1_1::OperationType::TRANSPOSE;
42 model.operations[0].inputs = hidl_vec<uint32_t>{0, 1};
43 model.operations[0].outputs = hidl_vec<uint32_t>{2};
44
Sadik Armagand6539c52019-05-22 18:00:30 +010045 android::sp<V1_0::IPreparedModel> preparedModel = PrepareModel(model, *driver);
saoste0150db26c2018-10-24 12:33:42 +010046
47 // the request's memory pools will follow the same order as
48 // the inputs
49 DataLocation inloc = {};
50 inloc.poolIndex = 0;
51 inloc.offset = 0;
52 inloc.length = inputs.GetNumElements() * sizeof(float);
53 RequestArgument input = {};
54 input.location = inloc;
55 input.dimensions = inputs.GetDimensions();
56
57 // and an additional memory pool is needed for the output
58 DataLocation outloc = {};
59 outloc.poolIndex = 1;
60 outloc.offset = 0;
61 outloc.length = expectedOutputTensor.GetNumElements() * sizeof(float);
62 RequestArgument output = {};
63 output.location = outloc;
64 output.dimensions = expectedOutputTensor.GetDimensions();
65
66 // make the request based on the arguments
67 Request request = {};
68 request.inputs = hidl_vec<RequestArgument>{input};
69 request.outputs = hidl_vec<RequestArgument>{output};
70
71 // set the input data
72 AddPoolAndSetData(inputs.GetNumElements(),
73 request,
74 inputs.GetData());
75
76 // add memory for the output
77 android::sp<IMemory> outMemory = AddPoolAndGetData(expectedOutputTensor.GetNumElements(), request);
78 float* outdata = static_cast<float*>(static_cast<void*>(outMemory->getPointer()));
79
80 auto execStatus = Execute(preparedModel, request);
81
82 const float * expectedOutput = expectedOutputTensor.GetData();
83 for (unsigned int i = 0; i < expectedOutputTensor.GetNumElements(); ++i)
84 {
85 BOOST_TEST(outdata[i] == expectedOutput[i]);
86 }
87
88}
89} // namespace
90
91BOOST_DATA_TEST_CASE(Transpose , COMPUTE_DEVICES)
92{
93 int32_t perm[] = {3, 2, 0, 1};
94 TestTensor input{armnn::TensorShape{1, 2, 2, 2},{1, 2, 3, 4, 5, 6, 7, 8}};
95 TestTensor expected{armnn::TensorShape{2, 2, 2, 1},{1, 5, 2, 6, 3, 7, 4, 8}};
96
97 TransposeTestImpl(input, perm, expected, sample);
98}
99
100BOOST_DATA_TEST_CASE(TransposeNHWCToArmNN , COMPUTE_DEVICES)
101{
102 int32_t perm[] = {0, 2, 3, 1};
103 TestTensor input{armnn::TensorShape{1, 2, 2, 3},{1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33}};
104 TestTensor expected{armnn::TensorShape{1, 3, 2, 2},{1, 11, 21, 31, 2, 12, 22, 32, 3, 13, 23, 33}};
105
106 TransposeTestImpl(input, perm, expected, sample);
107}
108
109BOOST_DATA_TEST_CASE(TransposeArmNNToNHWC , COMPUTE_DEVICES)
110{
111 int32_t perm[] = {0, 3, 1, 2};
112 TestTensor input{armnn::TensorShape{1, 2, 2, 2},{1, 2, 3, 4, 5, 6, 7, 8}};
113 TestTensor expected{armnn::TensorShape{1, 2, 2, 2},{1, 5, 2, 6, 3, 7, 4, 8}};
114
115 TransposeTestImpl(input, perm, expected, sample);
116}
117
118BOOST_AUTO_TEST_SUITE_END()
119