diff --git a/src/targets/gpu/compile_gen.cpp b/src/targets/gpu/compile_gen.cpp index 4f78a93a17e..da84027d828 100644 --- a/src/targets/gpu/compile_gen.cpp +++ b/src/targets/gpu/compile_gen.cpp @@ -61,12 +61,19 @@ vectorize vectorize::elements(std::size_t axis, const std::vector& inputs [&](const auto& input) -> std::size_t { auto stride = input.strides()[axis]; auto len = input.lens()[axis]; - if(stride != 0 and stride != 1) + if(not contains({0, 1}, stride)) return 1; if(len == 1 and input.elements() > sizes.front()) return sizes.front(); - auto it = std::find_if( - sizes.begin(), sizes.end(), [&](auto i) { return (len % i) == 0; }); + auto it = std::find_if(sizes.begin(), sizes.end(), [&](auto vsize) { + // The len is divisible by the size and all the strides are divisible by + // the size + return (len % vsize) == 0 and + std::all_of( + input.strides().begin(), input.strides().end(), [&](auto i) { + return contains({0, 1}, i) or i % vsize == 0; + }); + }); if(it != sizes.end()) return *it; return 1; diff --git a/src/targets/gpu/kernels/include/migraphx/kernels/ops.hpp b/src/targets/gpu/kernels/include/migraphx/kernels/ops.hpp index eac9fc5103d..495eff79916 100644 --- a/src/targets/gpu/kernels/include/migraphx/kernels/ops.hpp +++ b/src/targets/gpu/kernels/include/migraphx/kernels/ops.hpp @@ -90,7 +90,7 @@ struct lowest template constexpr operator T() const { - return numeric_lowest(); + return numeric_lowest>(); } }; @@ -99,7 +99,7 @@ struct highest template constexpr operator T() const { - return numeric_max(); + return numeric_max>(); } }; } // namespace migraphx diff --git a/src/targets/gpu/kernels/include/migraphx/kernels/type_traits.hpp b/src/targets/gpu/kernels/include/migraphx/kernels/type_traits.hpp index 15c07203fa9..1e1d86e5fef 100644 --- a/src/targets/gpu/kernels/include/migraphx/kernels/type_traits.hpp +++ b/src/targets/gpu/kernels/include/migraphx/kernels/type_traits.hpp @@ -192,9 +192,13 @@ struct common_type template using common_type_t = typename common_type::type; +#define MIGRAPHX_REQUIRES(...) class = enable_if_t<__VA_ARGS__> + constexpr unsigned long int_max(unsigned long n) { return (1u << (n * 8)) - 1; } -template +template {} or is_floating_point{} or + is_same{})> constexpr T numeric_max() { if constexpr(is_integral{}) @@ -230,8 +234,6 @@ constexpr T numeric_lowest() } } -#define MIGRAPHX_REQUIRES(...) class = enable_if_t<__VA_ARGS__> - } // namespace migraphx #endif diff --git a/test/verify/test_slice2.cpp b/test/verify/test_slice2.cpp new file mode 100644 index 00000000000..8855a1d26b4 --- /dev/null +++ b/test/verify/test_slice2.cpp @@ -0,0 +1,47 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "verify_program.hpp" +#include +#include +#include + +struct test_slice2 : verify_program +{ + migraphx::program create_program() const + { + migraphx::program p; + auto* mm = p.get_main_module(); + migraphx::shape s{migraphx::shape::float_type, {1, 44, 57, 57}}; + auto x = mm->add_parameter("x", {migraphx::shape::float_type, {1, 44, 57, 57}}); + auto y = mm->add_parameter("y", {migraphx::shape::float_type, {1, 44, 56, 56}}); + auto slice0 = mm->add_instruction( + migraphx::make_op( + "slice", + {{"axes", {0, 2, 3, 1}}, {"starts", {0, 1, 1, 0}}, {"ends", {1, 57, 57, 44}}}), + x); + mm->add_instruction(migraphx::make_op("add"), y, slice0); + return p; + } +}; diff --git a/test/verify/test_softmax_large1.cpp b/test/verify/test_softmax_large1.cpp new file mode 100644 index 00000000000..e8d98194da8 --- /dev/null +++ b/test/verify/test_softmax_large1.cpp @@ -0,0 +1,43 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "verify_program.hpp" +#include +#include +#include +#include + +struct test_softmax_large1 : verify_program +{ + migraphx::program create_program() const + { + migraphx::program p; + auto* mm = p.get_main_module(); + auto x = mm->add_parameter("x", migraphx::shape{migraphx::shape::float_type, {2, 4}}); + auto large = mm->add_literal({migraphx::shape{migraphx::shape::float_type}, {10000}}); + auto add = migraphx::add_common_op(*mm, migraphx::make_op("add"), {x, large}); + mm->add_instruction(migraphx::make_op("softmax", {{"axis", -1}}), add); + return p; + } +}; diff --git a/test/verify/test_softmax_large2.cpp b/test/verify/test_softmax_large2.cpp new file mode 100644 index 00000000000..c4311f6f819 --- /dev/null +++ b/test/verify/test_softmax_large2.cpp @@ -0,0 +1,43 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015-2022 Advanced Micro Devices, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "verify_program.hpp" +#include +#include +#include +#include + +struct test_softmax_large2 : verify_program +{ + migraphx::program create_program() const + { + migraphx::program p; + auto* mm = p.get_main_module(); + auto x = mm->add_parameter("x", migraphx::shape{migraphx::shape::float_type, {2, 4}}); + auto large = mm->add_literal({migraphx::shape{migraphx::shape::float_type}, {-10000}}); + auto add = migraphx::add_common_op(*mm, migraphx::make_op("add"), {x, large}); + mm->add_instruction(migraphx::make_op("softmax", {{"axis", -1}}), add); + return p; + } +};