Skip to content

Commit 0cd16d2

Browse files
shoumikhinpytorchbot
authored andcommitted
Add extra checks for the provided dim order and strides. (#5377)
Summary: Pull Request resolved: #5377 Also make sure the scalar tensors stay static. Reviewed By: kirklandsign Differential Revision: D62681004 fbshipit-source-id: 57e035bcc5d9a4ffb2571144d7b3ed72ff84b193 (cherry picked from commit 0a501eb)
1 parent eecf74f commit 0cd16d2

File tree

6 files changed

+77
-25
lines changed

6 files changed

+77
-25
lines changed

extension/tensor/tensor_impl_ptr.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ TensorImplPtr make_tensor_impl_ptr(
6262
exec_aten::TensorShapeDynamism dynamism,
6363
std::function<void(void*)> deleter) {
6464
const auto dim = sizes.size();
65+
ET_CHECK_MSG(
66+
dim_order.empty() || dim_order.size() == dim,
67+
"dim_order size must match sizes or be empty.");
68+
ET_CHECK_MSG(
69+
strides.empty() || strides.size() == dim,
70+
"strides size must match sizes or be empty.");
71+
6572
if (dim_order.empty()) {
6673
dim_order.resize(dim);
6774
std::iota(dim_order.begin(), dim_order.end(), 0);
@@ -89,7 +96,7 @@ TensorImplPtr make_tensor_impl_ptr(
8996
data,
9097
dim_order.data(),
9198
strides.data(),
92-
dynamism);
99+
dim > 0 ? dynamism : exec_aten::TensorShapeDynamism::STATIC);
93100
return TensorImplPtr(
94101
tensor_impl.release(),
95102
TensorImplPtrDeleter{

extension/tensor/tensor_impl_ptr.h

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ TensorImplPtr make_tensor_impl_ptr(
8787
* @return A TensorImplPtr that manages the newly created TensorImpl.
8888
*/
8989
template <typename T = float>
90-
TensorImplPtr make_tensor_impl_ptr(
90+
inline TensorImplPtr make_tensor_impl_ptr(
9191
std::vector<exec_aten::SizesType> sizes,
9292
std::vector<T> data,
9393
std::vector<exec_aten::DimOrderType> dim_order = {},
@@ -123,23 +123,13 @@ TensorImplPtr make_tensor_impl_ptr(
123123
* @return A TensorImplPtr that manages the newly created TensorImpl.
124124
*/
125125
template <typename T = float>
126-
TensorImplPtr make_tensor_impl_ptr(
126+
inline TensorImplPtr make_tensor_impl_ptr(
127127
std::vector<T> data,
128128
exec_aten::TensorShapeDynamism dynamism =
129129
exec_aten::TensorShapeDynamism::DYNAMIC_BOUND) {
130-
constexpr exec_aten::ScalarType scalar_type =
131-
runtime::CppTypeToScalarType<T>::value;
132130
std::vector<exec_aten::SizesType> sizes{exec_aten::SizesType(data.size())};
133-
const auto raw_data_ptr = data.data();
134-
auto data_ptr = std::make_shared<std::vector<T>>(std::move(data));
135131
return make_tensor_impl_ptr(
136-
scalar_type,
137-
std::move(sizes),
138-
raw_data_ptr,
139-
{0},
140-
{1},
141-
dynamism,
142-
[data_ptr = std::move(data_ptr)](void*) {});
132+
std::move(sizes), std::move(data), {0}, {1}, dynamism);
143133
}
144134

145135
/**

extension/tensor/tensor_ptr.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,19 @@ TensorPtr make_tensor_ptr(
235235
std::initializer_list<T> data,
236236
exec_aten::TensorShapeDynamism dynamism =
237237
exec_aten::TensorShapeDynamism::DYNAMIC_BOUND) {
238-
return make_tensor_ptr(std::vector<T>(data), dynamism);
238+
return make_tensor_ptr(make_tensor_impl_ptr(std::vector<T>(data), dynamism));
239+
}
240+
241+
/**
242+
* Creates a TensorPtr that manages a Tensor with a single scalar value.
243+
*
244+
* @tparam T The C++ type of the scalar value.
245+
* @param value The scalar value to be used for the Tensor.
246+
* @return A TensorPtr that manages the newly created TensorImpl.
247+
*/
248+
template <typename T>
249+
TensorPtr make_tensor_ptr(T value) {
250+
return make_tensor_ptr(make_tensor_impl_ptr({}, std::vector<T>{value}));
239251
}
240252

241253
/**

extension/tensor/tensor_ptr_maker.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,10 +421,8 @@ inline TensorPtr full(
421421
*/
422422
inline TensorPtr scalar_tensor(
423423
exec_aten::Scalar value,
424-
exec_aten::ScalarType type = exec_aten::ScalarType::Float,
425-
exec_aten::TensorShapeDynamism dynamism =
426-
exec_aten::TensorShapeDynamism::DYNAMIC_BOUND) {
427-
return full({}, value, type, dynamism);
424+
exec_aten::ScalarType type = exec_aten::ScalarType::Float) {
425+
return full({}, value, type);
428426
}
429427

430428
/**

extension/tensor/test/tensor_impl_ptr_test.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,3 +377,19 @@ TEST_F(TensorImplPtrTest, TensorImplUint8BufferTooLarge) {
377377
EXPECT_EQ(tensor_impl->strides()[0], 2);
378378
EXPECT_EQ(tensor_impl->strides()[1], 1);
379379
}
380+
381+
TEST_F(TensorImplPtrTest, StridesAndDimOrderMustMatchSizes) {
382+
float data[12] = {0};
383+
ET_EXPECT_DEATH(
384+
{
385+
auto _ = make_tensor_impl_ptr(
386+
exec_aten::ScalarType::Float, {3, 4}, data, {}, {1});
387+
},
388+
"");
389+
ET_EXPECT_DEATH(
390+
{
391+
auto _ = make_tensor_impl_ptr(
392+
exec_aten::ScalarType::Float, {3, 4}, data, {0}, {4, 1});
393+
},
394+
"");
395+
}

extension/tensor/test/tensor_ptr_test.cpp

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,40 @@ TEST_F(TensorPtrTest, ScalarTensorOwningData) {
4444
EXPECT_EQ(tensor->const_data_ptr<float>()[0], 3.14f);
4545
}
4646

47+
TEST_F(TensorPtrTest, ScalarTensorSingleValueCreation) {
48+
auto tensor_float = make_tensor_ptr(3.14f);
49+
EXPECT_EQ(tensor_float->dim(), 0);
50+
EXPECT_EQ(tensor_float->numel(), 1);
51+
EXPECT_EQ(tensor_float->sizes().size(), 0);
52+
EXPECT_EQ(tensor_float->strides().size(), 0);
53+
EXPECT_EQ(tensor_float->const_data_ptr<float>()[0], 3.14f);
54+
EXPECT_EQ(tensor_float->scalar_type(), exec_aten::ScalarType::Float);
55+
56+
auto tensor_int32 = make_tensor_ptr(42);
57+
EXPECT_EQ(tensor_int32->dim(), 0);
58+
EXPECT_EQ(tensor_int32->numel(), 1);
59+
EXPECT_EQ(tensor_int32->sizes().size(), 0);
60+
EXPECT_EQ(tensor_int32->strides().size(), 0);
61+
EXPECT_EQ(tensor_int32->const_data_ptr<int32_t>()[0], 42);
62+
EXPECT_EQ(tensor_int32->scalar_type(), exec_aten::ScalarType::Int);
63+
64+
auto tensor_double = make_tensor_ptr(2.718);
65+
EXPECT_EQ(tensor_double->dim(), 0);
66+
EXPECT_EQ(tensor_double->numel(), 1);
67+
EXPECT_EQ(tensor_double->sizes().size(), 0);
68+
EXPECT_EQ(tensor_double->strides().size(), 0);
69+
EXPECT_EQ(tensor_double->const_data_ptr<double>()[0], 2.718);
70+
EXPECT_EQ(tensor_double->scalar_type(), exec_aten::ScalarType::Double);
71+
72+
auto tensor_int64 = make_tensor_ptr(static_cast<int64_t>(10000000000));
73+
EXPECT_EQ(tensor_int64->dim(), 0);
74+
EXPECT_EQ(tensor_int64->numel(), 1);
75+
EXPECT_EQ(tensor_int64->sizes().size(), 0);
76+
EXPECT_EQ(tensor_int64->strides().size(), 0);
77+
EXPECT_EQ(tensor_int64->const_data_ptr<int64_t>()[0], 10000000000);
78+
EXPECT_EQ(tensor_int64->scalar_type(), exec_aten::ScalarType::Long);
79+
}
80+
4781
TEST_F(TensorPtrTest, CreateTensorWithStridesAndDimOrder) {
4882
float data[20] = {2};
4983
auto tensor = make_tensor_ptr(
@@ -299,12 +333,7 @@ TEST_F(TensorPtrTest, TensorSharingImplModifiesSharedDataVector) {
299333
TEST_F(TensorPtrTest, TensorSharingImplResizingAffectsBothVector) {
300334
std::vector<float> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
301335

302-
auto tensor1 = make_tensor_ptr(
303-
{3, 4},
304-
std::move(data),
305-
{},
306-
{},
307-
exec_aten::TensorShapeDynamism::DYNAMIC_UNBOUND);
336+
auto tensor1 = make_tensor_ptr({3, 4}, std::move(data));
308337
auto tensor2 = make_tensor_ptr(tensor1);
309338

310339
EXPECT_EQ(resize_tensor_ptr(tensor1, {2, 6}), Error::Ok);

0 commit comments

Comments
 (0)