forked from arrayfire/arrayfire
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinternal.cpp
More file actions
124 lines (103 loc) · 3.25 KB
/
internal.cpp
File metadata and controls
124 lines (103 loc) · 3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*******************************************************
* Copyright (c) 2014, ArrayFire
* All rights reserved.
*
* This file is distributed under 3-clause BSD license.
* The complete license agreement can be obtained at:
* http://arrayfire.com/licenses/BSD-3-Clause
********************************************************/
#include <gtest/gtest.h>
#include <arrayfire.h>
#include <af/dim4.hpp>
#include <af/traits.hpp>
#include <af/internal.h>
#include <string>
#include <vector>
#include <testHelpers.hpp>
TEST(Internal, CreateStrided)
{
float ha[] = {1,
101, 102, 103, 104, 105,
201, 202, 203, 204, 205,
301, 302, 303, 304, 305,
401, 402, 403, 404, 405,
1010, 1020, 1030, 1040, 1050,
2010, 2020, 2030, 2040, 2050,
3010, 3020, 3030, 3040, 3050,
4010, 4020, 4030, 4040, 4050};
dim_t offset = 1;
unsigned ndims = 3;
dim_t dims[] = {3, 3, 2};
dim_t strides[] = {1, 5, 20};
af::array a = createStridedArray((void *)ha,
offset,
af::dim4(ndims, dims),
af::dim4(ndims, strides),
f32,
afHost);
af::dim4 astrides = getStrides(a);
af::dim4 adims = a.dims();
ASSERT_EQ(offset, getOffset(a));
for (int i = 0; i < (int)ndims; i++) {
ASSERT_EQ(strides[i], astrides[i]);
ASSERT_EQ(dims[i], adims[i]);
}
std::vector<float> va(a.elements());
a.host(&va[0]);
int o = offset;
for (int k = 0; k < dims[2]; k++) {
for (int j = 0; j < dims[1]; j++) {
for (int i = 0; i < dims[0]; i++) {
ASSERT_EQ(va[i + j * dims[0] + k * dims[0] * dims[1]],
ha[i * strides[0] + j * strides[1] + k * strides[2] + o])
<< "at ("
<< i << ","
<< j << ","
<< k << ")";
}
}
}
}
TEST(Internal, CheckInfo)
{
int xdim = 10;
int ydim = 8;
int xoff = 1;
int yoff = 2;
int xnum = 5;
int ynum = 3;
af::array a = af::randu(10, 8);
af::array b = a(af::seq(xoff, xoff + xnum - 1),
af::seq(yoff, yoff + ynum - 1));
af::dim4 strides = getStrides(b);
af::dim4 dims = b.dims();
dim_t offset = xoff + yoff * xdim;
ASSERT_EQ(dims[0], xnum);
ASSERT_EQ(dims[1], ynum);
ASSERT_EQ(isOwner(a), true);
ASSERT_EQ(isOwner(b), false);
ASSERT_EQ(getOffset(b), offset);
ASSERT_EQ(strides[0], 1);
ASSERT_EQ(strides[1], xdim);
ASSERT_EQ(strides[2], xdim * ydim);
ASSERT_EQ(getRawPtr(a), getRawPtr(b));
}
TEST(Internal, Linear)
{
af::array c;
{
af::array a = af::randu(10, 8);
// b is just pointing to same underlying data
// b is an owner;
af::array b = a;
ASSERT_EQ(isOwner(b), true);
// C is considered sub array
// C will not be an owner
c = a(af::span);
ASSERT_EQ(isOwner(c), false);
}
// Even though a and b are out of scope, c is still not an owner
{
ASSERT_EQ(isOwner(c), false);
}
}