forked from pytorch/FBGEMM
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit e85b5a1
Showing
69 changed files
with
17,863 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,171 @@ | ||
cmake_minimum_required(VERSION 3.7 FATAL_ERROR) | ||
|
||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") | ||
|
||
#install libraries into correct locations on all platforms | ||
include(GNUInstallDirs) | ||
|
||
project(fbgemm VERSION 0.1 LANGUAGES CXX C) | ||
|
||
set(FBGEMM_LIBRARY_TYPE "default" CACHE STRING | ||
"Type of library (shared, static, or default) to build") | ||
set_property(CACHE FBGEMM_LIBRARY_TYPE PROPERTY STRINGS default static shared) | ||
option(FBGEMM_BUILD_TESTS "Build fbgemm unit tests" ON) | ||
option(FBGEMM_BUILD_BENCHMARKS "Build fbgemm benchmarks" ON) | ||
|
||
if(FBGEMM_BUILD_TESTS) | ||
enable_testing() | ||
endif() | ||
|
||
set(FBGEMM_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) | ||
set(FBGEMM_THIRDPARTY_DIR ${FBGEMM_SOURCE_DIR}/third-party) | ||
set(FBGEMM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) | ||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) | ||
|
||
#All the source files that either use avx2 instructions statically or JIT | ||
#avx2/avx512 instructions. | ||
set(FBGEMM_AVX2_SRCS src/ExecuteKernel.cc | ||
src/ExecuteKernelU8S8.cc | ||
src/Fbgemm.cc | ||
src/FbgemmFP16.cc | ||
src/FbgemmFP16UKernels.cc | ||
src/FbgemmI8Depthwise.cc | ||
src/FbgemmI8Spmdm.cc | ||
src/GenerateKernelU8S8S32ACC16.cc | ||
src/GenerateKernelU8S8S32ACC16_avx512.cc | ||
src/GenerateKernelU8S8S32ACC32.cc | ||
src/GenerateKernelU8S8S32ACC32_avx512.cc | ||
src/PackAMatrix.cc | ||
src/PackAWithIm2Col.cc | ||
src/PackBMatrix.cc | ||
src/PackMatrix.cc | ||
src/PackWithQuantRowOffset.cc | ||
src/PackWithRowOffset.cc | ||
src/RefImplementations.cc | ||
src/Utils.cc) | ||
|
||
#check if compiler supports avx512 | ||
include(CheckCXXCompilerFlag) | ||
CHECK_CXX_COMPILER_FLAG(-mavx512f COMPILER_SUPPORTS_AVX512) | ||
if(NOT COMPILER_SUPPORTS_AVX512) | ||
message(FATAL_ERROR "A compiler with AVX512 support is required.") | ||
endif() | ||
|
||
#All the source files that use avx512 instructions statically | ||
set(FBGEMM_AVX512_SRCS src/Utils_avx512.cc) | ||
|
||
set(FBGEMM_PUBLIC_HEADERS include/fbgemm/Fbgemm.h | ||
include/fbgemm/OutputProcessing-inl.h | ||
include/fbgemm/PackingTraits-inl.h | ||
include/fbgemm/Utils.h | ||
include/fbgemm/ConvUtils.h | ||
include/fbgemm/Types.h | ||
include/fbgemm/FbgemmI8Spmdm.h) | ||
|
||
|
||
add_library(fbgemm_avx2 OBJECT ${FBGEMM_AVX2_SRCS}) | ||
add_library(fbgemm_avx512 OBJECT ${FBGEMM_AVX512_SRCS}) | ||
|
||
set_target_properties(fbgemm_avx2 fbgemm_avx512 PROPERTIES | ||
CXX_STANDARD 11 | ||
CXX_EXTENSIONS NO) | ||
|
||
target_compile_options(fbgemm_avx2 PRIVATE | ||
"-m64" "-mavx2" "-mfma" "-masm=intel") | ||
target_compile_options(fbgemm_avx512 PRIVATE | ||
"-m64" "-mavx2" "-mfma" "-mavx512f" "-masm=intel") | ||
|
||
if(NOT TARGET asmjit) | ||
#Download asmjit from github if ASMJIT_SRC_DIR is not specified. | ||
if(NOT DEFINED ASMJIT_SRC_DIR) | ||
message(STATUS "Downloading asmjit to ${FBGEMM_THIRDPARTY_DIR}/asmjit | ||
(define ASMJIT_SRC_DIR to avoid it)") | ||
configure_file("${FBGEMM_SOURCE_DIR}/cmake/modules/DownloadASMJIT.cmake" | ||
"${FBGEMM_BINARY_DIR}/asmjit-download/CMakeLists.txt") | ||
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . | ||
WORKING_DIRECTORY "${FBGEMM_BINARY_DIR}/asmjit-download") | ||
execute_process(COMMAND "${CMAKE_COMMAND}" --build . | ||
WORKING_DIRECTORY "${FBGEMM_BINARY_DIR}/asmjit-download") | ||
set(ASMJIT_SRC_DIR "${FBGEMM_THIRDPARTY_DIR}/asmjit" CACHE STRING | ||
"asmjit source directory") | ||
endif() | ||
|
||
#build asmjit | ||
set(ASMJIT_STATIC ON) | ||
add_subdirectory("${ASMJIT_SRC_DIR}" "${FBGEMM_BINARY_DIR}/asmjit") | ||
endif() | ||
|
||
if(NOT TARGET cpuinfo) | ||
#Download cpuinfo from github if CPUINFO_SRC_DIR is not specified. | ||
if(NOT DEFINED CPUINFO_SRC_DIR) | ||
message(STATUS "Downloading cpuinfo to ${FBGEMM_THIRDPARTY_DIR}/cpuinfo | ||
(define CPUINFO_SRC_DIR to avoid it)") | ||
configure_file("${FBGEMM_SOURCE_DIR}/cmake/modules/DownloadCPUINFO.cmake" | ||
"${FBGEMM_BINARY_DIR}/cpuinfo-download/CMakeLists.txt") | ||
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" . | ||
WORKING_DIRECTORY "${FBGEMM_BINARY_DIR}/cpuinfo-download") | ||
execute_process(COMMAND "${CMAKE_COMMAND}" --build . | ||
WORKING_DIRECTORY "${FBGEMM_BINARY_DIR}/cpuinfo-download") | ||
set(CPUINFO_SRC_DIR "${FBGEMM_THIRDPARTY_DIR}/cpuinfo" CACHE STRING | ||
"cpuinfo source directory") | ||
endif() | ||
|
||
#build cpuinfo | ||
set(CPUINFO_BUILD_UNIT_TESTS OFF CACHE BOOL "Do not build cpuinfo unit tests") | ||
set(CPUINFO_BUILD_MOCK_TESTS OFF CACHE BOOL "Do not build cpuinfo mock tests") | ||
set(CPUINFO_BUILD_BENCHMARKS OFF CACHE BOOL "Do not build cpuinfo benchmarks") | ||
set(CPUINFO_LIBRARY_TYPE static) | ||
add_subdirectory("${CPUINFO_SRC_DIR}" "${FBGEMM_BINARY_DIR}/cpuinfo") | ||
set_property(TARGET cpuinfo PROPERTY POSITION_INDEPENDENT_CODE ON) | ||
endif() | ||
|
||
target_include_directories(fbgemm_avx2 BEFORE | ||
PUBLIC $<BUILD_INTERFACE:${FBGEMM_SOURCE_DIR}> | ||
PUBLIC $<BUILD_INTERFACE:${FBGEMM_SOURCE_DIR}/include> | ||
PRIVATE "${ASMJIT_SRC_DIR}/src" | ||
PRIVATE "${CPUINFO_SRC_DIR}/include") | ||
|
||
target_include_directories(fbgemm_avx512 BEFORE | ||
PUBLIC $<BUILD_INTERFACE:${FBGEMM_SOURCE_DIR}> | ||
PUBLIC $<BUILD_INTERFACE:${FBGEMM_SOURCE_DIR}/include> | ||
PRIVATE "${ASMJIT_SRC_DIR}/src" | ||
PRIVATE "${CPUINFO_SRC_DIR}/include") | ||
|
||
if(FBGEMM_LIBRARY_TYPE STREQUAL "default") | ||
add_library(fbgemm $<TARGET_OBJECTS:fbgemm_avx2> | ||
$<TARGET_OBJECTS:fbgemm_avx512>) | ||
elseif(FBGEMM_LIBRARY_TYPE STREQUAL "shared") | ||
add_library(fbgemm SHARED $<TARGET_OBJECTS:fbgemm_avx2> | ||
$<TARGET_OBJECTS:fbgemm_avx512>) | ||
elseif(FBGEMM_LIBRARY_TYPE STREQUAL "static") | ||
add_library(fbgemm STATIC $<TARGET_OBJECTS:fbgemm_avx2> | ||
$<TARGET_OBJECTS:fbgemm_avx512>) | ||
else() | ||
message(FATAL_ERROR "Unsupported library type ${FBGEMM_LIBRARY_TYPE}") | ||
endif() | ||
|
||
target_include_directories(fbgemm BEFORE | ||
PUBLIC $<BUILD_INTERFACE:${FBGEMM_SOURCE_DIR}> | ||
PUBLIC $<BUILD_INTERFACE:${FBGEMM_SOURCE_DIR}/include>) | ||
|
||
target_link_libraries(fbgemm asmjit cpuinfo) | ||
add_dependencies(fbgemm asmjit cpuinfo) | ||
|
||
install(TARGETS fbgemm EXPORT fbgemmLibraryConfig | ||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) #For windows | ||
|
||
install(FILES ${FBGEMM_PUBLIC_HEADERS} | ||
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/fbgemm") | ||
|
||
#Make project importable from the build directory | ||
#export(TARGETS fbgemm asmjit FILE fbgemmLibraryConfig.cmake) | ||
|
||
if(FBGEMM_BUILD_TESTS) | ||
add_subdirectory(test) | ||
endif() | ||
|
||
if(FBGEMM_BUILD_BENCHMARKS) | ||
add_subdirectory(bench) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# Code of Conduct | ||
|
||
Facebook has adopted a Code of Conduct that we expect project participants to adhere to. | ||
Please read the [full text](https://code.fb.com/codeofconduct/) | ||
so that you can understand what actions will and will not be tolerated. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# Contributing to FBGEMM | ||
We want to make contributing to this project as easy and transparent as | ||
possible. | ||
|
||
## Code of Conduct | ||
The code of conduct is described in [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). | ||
|
||
## Pull Requests | ||
We actively welcome your pull requests. | ||
|
||
1. Fork the repo and create your branch from `master`. | ||
2. If you've added code that should be tested, add tests. | ||
3. If you've changed APIs, update the documentation. | ||
4. Ensure the test suite passes. | ||
5. Make sure your code lints. | ||
6. If you haven't already, complete the Contributor License Agreement ("CLA"). | ||
|
||
## Contributor License Agreement ("CLA") | ||
In order to accept your pull request, we need you to submit a CLA. You only need | ||
to do this once to work on any of Facebook's open source projects. | ||
|
||
Complete your CLA here: <https://code.facebook.com/cla> | ||
|
||
## Issues | ||
We use GitHub issues to track public bugs. Please ensure your description is | ||
clear and has sufficient instructions to be able to reproduce the issue. | ||
|
||
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe | ||
disclosure of security bugs. In those cases, please go through the process | ||
outlined on that page and do not file a public issue. | ||
|
||
## License | ||
By contributing to FBGEMM, you agree that your contributions will be licensed | ||
under the LICENSE file in the root directory of this source tree. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
BSD License | ||
|
||
For FBGEMM software | ||
|
||
Copyright (c) Facebook, Inc. and its affiliates. All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without modification, | ||
are permitted provided that the following conditions are met: | ||
|
||
* Redistributions of source code must retain the above copyright notice, this | ||
list of conditions and the following disclaimer. | ||
|
||
* Redistributions in binary form must reproduce the above copyright notice, | ||
this list of conditions and the following disclaimer in the documentation | ||
and/or other materials provided with the distribution. | ||
|
||
* Neither the name Facebook nor the names of its contributors may be used to | ||
endorse or promote products derived from this software without specific | ||
prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | ||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# FBGEMM | ||
FBGEMM (Facebook GEneral Matrix Multiplication) is a low-precision, | ||
high-performance matrix-matrix multiplications and convolution library for | ||
server-side inference. | ||
|
||
The library provides efficient low-precision general matrix multiplication for | ||
small batch sizes and support for accuracy-loss minimizing techniques such as | ||
row-wise quantization and outlier-aware quantization. FBGEMM also exploits | ||
fusion opportunities in order to overcome the unique challenges of matrix | ||
multiplication at lower precision with bandwidth-bound operations. | ||
|
||
## Examples | ||
|
||
The tests (in test folder) and benchmarks (in bench folder) are some great | ||
examples of using FBGEMM. For instance, SpMDMTest test in | ||
test/PackedRequantizeAcc16Test.cc shows how to combine row offset calculations | ||
with packing of A (PackAWithRowOffset), how to pack B matrix (PackBMatrix) and | ||
construct output pipeline (sparse\_matrix\*dense\_matrix --> requantization --> | ||
nop) fused with inner GEMM macro kernel. | ||
|
||
## Build Notes | ||
FBGEMM uses the standard CMAKE-based build flow. | ||
|
||
### Dependencies | ||
FBGEMM requires gcc 4.9+ and a CPU with support for avx2 instruction set or | ||
higher. It's been tested on Mac OS X and Linux. | ||
|
||
+ ###### asmjit | ||
With inner kernels, FBGEMM takes a “one size doesn't fit all” approach, so the | ||
implementation dynamically generates efficient matrix-shape specific vectorized | ||
code using a third-party library called [asmjit][1]. **asmjit is required** to | ||
build FBGEMM. | ||
|
||
+ ###### cpuinfo | ||
FBGEMM detects CPU instruction set support at runtime using cpuinfo library and | ||
dispatches optimized kernels for the detected instruction set. Therefore, | ||
**cpuinfo is required** to detect CPU type. | ||
|
||
+ ###### googletest | ||
googletest is required to build and run FBGEMM's tests. **googletest is not | ||
required** if you don't want to run FBGEMM tests. By default, building of tests | ||
is **on**. Turn it off by setting FBGEMM\_BUILD\_TESTS to off. | ||
|
||
You can download [asmjit][1], [cpuinfo][2], [googletest][3] and set | ||
ASMJIT\_SRC\_DIR, CPUINFO\_SRC\_DIR, GOOGLETEST\_SOURCE\_DIR respectively for | ||
cmake to find these libraries. If any of these variables is not set, cmake will | ||
try to download that missing library in a folder called third-party in the | ||
current directory and build it using the downloaded source code. | ||
|
||
FBGEMM, in general, does not have any dependency on Intel MKL. However, for | ||
performance comparison, some benchmarks use MKL functions. If MKL is found or | ||
MKL path is provided with INTEL\_MKL\_DIR benchmarks are built with MKL and | ||
performance numbers are reported for MKL functions as well. However, if MKL is | ||
not found, the benchmarks are not built. | ||
|
||
General build instructions are as follows: | ||
|
||
``` | ||
mkdir build && cd build | ||
cmake .. | ||
make | ||
``` | ||
|
||
To run the tests after building FBGEMM (if tests are built), use the following | ||
command: | ||
``` | ||
make test | ||
``` | ||
|
||
## Installing FBGEMM | ||
``` | ||
make install | ||
``` | ||
|
||
## How FBGEMM works | ||
For a high-level overview, design philosophy and brief descriptions of various | ||
parts of FBGEMM please see [our blog][4]. | ||
|
||
## Full documentation | ||
We have extensively used comments in our source files. The best and up-do-date | ||
documentation is available in the source files. | ||
|
||
## Join the FBGEMM community | ||
See the [`CONTRIBUTING`](CONTRIBUTING.md) file for how to help out. | ||
|
||
## License | ||
FBGEMM is BSD licensed, as found in the [`LICENSE`](LICENSE) file. | ||
|
||
|
||
[1]:https://github.com/asmjit/asmjit | ||
[2]:https://github.com/pytorch/cpuinfo | ||
[3]:https://github.com/google/googletest | ||
[4]:https://code.fb.com/ai-research/ |
Oops, something went wrong.