eight_bit_int_gemm.h revision a9fd919a0080e2c3c7ed1ce451c85a4d86f2f8c1
1// Copyright 2015 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// eight_bit_int_gemm.h: exposes the standard EightBitIntGemm interface.
16
17#ifndef GEMMLOWP_EIGHT_BIT_INT_GEMM_EIGHT_BIT_INT_GEMM_H_
18#define GEMMLOWP_EIGHT_BIT_INT_GEMM_EIGHT_BIT_INT_GEMM_H_
19
20#ifndef GEMMLOWP_USE_STLPORT
21#include <cstdint>
22#else
23#include <stdint.h>
24namespace std {
25using ::uint8_t;
26using ::int32_t;
27}
28#endif
29
30namespace gemmlowp {
31
32namespace eight_bit_int_gemm {
33
34// Concurrency / reentrancy notice
35// ===============================
36//
37// This eight_bit_int_gemm has global singleton persistent state.
38// A global lock ensures serialization of calls, so this library
39// is fully reentrant but only one calling thread gets to actually run
40// at a time, while other calling threads would wait. So it is safe
41// albeit potentially slow to call the functions exposed here on
42// multiple threads concurrently.
43//
44// Users who prefer a state-less, singleton-less interface,
45// should use the main gemmlowp interface (public/gemmlowp.h) instead.
46
47// The BitDepthSetting enum lists supported a/b bit-depth combinations.
48enum class BitDepthSetting {
49  A8B8,  // 8-bit a, 8-bit b
50  A5B7   // 5-bit a, 7-bit b
51};
52
53// The main entry point to compute a Gemm. This is the standard
54// EightBitIntGemm interface.
55void EightBitIntGemm(bool transpose_a, bool transpose_b, bool transpose_c,
56                     int m, int n, int k, const std::uint8_t *a,
57                     std::int32_t a_offset, int lda, const std::uint8_t *b,
58                     std::int32_t b_offset, int ldb, std::uint8_t *c,
59                     std::int32_t c_offset, std::int32_t c_mult_int,
60                     std::int32_t c_shift, int ldc, BitDepthSetting bit_depth);
61
62void EightBitIntGemm(bool transpose_a, bool transpose_b, bool transpose_c,
63                     int m, int n, int k, const std::uint8_t *a,
64                     std::int32_t a_offset, int lda, const std::uint8_t *b,
65                     std::int32_t b_offset, int ldb, float *c, float c_offset,
66                     int ldc, BitDepthSetting bit_depth);
67
68// Frees any persistent resources
69// (threads, thread pools, allocators, buffers, ...)
70// that gemmlowp might hold. This is called automatically
71// on thread exit, but one may also call it earlier, at any time.
72void FreePersistentResources();
73
74// Allows specifying the number of hardware threads, as a hint as to
75// how many worker threads to use for sufficiently large Gemm's.
76// We will never use more threads than that, but may use fewer,
77// for instance on Gemm's that are too small to benefit from all
78// available threads. The value 0 lets the implementation query
79// the system to determine the number of hardware threads.
80// Default value: 0.
81void SetMaxNumThreads(int n);
82
83}  // namespace eight_bit_int_gemm
84
85}  // namespace gemmlowp
86
87#endif  // GEMMLOWP_EIGHT_BIT_INT_GEMM_EIGHT_BIT_INT_GEMM_H_
88