"src/vscode:/vscode.git/clone" did not exist on "7bbacda0abe3df2c2e225aa89dea4a410698be03"
convert.cpp 1.3 KB
Newer Older
Shucai Xiao's avatar
Shucai Xiao committed
1
2
#include <migraphx/gpu/device/convert.hpp>
#include <migraphx/gpu/device/nary.hpp>
3
4
5

namespace migraphx {
inline namespace MIGRAPHX_INLINE_NS {
Shucai Xiao's avatar
Shucai Xiao committed
6
7
8
9
10
11
12
13
14
namespace gpu {
namespace device {

void convert(hipStream_t stream,
             const argument& result,
             const argument& arg,
             float scale,
             float shift,
             shape::type_t target_type)
15
{
Shucai Xiao's avatar
Shucai Xiao committed
16
17
18
19
    result.visit([&](auto output) {
        arg.visit([&](auto input) {
            const auto* input_ptr = device_cast(input.data());
            auto* output_ptr      = device_cast(output.data());
20
21
            if(target_type == shape::int8_type)
            {
Shucai Xiao's avatar
Shucai Xiao committed
22
                gs_launch(stream, result.get_shape().elements())([=](auto i) {
Shucai Xiao's avatar
Shucai Xiao committed
23
24
25
                    float res  = input_ptr[i] * scale + shift;
                    int factor = (res > 0) ? 1 : -1;
                    output_ptr[i] =
26
                        static_cast<int8_t>(std::min<float>(std::max<float>(-128.0f, res + factor * 0.5), 127.0f));
Shucai Xiao's avatar
Shucai Xiao committed
27
                });
28
            }
Shucai Xiao's avatar
Shucai Xiao committed
29
30
31
32
33
34
35
36
            else
            {
                gs_launch(stream, result.get_shape().elements())(
                    [=](auto i) { output_ptr[i] = input_ptr[i] * scale + shift; });
            }
        });
    });
}
37

Shucai Xiao's avatar
Shucai Xiao committed
38
39
} // namespace device
} // namespace gpu
40
41
} // namespace MIGRAPHX_INLINE_NS
} // namespace migraphx