diff options
Diffstat (limited to 'reference_model')
-rw-r--r-- | reference_model/src/generate/generate_dot_product.cc | 44 | ||||
-rw-r--r-- | reference_model/src/generate/generate_utils.cc | 4 | ||||
-rw-r--r-- | reference_model/test/generate_tests.cpp | 71 |
3 files changed, 119 insertions, 0 deletions
diff --git a/reference_model/src/generate/generate_dot_product.cc b/reference_model/src/generate/generate_dot_product.cc index e6815ad..c1934dd 100644 --- a/reference_model/src/generate/generate_dot_product.cc +++ b/reference_model/src/generate/generate_dot_product.cc @@ -189,6 +189,48 @@ bool generateConv2D(const TosaReference::GenerateConfig& cfg, return false; } } +//---------------------------------------------------------------------------// +// Reduce Sum // +//---------------------------------------------------------------------------// + +bool generateReduceSum(const TosaReference::GenerateConfig& cfg, + TosaReference::IDotProductGenerator& generator, + void* data, + size_t size) +{ + if (cfg.dataType != DType::DType_FP32) + { + WARNING("[Generator][DP][ReduceSum] Only supports FP32."); + return false; + } + if (cfg.inputPos != 0) + { + WARNING("[Generator][DP][ReduceSum] Invalid input tensor slot position to operator."); + return false; + } + if (cfg.dotProductInfo.axis < 0 || static_cast<size_t>(cfg.dotProductInfo.axis) >= cfg.shape.size()) + { + WARNING("[Generator][DP][ReduceSum] Invalid axis %d.", cfg.dotProductInfo.axis); + return false; + } + + float* input = reinterpret_cast<float*>(data); + const int64_t T = TosaReference::numElementsFromShape(cfg.shape); + const uint32_t axis = cfg.dotProductInfo.axis; + + for (int64_t t = 0; t < T; ++t) + { + uint64_t k = t; + for (uint32_t d = cfg.shape.size() - 1; d > axis; --d) + { + k = k / cfg.shape[d]; + } + k = k % cfg.shape[axis]; + + input[t] = generator(static_cast<int32_t>(k)); + } + return true; +} } // namespace namespace TosaReference @@ -210,6 +252,8 @@ bool generateDotProduct(const GenerateConfig& cfg, void* data, size_t size) return generateMatMul(cfg, *generator, data, size); case tosa::Op_CONV2D: return generateConv2D(cfg, *generator, data, size); + case tosa::Op_REDUCE_SUM: + return generateReduceSum(cfg, *generator, data, size); default: WARNING("[Generator][DP] Unsupported operator."); return false; diff --git a/reference_model/src/generate/generate_utils.cc b/reference_model/src/generate/generate_utils.cc index 8ae889a..e410436 100644 --- a/reference_model/src/generate/generate_utils.cc +++ b/reference_model/src/generate/generate_utils.cc @@ -39,6 +39,7 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Op, { { Op::Op_UNKNOWN, "UNKNOWN" }, { Op::Op_ADD, "ADD" }, + { Op::Op_ARGMAX, "ARGMAX" }, { Op::Op_CONV2D, "CONV2D" }, { Op::Op_MATMUL, "MATMUL" }, { Op::Op_MAXIMUM, "MAXIMUM" }, @@ -46,6 +47,9 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Op, { Op::Op_MINIMUM, "MINIMUM" }, { Op::Op_MUL, "MUL" }, { Op::Op_PAD, "PAD" }, + { Op::Op_REDUCE_MAX, "REDUCE_MAX" }, + { Op::Op_REDUCE_MIN, "REDUCE_MIN" }, + { Op::Op_REDUCE_SUM, "REDUCE_SUM" }, { Op::Op_SUB, "SUB" }, }) diff --git a/reference_model/test/generate_tests.cpp b/reference_model/test/generate_tests.cpp index 6173372..40dd59f 100644 --- a/reference_model/test/generate_tests.cpp +++ b/reference_model/test/generate_tests.cpp @@ -509,4 +509,75 @@ TEST_CASE("positive - pseudo random") check_not_output<float>(bufferP0, bufferP1); } } +void reduce_sum_test_FP32(const std::string tosaName, + const size_t tosaElements, + const std::string templateJsonCfg, + const std::string setStr, + const std::vector<uint32_t> expected) +{ + std::string jsonCfg = templateJsonCfg; + update_json_template(jsonCfg, "_SET_", setStr); + + std::vector<float> buffer(tosaElements); + REQUIRE(tgd_generate_data(jsonCfg.c_str(), tosaName.c_str(), (void*)buffer.data(), tosaElements * 4)); + // Choose different generator values to test at positions 6, 7 & 8 + std::vector<float> mid_three(buffer.begin() + 6, buffer.begin() + 9); + check_output<float>(mid_three, expected); +} + +TEST_CASE("positive - FP32 reduce_sum dot product (values 6,7 & 8)") +{ + std::string templateJsonCfg = R"({ + "tensors" : { + "input" : { + "generator": "DOT_PRODUCT", + "data_type": "FP32", + "input_type": "VARIABLE", + "shape" : [ 5, 3, 7 ], + "input_pos": 0, + "op" : "REDUCE_SUM", + "dot_product_info": { + "s": _SET_, + "ks": 3, + "acc_type": "FP32", + "axis": 1 + } + } + } + })"; + + const std::string tosaName = "input"; + const size_t tosaElements = 5 * 3 * 7; + + SUBCASE("reduce_sum, set 0, param 0") + { + std::vector<uint32_t> expected = { 0x3df2e612, 0x3f59255f, 0x0 }; + reduce_sum_test_FP32(tosaName, tosaElements, templateJsonCfg, "0", expected); + } + SUBCASE("reduce_sum, set 1, param 0") + { + std::vector<uint32_t> expected = { 0x5edaa175, 0x5edb84c1, 0x5ea3c765 }; + reduce_sum_test_FP32(tosaName, tosaElements, templateJsonCfg, "1", expected); + } + SUBCASE("reduce_sum, set 2, param 0") + { + std::vector<uint32_t> expected = { 0x3f800000, 0x3e73f143, 0x3f12cef8 }; + reduce_sum_test_FP32(tosaName, tosaElements, templateJsonCfg, "2", expected); + } + SUBCASE("reduce_sum, set 3, param 0") + { + std::vector<uint32_t> expected = { 0x41800000, 0xbe9f659e, 0xbfaca78c }; + reduce_sum_test_FP32(tosaName, tosaElements, templateJsonCfg, "3", expected); + } + SUBCASE("reduce_sum, set 4, param 0") + { + std::vector<uint32_t> expected = { 0x5e1e6f12, 0x3f000000, 0x3f000000 }; + reduce_sum_test_FP32(tosaName, tosaElements, templateJsonCfg, "4", expected); + } + SUBCASE("reduce_sum, set 5, param 0") + { + std::vector<uint32_t> expected = { 0x5d2790c5, 0xdec3dadc, 0xdea1486e }; + reduce_sum_test_FP32(tosaName, tosaElements, templateJsonCfg, "5", expected); + } +} TEST_SUITE_END(); // generate |