diff --git a/projects/hipdnn/sdk/include/hipdnn_sdk/utilities/Tensor.hpp b/projects/hipdnn/sdk/include/hipdnn_sdk/utilities/Tensor.hpp index 8cb6310f41e..74b5f9b7421 100644 --- a/projects/hipdnn/sdk/include/hipdnn_sdk/utilities/Tensor.hpp +++ b/projects/hipdnn/sdk/include/hipdnn_sdk/utilities/Tensor.hpp @@ -465,9 +465,17 @@ class Tensor : public TensorBase void fillWithValue(T value) override { _memory.markHostModified(); - iterateAlongDimensions(_dims, [&](const std::vector& indices) { - this->setHostValue(value, indices); - }); + if(isPacked()) + { + auto data{_memory.hostData()}; + std::fill(data, data + _elementCount, value); + } + else + { + iterateAlongDimensions(_dims, [&](const std::vector& indices) { + this->setHostValue(value, indices); + }); + } } void fillWithRandomValues(T min, T max, unsigned int seed = std::random_device{}()) override @@ -478,9 +486,21 @@ class Tensor : public TensorBase static_cast(max)); _memory.markHostModified(); - iterateAlongDimensions(_dims, [&](const std::vector& indices) { - this->setHostValue(static_cast(distribution(generator)), indices); - }); + + if(isPacked()) + { + auto data{_memory.hostData()}; + for(size_t i{0}; i < _elementCount; i++) + { + data[i] = static_cast(distribution(generator)); + } + } + else + { + iterateAlongDimensions(_dims, [&](const std::vector& indices) { + this->setHostValue(static_cast(distribution(generator)), indices); + }); + } } bool isPacked() const override diff --git a/projects/hipdnn/sdk/tests/utilities/TestTensor.cpp b/projects/hipdnn/sdk/tests/utilities/TestTensor.cpp index 673ff62b913..822c8e4a498 100644 --- a/projects/hipdnn/sdk/tests/utilities/TestTensor.cpp +++ b/projects/hipdnn/sdk/tests/utilities/TestTensor.cpp @@ -39,7 +39,7 @@ TEST(TestTensor, BasicRowMajorUsage) EXPECT_EQ(tensor.strides()[3], 1); } -TEST(TestTensor, FillWithValues) +TEST(TestTensor, FillWithValuesPacked) { Tensor tensor({1, 2, 3, 4}); @@ -52,7 +52,19 @@ TEST(TestTensor, FillWithValues) } } -TEST(TestTensor, FillWithRandomValues) +TEST(TestTensor, FillWithValuesNonPacked) +{ + Tensor tensor({1, 2, 3, 4}, {30, 15, 5, 1}); + + tensor.fillWithValue(1.0f); + + for(auto it{tensor.cbegin()}; it != tensor.cend(); ++it) + { + EXPECT_FLOAT_EQ(1.0f, (*reinterpret_cast((*it)))); + } +} + +TEST(TestTensor, FillWithRandomValuesPacked) { Tensor tensor({1, 2, 3, 4}); @@ -66,6 +78,20 @@ TEST(TestTensor, FillWithRandomValues) } } +TEST(TestTensor, FillWithRandomValuesNonPacked) +{ + Tensor tensor({1, 2, 3, 4}, {30, 15, 5, 1}); + + tensor.fillWithRandomValues(1.0f, 3.0f); + + for(auto it{tensor.cbegin()}; it != tensor.cend(); ++it) + { + auto val{(*reinterpret_cast((*it)))}; + EXPECT_GE(val, 1.0f); + EXPECT_LE(val, 3.0f); + } +} + TEST(TestTensor, BasicNhwcUsage) { Tensor tensor({1, 2, 3, 4}, TensorLayout::NHWC);