L3 API GEMM benchmark¶
1. Benchmarking Intel® Math Kernel Library (MKL)¶
1.1 Introduction¶
Intel® Math Kernel Library provides performance improvement of math functions, e.g. GEMM, when running with Intel processors. To compare with Xilinx’s Vitis BLAS library, you can use our run-script (run_gemm_mkl.sh) to generate the data and performance benchmark.
1.2 Benchmarking Steps¶
1.2.1 Access Nimbix cloud¶
- Follow the user guide Vitis On Nimbix to login to your Nimbix account
- Launch application “Xilinx Vitis Unified Software Platform 2020.1” and select “Desktop Mode with FPGA”
- Choose machine type “16 core, 128 GB RAM, Xilinx Alveo U250 FPGA (nx6u_xdma_201830_2_2_3)”
- Copy the L3/bencharks/gemm directory to the Nimbix machine, and navigate to the gemm/gemm_mkl directory
- Follow the steps below to run Intel® MKL GEMM APIsbenchmarks.
Note
FPGA is not required in Intel® Math Kernel Library but will be used in Xilinx’s Vitis BLAS library.
1.2.2 Install Intel® MK library¶
To install MKL on Nimbix, please download the full installation package for MKL2020 from Intel® MKL Webste. You need to register for downloading the package. After you have downloaded the package, please unzip it and navigate to the directory includeing “install.sh”. Please enter the following command to install the MKL package.
sudo ./install.sh
1.2.3 Set up MKL environment variables¶
Intel® MKL: Assume you have installed Intel® MKL, run the appropriate script to set up the environment variables (such as $MKLROOT).
source <INTEL_MKL_INSTALL_DIR>/bin/mklvars.sh intel64
1.2.4 Install numactl¶
NUMACTL: The linux operating system provides a function, called numactl, that allows the control of scheduling or memory placement policy, which is essential to run parallel programs.
For Ubuntu (you only need to do it once),
sudo apt-get install numactl
1.2.5 Run MKL benchmarking script¶
The run-script runs the GEMM benchmark with a number of threads, data type, and work mode. Then, it will explore the GEMM’s matrix size from 256 to 16384.
./run_gemm_mkl.sh <thread#> <data_type> <mode>
where:
- thread#: Number of threads to run, e.g. 1, 2, 4, 8, 16, etc.
- data_type: Either float or double.
- mode: g for generating the data, b for benchmarking the performance, and a for both workloads.
1.3 Performance Result on Nimbix Cloud¶
Configuration:
cpu_model | Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz |
thread# | 16 |
data_type | float |
benchmark command | ./run_gemm_mkl.sh 16 float a |
Performance Result (nonCaching):
Square Matrix Size | matrix paris running simultaneously | Cache (Y/N) | API time(ms) | TFlops/sec |
---|---|---|---|---|
256 | 1 | N | 29.700 | 0.001 |
512 | 1 | N | 11.799 | 0.023 |
1024 | 1 | N | 16.591 | 0.129 |
2048 | 1 | N | 41.319 | 0.416 |
4096 | 1 | N | 172.369 | 0.797 |
8192 | 1 | N | 1073.250 | 1.024 |
16384 | 1 | N | 9060.830 | 0.971 |
Performance Result (Caching):
Square Matrix Size | matrix paris running simultaneously | Cache (Y/N) | API time(ms) | TFlops/sec |
---|---|---|---|---|
256 | 1 | Y | 1.380 | 0.024 |
512 | 1 | Y | 4.038 | 0.066 |
1024 | 1 | Y | 4.383 | 0.490 |
2048 | 1 | Y | 21.282 | 0.807 |
4096 | 1 | Y | 149.755 | 0.918 |
8192 | 1 | Y | 1042.860 | 1.054 |
16384 | 1 | Y | 9045.700 | 0.972 |
2. Benchmarking xfblasGemm - Xilinx’s Vitis BLAS library¶
Before benchmarking xfblashGemm, please download xf blas xclbin files, unzip the file with “tar -xvzf” command, and copy the folder u250_xdma_201830_2 to directory L3/overlay.
2.1 Benchmarking Steps¶
2.1.1 Generate test inputs and golden reference¶
Follow the MKL_benchmark steps to run MKL benchmarks, for float and short data type to generate test inputs and golden reference. To generate test inputs and golden reference for float data type, please run the following command.
./run_gemm_mkl.sh 16 float a
To generate test inputs and golden reference for short data type, please run the following command.
./run_gemm_mkl.sh 16 short a
2.1.2 Build benchmark application¶
Before benchmark the xfblasGemm, please build the host executable for the corresponding .xclbin files via following script
./build_gemm_bench.sh confi_info_file
2.1.3 Run benchmark¶
The run-script runs the GEMM benchmark with xclbin and cfg files. It will explore the GEMM’s matrix size from 256 to 8192.
./run_gemm_benchmark.sh xclbin_file config_info_file
where:
- xclbin_fuke refers to the gemx.xclbin file, including the path.
- config_info_file refers to config_info.dat file, including the path.
2.2 Performance Results on Nimbix Cloud¶
Configuration:
fpga_model | Xilinx Alveo U250 FPGA (nx6u_xdma_201830_2_2_3) |
Frequency | 150 Mhz |
data_type | float |
build command | ./build_gemm_bench.sh ../../overlay/u250_xdma_201830_2/gemm_float_4kernel/config_info.dat |
benchmark command | ./run_gemm_bench.sh ../../overlay/u250_xdma_201830_2/gemm_float_4kernel/gemx.xclbin ../../overlay/u250_xdma_201830_2/gemm_float_4kernel/confi_info.dat |
Performance Result:
Square Matrix Size | matrix paris running simultaneously | API time(ms) | TFlops/sec |
---|---|---|---|
256 | 4 | 2.715 | 0.049 |
512 | 4 | 7.223 | 0.149 |
1024 | 4 | 40.020 | 0.214 |
2048 | 4 | 292.971 | 0.234 |
4096 | 4 | 1990.240 | 0.276 |
8192 | 4 | 15317.589 | 0.287 |
Configuration:
fpga_model | Xilinx Alveo U250 FPGA (nx6u_xdma_201830_2_2_3) |
Frequency | 231 Mhz |
data_type | short |
build command | ./build_gemm_bench.sh ../../overlay/u250_xdma_201830_2/gemm_float_4kernel/config_info.dat |
benchmark command | ./run_gemm_bench.sh ../../overlay/u250_xdma_201830_2/gemm_float_4kernel/gemx.xclbin ../../overlay/u250_xdma_201830_2/gemm_float_4kernel/confi_info.dat |
Performance Result:
Square Matrix Size | matrix paris running simultaneously | API time(ms) | Tops/sec |
---|---|---|---|
256 | 4 | 1.436 | 0.093 |
512 | 4 | 2.589 | 0.415 |
1024 | 4 | 13.885 | 0.619 |
2048 | 4 | 61.879 | 1.111 |
4096 | 4 | 416.086 | 1.321 |
8192 | 4 | 3443.76 | 1.277 |