1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
7 #include <gtest/gtest.h>
8 #include <ie_layouts.h>
10 using namespace testing;
11 using namespace InferenceEngine;
13 class LayoutTest : public ::testing::Test {
18 TEST_F(LayoutTest, offsetNCHW) {
19 size_t N = 2, C = 3, H = 4, W = 5;
20 SizeVector dims = { W, H, C, N };
22 LayoutOffsetCounter loc(InferenceEngine::Layout::NCHW, dims);
24 size_t p = loc.Offset({ 0, 0, 0, 0 });
27 p = loc.Offset({ 1, 1, 1, 1 });
30 p = loc.Offset({ 4, 3, 2, 1 });
35 TEST_F(LayoutTest, offsetNCHW2) {
36 size_t N = 1, C = 2, H = 3, W = 2;
37 SizeVector dims = { W, H, C, N };
39 LayoutOffsetCounter loc(InferenceEngine::Layout::NCHW, dims);
41 size_t p = loc.Offset({ 0, 1, 0, 0 });
47 TEST_F(LayoutTest, offsetNHWC) {
48 size_t N = 1, C = 2, H = 3, W = 2;
49 SizeVector dims = { W, H, C, N };
51 LayoutOffsetCounter loc(InferenceEngine::Layout::NHWC, dims);
53 size_t p = loc.Offset({ 0, 0, 0, 0 });
56 p = loc.Offset({ 0, 0, 1, 0 });
59 p = loc.Offset({ 1, 0, 0, 0 });
62 p = loc.Offset({ 1, 0, 1, 0 });
65 p = loc.Offset({ 0, 1, 0, 0 });
71 TEST_F(LayoutTest, convertNCHWtoNHWC) {
72 const size_t N = 1, C = 2, H = 3, W = 2;
73 SizeVector dims = { W, H, C, N };
75 float sourceBuf[N*C*H*W], destBuf[N*C*H*W], destBuf2[N*C*H*W];
77 for (int nc = 0; nc < N*C; nc++) {
79 for (int hw = 0; hw < H*W; hw++) {
80 sourceBuf[nc*H*W + hw] = v + p;
86 ConvertLayout<float>(InferenceEngine::Layout::NCHW, InferenceEngine::Layout::NCHW, sourceBuf, destBuf, dims);
87 EXPECT_TRUE( 0 == memcmp( sourceBuf, destBuf, N*C*H*W * sizeof(float) ) );
89 ConvertLayout(InferenceEngine::Layout::NCHW, InferenceEngine::Layout::NHWC, sourceBuf, destBuf, dims);
90 ConvertLayout(InferenceEngine::Layout::NHWC, InferenceEngine::Layout::NCHW, destBuf, destBuf2, dims);
91 EXPECT_TRUE( 0 == memcmp( sourceBuf, destBuf2, N*C*H*W * sizeof(float) ) );