Skip to content

Commit

Permalink
[luci-interpreter] Enable S32 type in SelectV2 op (#12960)
Browse files Browse the repository at this point in the history
This will enable S32(int32_t) type of input argument in SelectV2 operation.

ONE-DCO-1.0-Signed-off-by: Seungho Henry Park <[email protected]>
  • Loading branch information
shs-park authored May 2, 2024
1 parent 411769b commit 5eb46c0
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 26 deletions.
20 changes: 12 additions & 8 deletions compiler/luci-interpreter/src/kernels/SelectV2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,29 +50,33 @@ void SelectV2::configure()

void SelectV2::execute() const
{
switch (t()->element_type())
auto t_type = t()->element_type();
switch (t_type)
{
case DataType::FLOAT32:
evalFloat();
evaluate<float>();
break;
case DataType::S32:
evaluate<int32_t>();
break;
default:
throw std::runtime_error("luci-intp SelectV2 unsupported type.");
}
}

void SelectV2::evalFloat() const
template <typename T> void SelectV2::evaluate() const
{
const auto condition_shape = getTensorShape(condition());
const auto condition_data = getTensorData<bool>(condition());
const auto t_shape = getTensorShape(t());
const auto t_data = getTensorData<float>(t());
const auto t_data = getTensorData<T>(t());
const auto e_shape = getTensorShape(e());
const auto e_data = getTensorData<float>(e());
const auto e_data = getTensorData<T>(e());
const auto output_shape = getTensorShape(output());
auto output_data = getTensorData<float>(output());
auto output_data = getTensorData<T>(output());

tflite::reference_ops::BroadcastSelect5DSlow(condition_shape, condition_data, t_shape, t_data,
e_shape, e_data, output_shape, output_data);
tflite::reference_ops::BroadcastSelect5DSlow<bool, T>(
condition_shape, condition_data, t_shape, t_data, e_shape, e_data, output_shape, output_data);
}

} // namespace kernels
Expand Down
2 changes: 1 addition & 1 deletion compiler/luci-interpreter/src/kernels/SelectV2.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class SelectV2 : public Kernel
void execute() const override;

private:
void evalFloat() const;
template <typename T> void evaluate() const;
};

} // namespace kernels
Expand Down
104 changes: 87 additions & 17 deletions compiler/luci-interpreter/src/kernels/SelectV2.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,52 +44,77 @@ std::vector<unsigned char> c_data{
0, 0, 0, // Row 2
};

std::vector<float> t_data_single{-0.5};
std::vector<float> f32t_data_single{-0.5};

std::vector<float> t_data{
std::vector<float> f32t_data{
0.5, 0.7, 0.9, // Row 1
1, 0, -1, // Row 2
};

std::vector<float> e_data{
std::vector<float> f32e_data{
0.9, 0.7, 0.5, // Row 1
-1, 0, 1, // Row 2
};

std::vector<float> ref_output_data{
std::vector<float> ref_f32o_data{
0.5, 0.7, 0.9, // Row 1
-1, 0, 1, // Row 2
};

std::vector<float> ref_broadcast_output_data{
std::vector<float> ref_broadcast_f32o_data{
-0.5, -0.5, -0.5, // Row 1
0.9, 0.7, 0.5, // Row 1
0.9, 0.7, 0.5, // Row 2
-0.5, -0.5, -0.5, // Row 3
-1, 0, 1, // Row 4
};

std::vector<int32_t> i32t_data_single{2};

std::vector<int32_t> i32t_data{
5, -7, 9, // Row 1
1, 0, -1, // Row 2
};

std::vector<int32_t> i32e_data{
9, 7, -5, // Row 1
-1, 0, 1, // Row 2
};

std::vector<int32_t> ref_i32o_data{
5, -7, 9, // Row 1
-1, 0, 1, // Row 2
};

std::vector<int32_t> ref_broadcast_i32o_data{
2, 2, 2, // Row 1
9, 7, -5, // Row 2
2, 2, 2, // Row 3
-1, 0, 1, // Row 4
};

TEST_F(SelectV2Test, FloatSimple)
{
Tensor c_tensor = makeInputTensor<DataType::BOOL>({2, 3}, c_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, e_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, f32t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, f32e_data, _memory_manager.get());
Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);

SelectV2 kernel(&c_tensor, &t_tensor, &e_tensor, &output_tensor);
kernel.configure();
_memory_manager->allocate_memory(output_tensor);
kernel.execute();

EXPECT_THAT(extractTensorData<float>(output_tensor),
::testing::ElementsAreArray(ref_output_data));
EXPECT_THAT(extractTensorData<float>(output_tensor), ::testing::ElementsAreArray(ref_f32o_data));
EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({2, 3}));
}

TEST_F(SelectV2Test, FloatBroadcast4D)
{
Tensor c_tensor = makeInputTensor<DataType::BOOL>({1, 2, 3, 1}, c_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::FLOAT32>({1}, t_data_single, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 1, 3, 1}, e_data, _memory_manager.get());
Tensor t_tensor =
makeInputTensor<DataType::FLOAT32>({1}, f32t_data_single, _memory_manager.get());
Tensor e_tensor =
makeInputTensor<DataType::FLOAT32>({2, 1, 3, 1}, f32e_data, _memory_manager.get());
Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);

SelectV2 kernel(&c_tensor, &t_tensor, &e_tensor, &output_tensor);
Expand All @@ -98,7 +123,41 @@ TEST_F(SelectV2Test, FloatBroadcast4D)
kernel.execute();

EXPECT_THAT(extractTensorData<float>(output_tensor),
::testing::ElementsAreArray(ref_broadcast_output_data));
::testing::ElementsAreArray(ref_broadcast_f32o_data));
EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({2, 2, 3, 1}));
}

TEST_F(SelectV2Test, Int32Simple)
{
Tensor c_tensor = makeInputTensor<DataType::BOOL>({2, 3}, c_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::S32>({2, 3}, i32t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::S32>({2, 3}, i32e_data, _memory_manager.get());
Tensor output_tensor = makeOutputTensor(DataType::S32);

SelectV2 kernel(&c_tensor, &t_tensor, &e_tensor, &output_tensor);
kernel.configure();
_memory_manager->allocate_memory(output_tensor);
kernel.execute();

EXPECT_THAT(extractTensorData<int32_t>(output_tensor),
::testing::ElementsAreArray(ref_i32o_data));
EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({2, 3}));
}

TEST_F(SelectV2Test, Int32Broadcast4D)
{
Tensor c_tensor = makeInputTensor<DataType::BOOL>({1, 2, 3, 1}, c_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::S32>({1}, i32t_data_single, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::S32>({2, 1, 3, 1}, i32e_data, _memory_manager.get());
Tensor output_tensor = makeOutputTensor(DataType::S32);

SelectV2 kernel(&c_tensor, &t_tensor, &e_tensor, &output_tensor);
kernel.configure();
_memory_manager->allocate_memory(output_tensor);
kernel.execute();

EXPECT_THAT(extractTensorData<int32_t>(output_tensor),
::testing::ElementsAreArray(ref_broadcast_i32o_data));
EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({2, 2, 3, 1}));
}

Expand All @@ -110,8 +169,8 @@ TEST_F(SelectV2Test, Invalid_C_Type_NEG)
};

Tensor c_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, i_c_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, e_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, f32t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, f32e_data, _memory_manager.get());
Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);

SelectV2 kernel(&c_tensor, &t_tensor, &e_tensor, &output_tensor);
Expand All @@ -121,14 +180,25 @@ TEST_F(SelectV2Test, Invalid_C_Type_NEG)
TEST_F(SelectV2Test, Invalid_O_Type_NEG)
{
Tensor c_tensor = makeInputTensor<DataType::BOOL>({2, 3}, c_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, e_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, f32t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, f32e_data, _memory_manager.get());
Tensor output_tensor = makeOutputTensor(DataType::BOOL);

SelectV2 kernel(&c_tensor, &t_tensor, &e_tensor, &output_tensor);
EXPECT_ANY_THROW(kernel.configure());
}

TEST_F(SelectV2Test, MixedType_NEG)
{
Tensor c_tensor = makeInputTensor<DataType::BOOL>({2, 3}, c_data, _memory_manager.get());
Tensor t_tensor = makeInputTensor<DataType::S32>({2, 3}, i32t_data, _memory_manager.get());
Tensor e_tensor = makeInputTensor<DataType::FLOAT32>({2, 3}, f32e_data, _memory_manager.get());
Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);

SelectV2 kernel(&c_tensor, &t_tensor, &e_tensor, &output_tensor);
EXPECT_ANY_THROW(kernel.configure());
}

} // namespace
} // namespace kernels
} // namespace luci_interpreter

0 comments on commit 5eb46c0

Please sign in to comment.