Home | History | Annotate | Download | only in eight_bit_int_gemm
      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>
     24 namespace std {
     25 using ::uint8_t;
     26 using ::int32_t;
     27 }
     28 #endif
     29 
     30 namespace gemmlowp {
     31 
     32 namespace 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.
     48 enum 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.
     55 void 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 
     62 void 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.
     72 void 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.
     81 void 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