blob: c4248e8d92fc2b0ea1a274b6e546777be7205a52 [file] [log] [blame]
Benoit Jacoba0ba3ac2019-04-08 12:00:37 -04001#include <iostream>
2
3#include "ruy.h"
4
Benoit Jacobf5b81082019-04-11 15:59:22 -04005void ExampleMulFloat(ruy::Context *context) {
6 const float lhs_data[] = {1, 2, 3, 4};
7 const float rhs_data[] = {1, 2, 3, 4};
8 float dst_data[4];
9
10 ruy::Matrix<float> lhs;
11 ruy::MakeSimpleLayout(2, 2, ruy::Order::kRowMajor, &lhs.layout);
12 lhs.data = lhs_data;
13 ruy::Matrix<float> rhs;
14 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &rhs.layout);
15 rhs.data = rhs_data;
16 ruy::Matrix<float> dst;
17 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &dst.layout);
18 dst.data = dst_data;
19
20 ruy::BasicSpec<float, float> spec;
21 ruy::Mul<ruy::kAllPaths>(lhs, rhs, spec, context, &dst);
22
23 std::cout << "Example Mul, float:\n";
24 std::cout << "LHS:\n" << lhs;
25 std::cout << "RHS:\n" << rhs;
26 std::cout << "Result:\n" << dst << "\n";
27}
28
29void ExampleMulFloatWithBiasAddAndClamp(ruy::Context *context) {
30 const float lhs_data[] = {1, 2, 3, 4};
31 const float rhs_data[] = {1, 2, 3, 4};
32 const float bias_data[] = {1, 0};
33 float dst_data[4];
34
35 ruy::Matrix<float> lhs;
36 ruy::MakeSimpleLayout(2, 2, ruy::Order::kRowMajor, &lhs.layout);
37 lhs.data = lhs_data;
38 ruy::Matrix<float> rhs;
39 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &rhs.layout);
40 rhs.data = rhs_data;
41 ruy::Matrix<float> dst;
42 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &dst.layout);
43 dst.data = dst_data;
44
45 ruy::BasicSpec<float, float> spec;
46 spec.bias = bias_data;
47 spec.clamp_min = 0;
48 spec.clamp_max = 15;
49 ruy::Mul<ruy::kAllPaths>(lhs, rhs, spec, context, &dst);
50
51 std::cout << "Example Mul, float with bias addition and clamp:\n";
52 std::cout << "LHS:\n" << lhs;
53 std::cout << "RHS:\n" << rhs;
54 std::cout << "Result:\n" << dst << "\n";
55}
56
57void ExampleMulUint8Quantized(ruy::Context *context) {
58 const std::uint8_t lhs_data[] = {1, 2, 3, 4};
59 const std::uint8_t rhs_data[] = {1, 2, 3, 4};
60 std::uint8_t dst_data[4];
61
62 ruy::Matrix<std::uint8_t> lhs;
63 ruy::MakeSimpleLayout(2, 2, ruy::Order::kRowMajor, &lhs.layout);
64 lhs.data = lhs_data;
65 ruy::Matrix<std::uint8_t> rhs;
66 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &rhs.layout);
67 rhs.data = rhs_data;
68 ruy::Matrix<std::uint8_t> dst;
69 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &dst.layout);
70 dst.data = dst_data;
71
72 ruy::BasicSpec<std::int32_t, std::uint8_t> spec;
73 spec.multiplier_fixedpoint = 1 << 30;
74 spec.multiplier_exponent = 0;
75 ruy::Mul<ruy::kAllPaths>(lhs, rhs, spec, context, &dst);
76
77 std::cout << "Example Mul, uint8 quantized:\n";
78 std::cout << "LHS:\n" << lhs;
79 std::cout << "RHS:\n" << rhs;
80 std::cout << "Result:\n" << dst << "\n";
81}
82
83void ExampleMulUint8QuantizedWithZeroPoints(ruy::Context *context) {
84 const std::uint8_t lhs_data[] = {1, 2, 3, 4};
85 const std::uint8_t rhs_data[] = {1, 2, 3, 4};
86 std::uint8_t dst_data[4];
87
88 ruy::Matrix<std::uint8_t> lhs;
89 ruy::MakeSimpleLayout(2, 2, ruy::Order::kRowMajor, &lhs.layout);
90 lhs.data = lhs_data;
91 lhs.zero_point = 2;
92 ruy::Matrix<std::uint8_t> rhs;
93 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &rhs.layout);
94 rhs.data = rhs_data;
95 rhs.zero_point = 3;
96 ruy::Matrix<std::uint8_t> dst;
97 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &dst.layout);
98 dst.data = dst_data;
99 dst.zero_point = 1;
100
101 ruy::BasicSpec<std::int32_t, std::uint8_t> spec;
102 spec.multiplier_fixedpoint = 1 << 30;
103 spec.multiplier_exponent = 0;
104 ruy::Mul<ruy::kAllPaths>(lhs, rhs, spec, context, &dst);
105
106 std::cout << "Example Mul, uint8 quantized with zero_point's:\n";
107 std::cout << "LHS:\n" << lhs;
108 std::cout << "RHS:\n" << rhs;
109 std::cout << "Result:\n" << dst << "\n";
110}
111
112void ExampleMulInt8PerChannelQuantized(ruy::Context *context) {
113 const std::int8_t lhs_data[] = {1, 2, 3, 4};
114 const std::int8_t rhs_data[] = {1, 2, 3, 4};
115 const std::int32_t multiplier_data[] = {3 << 28, 5 << 28};
116 const int exponent_data[] = {1, -2};
117 std::int8_t dst_data[4];
118
119 ruy::Matrix<std::int8_t> lhs;
120 ruy::MakeSimpleLayout(2, 2, ruy::Order::kRowMajor, &lhs.layout);
121 lhs.data = lhs_data;
122 ruy::Matrix<std::int8_t> rhs;
123 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &rhs.layout);
124 rhs.data = rhs_data;
125 ruy::Matrix<std::int8_t> dst;
126 ruy::MakeSimpleLayout(2, 2, ruy::Order::kColMajor, &dst.layout);
127 dst.data = dst_data;
128
129 ruy::BasicSpec<std::int32_t, std::uint8_t> spec;
130 spec.multiplier_fixedpoint_perchannel = multiplier_data;
131 spec.multiplier_exponent_perchannel = exponent_data;
132 ruy::Mul<ruy::kAllPaths>(lhs, rhs, spec, context, &dst);
133
134 std::cout << "Example Mul, int8 quantized with per-channel multipliers\n";
135 std::cout << "LHS:\n" << lhs;
136 std::cout << "RHS:\n" << rhs;
137 std::cout << "Result:\n" << dst << "\n";
138}
139
Benoit Jacoba0ba3ac2019-04-08 12:00:37 -0400140int main() {
141 ruy::Context context;
Benoit Jacobf5b81082019-04-11 15:59:22 -0400142 ExampleMulFloat(&context);
143 ExampleMulFloatWithBiasAddAndClamp(&context);
144 ExampleMulUint8Quantized(&context);
145 ExampleMulUint8QuantizedWithZeroPoints(&context);
146 ExampleMulInt8PerChannelQuantized(&context);
Benoit Jacoba0ba3ac2019-04-08 12:00:37 -0400147}