From fab1d728cae39a9e53b349b43b4b935dfaeaa395 Mon Sep 17 00:00:00 2001 From: Jack Lo <36210336+jackl-xilinx@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:51:25 -0700 Subject: [PATCH] Updated prog examples readmes (#1422) Co-authored-by: Joseph Melber --- programming_examples/basic/README.md | 4 + programming_examples/ml/README.md | 23 ++ .../ml/weight_expand/CMakeLists.txt | 75 ---- .../ml/weight_expand/Makefile | 50 --- .../ml/weight_expand/README.md | 74 ---- programming_examples/ml/weight_expand/aie2.py | 105 ------ .../ml/weight_expand/expand.cc | 82 ----- .../ml/weight_expand/memory.png | Bin 101468 -> 0 bytes .../ml/weight_expand/test.cpp | 329 ------------------ programming_examples/vision/README.md | 20 +- programming_guide/section-5/README.md | 4 +- 11 files changed, 36 insertions(+), 730 deletions(-) create mode 100644 programming_examples/ml/README.md delete mode 100644 programming_examples/ml/weight_expand/CMakeLists.txt delete mode 100755 programming_examples/ml/weight_expand/Makefile delete mode 100644 programming_examples/ml/weight_expand/README.md delete mode 100755 programming_examples/ml/weight_expand/aie2.py delete mode 100755 programming_examples/ml/weight_expand/expand.cc delete mode 100644 programming_examples/ml/weight_expand/memory.png delete mode 100644 programming_examples/ml/weight_expand/test.cpp diff --git a/programming_examples/basic/README.md b/programming_examples/basic/README.md index bfe8a881ef..699dcc331c 100644 --- a/programming_examples/basic/README.md +++ b/programming_examples/basic/README.md @@ -14,10 +14,14 @@ These programming examples provide a good starting point to illustrate how to bu * [Passthrough DMAs](./passthrough_dmas) - This design demonstrates data movement to implement a memcpy operation using object FIFOs just using DMAs without involving the AIE core. * [Passthrough Kernel](./passthrough_kernel) - This design demonstrates a simple AIE implementation for vectorized memcpy on a vector of integer involving AIE core kernel programming. +* [DMA Transpose](./dma_transpose) - Transposes a matrix with the Shim DMA using `npu_dma_memcpy_nd` * [Vector Scalar Add](./vector_scalar_add) - Single tile performs a very simple `+` operation where the kernel loads data from local memory, increments the value by `1` and stores it back. * [Vector Scalar Mul](./vector_scalar_mul) - Single tile performs `vector * scalar` of size `4096`. The kernel does a `1024` vector multiply and is invoked multiple times to complete the full `vector * scalar` compute. +* [Vector Vector Add](./vector_vector_add) - Single tile performs `vector + vector` of size `1024`. +* [Vector Vector Multiply](./vector_vector_mul) - Single tile performs `vector * vector` of size `1024`. * [Vector Reduce Add](./vector_reduce_add) - Single tile performs a reduction of a vector to return the `sum` of the elements. * [Vector Reduce Max](./vector_reduce_max) - Single tile performs a reduction of a vector to return the `max` of the elements. * [Vector Reduce Min](./vector_reduce_min) - Single tile performs a reduction of a vector to return the `min` of the elements. * [Vector Exp](./vector_exp) - A simple element-wise exponent function, using the look up table capabilities of the AI Engine. +* [Matrix Scalar Add](./matrix_scalar_add) - Single tile performs `matrix * vector` with matrix size of `16x8`. * [Matrix Multiplication](./matrix_multiplication) - This directory contains multiple designs spanning: single core and multi-core (whole array) matrix-matrix multiplication, and matrix-vector multiplication designs. It also contains sweep infrastructure for benchmarking. \ No newline at end of file diff --git a/programming_examples/ml/README.md b/programming_examples/ml/README.md new file mode 100644 index 0000000000..f9525e3e44 --- /dev/null +++ b/programming_examples/ml/README.md @@ -0,0 +1,23 @@ + + +# Machine Learning Examples + +| Design name | Data type | Description | +|-|-|-| +| [Eltwise Add](../../programming_examples/ml/eltwise_add/) | bfloat16 | An element by element addition of two vectors | +| [Eltwise Mul](../../programming_examples/ml/eltwise_mul/) | i32 | An element by element multiplication of two vectors | +| [ReLU](../../programming_examples/ml/relu/) | bfloat16 | Rectified linear unit (ReLU) activation function on a vector| +| [Softmax](../../programming_examples/ml/softmax/) | bfloat16 | Softmax operation on a matrix | +| [Conv2D](../../programming_examples/ml/conv2d) | i8 | A single core 2D convolution for CNNs | +| [Conv2D+ReLU](../../programming_examples/ml/conv2d_fused_relu) | i8 | A Conv2D with a ReLU fused at the vector register level | +|[Bottleneck](../../programming_examples/ml/bottleneck/)|ui8|A Bottleneck Residual Block is a variant of the residual block that utilizes three convolutions, using 1x1, 3x3, and 1x1 filter sizes, respectively. The implementation features fusing of multiple kernels and dataflow optimizations, highlighting the unique architectural capabilities of AI Engines| +|[ResNet](../../programming_examples/ml/resnet/)|ui8|ResNet with offloaded conv2_x layers. The implementation features depth-first implementation of multiple bottleneck blocks across multiple NPU columns.| + diff --git a/programming_examples/ml/weight_expand/CMakeLists.txt b/programming_examples/ml/weight_expand/CMakeLists.txt deleted file mode 100644 index 20f5d8a4a3..0000000000 --- a/programming_examples/ml/weight_expand/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -# This file is licensed under the Apache License v2.0 with LLVM Exceptions. -# See https://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -# (c) Copyright 2023 Advanced Micro Devices, Inc. - -# parameters -# -DBOOST_ROOT: Path to Boost install -# -DXRT_INC_DIR: Full path to src/runtime_src/core/include in XRT cloned repo -# -DXRT_LIB_DIR: Path to xrt_coreutil.lib -# -DTARGET_NAME: Target name to be built - -# cmake needs this line -cmake_minimum_required(VERSION 3.1) - -set(CMAKE_CXX_STANDARD 23) -set(CMAKE_CXX_STANDARD_REQUIRED YES) - -find_program(WSL NAMES powershell.exe) - -if (NOT WSL) - set(CMAKE_C_COMPILER gcc-13) - set(CMAKE_CXX_COMPILER g++-13) - set(BOOST_ROOT /usr/include/boost CACHE STRING "Path to Boost install") - set(XRT_INC_DIR /opt/xilinx/xrt/include CACHE STRING "Path to XRT cloned repo") - set(XRT_LIB_DIR /opt/xilinx/xrt/lib CACHE STRING "Path to xrt_coreutil.lib") -else() - set(BOOST_ROOT C:/Technical/thirdParty/boost_1_83_0 CACHE STRING "Path to Boost install") - set(XRT_INC_DIR C:/Technical/XRT/src/runtime_src/core/include CACHE STRING "Path to XRT cloned repo") - set(XRT_LIB_DIR C:/Technical/xrtNPUfromDLL CACHE STRING "Path to xrt_coreutil.lib") -endif() - -set(TARGET_NAME test CACHE STRING "Target to be built") - -SET (ProjectName ${TARGET_NAME}) -SET (currentTarget ${TARGET_NAME}) - -if ( WSL ) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}) -endif () - -project(${ProjectName}) - -# Find packages -find_package(Boost REQUIRED) - -add_executable(${currentTarget} - ${CMAKE_CURRENT_SOURCE_DIR}/../../../runtime_lib/test_lib/test_utils.cpp - test.cpp -) - -target_compile_definitions(${currentTarget} PUBLIC DISABLE_ABI_CHECK=1) - -target_include_directories (${currentTarget} PUBLIC - ${XRT_INC_DIR} - ${Boost_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR}/../../../runtime_lib/test_lib -) - -target_link_directories(${currentTarget} PUBLIC - ${XRT_LIB_DIR} - ${Boost_LIBRARY_DIRS} -) - -if (NOT WSL) - target_link_libraries(${currentTarget} PUBLIC - xrt_coreutil - boost_program_options - boost_filesystem - ) -else() - target_link_libraries(${currentTarget} PUBLIC - xrt_coreutil - ) -endif() diff --git a/programming_examples/ml/weight_expand/Makefile b/programming_examples/ml/weight_expand/Makefile deleted file mode 100755 index b4967596fb..0000000000 --- a/programming_examples/ml/weight_expand/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -##===- Makefile -----------------------------------------------------------===## -# -# This file licensed under the Apache License v2.0 with LLVM Exceptions. -# See https://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -##===----------------------------------------------------------------------===## - -include ../../makefile-common - -all: build/final.xclbin build/insts.txt ${targetname}.exe - -targetname = expand - -build/%.o: %.cc - mkdir -p ${@D} - cd ${@D} && xchesscc_wrapper ${CHESSCCWRAP2_FLAGS} -DBIT_WIDTH=8 -c $(<:%=../%) -o ${@F} - -build/aie.mlir: aie2.py - mkdir -p ${@D} - python3 $< > $@ - -build/final.xclbin: build/aie.mlir build/expand.o - mkdir -p ${@D} - cd ${@D} && aiecc.py --aie-generate-cdo --no-compile-host --xclbin-name=${@F} \ - --aie-generate-npu --npu-insts-name=insts.txt $(<:%=../%) - -${targetname}.exe: test.cpp - rm -rf _build - mkdir -p _build - cd _build && ${powershell} cmake .. -DTARGET_NAME=${targetname} - cd _build && ${powershell} cmake --build . --config Release -ifeq "${powershell}" "powershell.exe" - cp _build/${targetname}.exe $@ -else - cp _build/${targetname} $@ -endif - -run: ${targetname}.exe build/final.xclbin build/insts.txt - ${powershell} ./$< -x build/final.xclbin -i build/insts.txt -k MLIR_AIE - -trace: - ../../utils/parse_eventIR.py --filename trace.txt --mlir build/aie.mlir --colshift 1 > parse_eventIR_vs.json - -clean_trace: - rm -rf tmpTrace trace.txt - -clean: clean_trace - rm -rf build _build ${targetname}.exe - diff --git a/programming_examples/ml/weight_expand/README.md b/programming_examples/ml/weight_expand/README.md deleted file mode 100644 index 7f4b2e4f76..0000000000 --- a/programming_examples/ml/weight_expand/README.md +++ /dev/null @@ -1,74 +0,0 @@ - - - -# int4 -> bfloat16 dequantization - -This IRON design flow example is a dequantization kernel which converts from `signed int4` weights, **32** of which share a single `bfloat16` scale factor. - -The conversion is to take each `signed int4` weight, and multiply it by the scale factor, giving a vector with 32 elements of bfloat16 numbers. This vector can then be used by another kernel, either running on the same core, or on a different core to do a high-precision operator such as bfloat16 based GEMM or GEMV. The main use model is for generative AI where the loading of the parameters during the generation phase is the limiting factor. - -Though other configurations are possible, the design example has a memory layout consisting of **1024** `signed int4` weights followed by **32** `bfloat16` scale factors, meaning the tile to be input is **576 bytes**, or **144 int32 words** in size. - -![Memory layout](memory.png?raw=true "Memory layout") - -The example consists of two primary design files: `aie2.py` and `scale.cc`, and a testbench `test.cpp`. - -## Overview - -1. `aie2.py`: A Python script that defines the AIE array structural design using MLIR-AIE operations. This generates MLIR that is then compiled using `aiecc.py` to produce design binaries (ie. XCLBIN and inst.txt for the NPU in Ryzen AI). - -1. `expand.cc`: A C++ implementation of vectorized dequantization operations for the AIE core. - -1. `test.cpp`: This C++ code is a testbench for the dequantization design example. The code is responsible for loading the compiled XCLBIN file, configuring the AIE module, providing input data, and executing the AIE design on the NPU. After executing, the script verifies the dequantized results. - -## Design Component Details - -### AIE Array Structural Design - -This design performs dequantization operations on a vector of input data. The AIE design is described in a python module as follows: - -1. **Constants & Configuration:** The script defines input dimensions (`N`, `n`), as well as the block size (the number of weights which share a scale factor) - -1. **AIE Device Definition:** `@device` defines the target device. The `device_body` function contains the AIE array design definition. - -1. **Dequantization Function Declarations:** `expand_int4_to_bfloat16` is an external function imported from `expand.cc`. - -1. **Tile Definitions:** `ShimTile` handles data movement, and `core0` processes the dequantization operations. - -1. **Object Fifos:** `inA` and `outB` are defined to facilitate communication between `ShimTile` and `core0`. - -1. **Core Definition:** The `core_body` function loops through sub-vectors of the input data, acquiring elements from `inA`, processing using `expand_int4_to_bfloat16`, and outputting the result to `outB`. - -1. **Data Movement Configuration:** The `sequence` function configures data movement and synchronization on the `ShimTile` for input and output buffer management. - -1. **Generate the design:** The `my_expand()` function triggers the code generation process. The final print statement outputs the MLIR representation of the AIE array configuration. - -### AIE Core Kernel Code - -`expand.cc` contains a C++ implementation of scalar and vectorized vector scaling operations designed for AIE cores. It consists of three main sections: - -1. **Vectorized dequantization:** The `expand()` function processes multiple data elements simultaneously, taking advantage of AIE vector datapath capabilities. - -1. **C-style Wrapper Functions:** `expand_int4_to_bfloat16()` is a C-style wrapper functions to call the `expand()` function from the AIE design implemented in `aie2.py`. - -## Usage - -To compile the design and testbench: - -``` -make all -``` - -To run the design: - -``` -make run -``` \ No newline at end of file diff --git a/programming_examples/ml/weight_expand/aie2.py b/programming_examples/ml/weight_expand/aie2.py deleted file mode 100755 index 32fe95429f..0000000000 --- a/programming_examples/ml/weight_expand/aie2.py +++ /dev/null @@ -1,105 +0,0 @@ -# -# This file is licensed under the Apache License v2.0 with LLVM Exceptions. -# See https://llvm.org/LICENSE.txt for license information. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# -# (c) Copyright 2023 AMD Inc. - -import sys - -from aie.dialects.aie import * -from aie.dialects.aiex import * -from aie.dialects.scf import * -from aie.extras.context import mlir_mod_ctx - - -def my_expand(): - - SF_BLOCK_SIZE = 32 - word_size_in = 2 - sf_word_size_in = 2 - N = 65536 - - N_in_bytes = (N // word_size_in) + (N / SF_BLOCK_SIZE) * sf_word_size_in - - A_sz_in_i32s = (N // 8) + ( - N // SF_BLOCK_SIZE - ) // 2 # They are 4 bits per element, we need to add on the scale factors later though - B_sz_in_i32s = N // 2 # Returning 16 bits at the moment - - # Tile sizes - n = 1024 - block_size = 32 - sf_size = n // block_size - - input_buffer_size_bytes = (n // 2) + ( - sf_size * 2 - ) # They are bfloat16 sfs after the private values - output_buffer_size_bytes = n * 2 # The unscaled values - - N_div_n = N // n - - n_cores = 1 - tiles = N_div_n // n_cores - buffer_depth = 2 - - with mlir_mod_ctx() as ctx: - - @device(AIEDevice.npu) - def device_body(): - memRef_i_ty = T.memref( - input_buffer_size_bytes, T.i8() - ) # Just think of the input as a raw byte buffer - memRef_o_ty = T.memref(output_buffer_size_bytes, T.i8()) # For now - - # AIE Core Function declarations - - expand_int4_to_bfloat16 = external_func( - "expand_int4_to_bfloat16", inputs=[memRef_i_ty, memRef_o_ty] - ) - - # Tile declarations - ShimTile = tile(0, 0) - - MemTile = tile(0, 1) - core0 = tile(0, 2) - - # AIE-array data movement with object fifos - # Input - inA = object_fifo("inA", ShimTile, core0, buffer_depth, memRef_i_ty) - - # Output B - outB = object_fifo("outB", core0, ShimTile, buffer_depth, memRef_o_ty) - - # Set up compute tiles - @core(core0, "expand.o") - def core_body(): - for _ in for_(0xFFFFFFFF): - for _ in for_(tiles): - elem_out = outB.acquire(ObjectFifoPort.Produce, 1) - elem_in = inA.acquire(ObjectFifoPort.Consume, 1) - - call(expand_int4_to_bfloat16, [elem_in, elem_out]) - inA.release(ObjectFifoPort.Consume, 1) - outB.release(ObjectFifoPort.Produce, 1) - yield_([]) - yield_([]) - - # To/from AIE-array data movement - tensor_ty = T.memref(N, T.i32()) - - @FuncOp.from_py_func(tensor_ty, tensor_ty) - def sequence(A, C): - - npu_dma_memcpy_nd( - metadata="outB", bd_id=0, mem=C, sizes=[1, 1, 1, B_sz_in_i32s] - ) - npu_dma_memcpy_nd( - metadata="inA", bd_id=1, mem=A, sizes=[1, 1, 1, A_sz_in_i32s] - ) - npu_sync(column=0, row=0, direction=0, channel=0) - - print(ctx.module) - - -my_expand() diff --git a/programming_examples/ml/weight_expand/expand.cc b/programming_examples/ml/weight_expand/expand.cc deleted file mode 100755 index 6083e535dc..0000000000 --- a/programming_examples/ml/weight_expand/expand.cc +++ /dev/null @@ -1,82 +0,0 @@ -//===- scale.cc -------------------------------------------------*- C++ -*-===// -// -// This file is licensed under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// Copyright (C) 2023, Advanced Micro Devices, Inc. -// -//===----------------------------------------------------------------------===// - -#define __AIENGINE__ 2 -#define NOCPP -#define __AIEARCH__ 20 - -#include -#include -#include -#include - -#include - -template -void expand(T_in *in, T_out *out) { - - /* - out[0] = 0x0; - out[1] = 0x1; - out[2] = 0x2; - out[3] = 0x3; -*/ - constexpr int vec_factor = 32; - constexpr int sf_vec_factor = 8; - - event0(); - T_in *__restrict pI = in; - T_in *__restrict pSFb = - in + N / 2; // The scale factors are after the integer values - T_sf *__restrict pSF = - (T_sf *)pSFb; // But we only advance by the number of bytes not elements - T_out *__restrict pO = out; - const int F = N / (vec_factor * sf_vec_factor); - - for (int i = 0; i < F; i++) - chess_prepare_for_pipelining chess_loop_range(16, ) { - - // Let's unroll this - aie::vector sfV = - aie::load_v(pSF); // For example - pSF += sf_vec_factor; - - for (int k = 0; k < sf_vec_factor; k++) - chess_unroll_loop(sf_vec_factor) { - aie::vector I0 = - aie::load_v(pI); // For example - pI += vec_factor / 2; - - bfloat16 sf = sfV[k % sf_vec_factor]; - - aie::vector sf_broadcast = aie::broadcast(sf); - - // Upsize these to 8 bits -> 16 -> bfloat16 - aie::vector asInt8 = aie::unpack(I0); - aie::vector asInt16 = aie::unpack(asInt8); - aie::vector as_bf16 = - aie::to_float(asInt16, 0); - aie::vector scaled_bf16 = - aie::mul(as_bf16, sf_broadcast); - - aie::store_v(pO, scaled_bf16); - pO += vec_factor; - } - } - event1(); -} - -extern "C" { - -void expand_int4_to_bfloat16(int4 *a_in, bfloat16 *c_out) { - expand(a_in, c_out); -} - -} // extern "C" diff --git a/programming_examples/ml/weight_expand/memory.png b/programming_examples/ml/weight_expand/memory.png deleted file mode 100644 index 0e758119aee14141d586cb2f4b1fa7357d679006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101468 zcmd3u1y@{4(5`WJcXtTxB)D5}cSu5TcX!ty0U{6}IKkcB-Q6{~2f3Z^ob&yGyY5NM|(} zafq@}k^}Gr=7X4$7z9K`Jo2L{EO?ISAgk*P0fE-__a9`ReSrl8#7mx>q?m?>(eam1 zV;sXjFaG|KlPlmM>mED_mE+1@}DC(UuiI@ z{(C6${~w2TT9}!cnV3+}()KJYc=pB+*4EZyVq!+)y%KcVM&Lc?^o6doU$e8bLqkAN zQB&)5R8&+%LPD}zZ5~)s%vO0u{paRhdXnkiCM73l+q6byWf@pm9ri@yi}*ftFKt*i z`~ImdE{$ppuaBSuS1+5aD4uyx|t-g3@Xy^(?etv?!?L0MxPxiYfD@_6d0$^a2 zm6gGj(o>$Ep2&rL)@|{iG?;vufBg9I{QSI63?7DthJ1W=)G~2rwW2ohjCijEv-$6%~c3JXZsTb9Z`rxPE-}k&}~S zV`Fo7cUP<%9v)`>HXqfnx78| z3)9onBO)eFOH2Fq+A}Fl0z;+n%5{A-BO_z{>izroj*gBIFWueUR8&-Mr>i4FV!(`U ztxPHFsK8+7UHBn)-$pdGwWruRR2hQIY;0I)X{C&eR!2uihlUhnWcmgNiz+KG?#{QG zNkkx1G&!0cw z$}cs4@B?dh8RLM3d~@Z_YLvhrwuzpSRFrn)*87nk!=t*r=2 zmP%pwR&OkE!Z%A5@S?uHJ_koddwcuI$;nck{iPF#0$Naef6g|#p8ni+QBv4^Dayja z#wLI5(LQvGnkC>2M+PTE1<~aHA`C8Q`UZmojJC(^$x0@lJ(&AOtv>gU_m@B4egifp zP(NO6@peC1Zg4%q(>g5HF8}-XW>56q*f$aHo8vNJ~Ga&4i-kb<48Rh6`uH3lE z4K?`BUYGWPR54J`h){PODQG3AWNyL_lb~J=3W(f8a73IMnz1~ zd>ZFks#Mjz8X{v8Ohrphc?Giy+seYXum~zO!^OZ7r?Uw6JyTY!I=FBHZ!Gn-cx5@2y29I@E zcz6XIIw~qE8d{lNjg^TB#F3-1@fxtdwu5e~kAPQgU0vPJpC1k;^TuaEr~n=SKCY0; zqTB3oo+A~#xU{sixTpu_tDas)W@been?XGW?MF+?f;}~D?eK||%uIdoF-^@-g4Udz zoaW|c5O}Mrt8;U6>+9hbaMm%O;MhnJV2pkQNtJ->j!!vB729i8-y3=m3)iHHu5j*j;CEy1W-S%IKk zTvWuw%*@QhB>ugBU|?Wy&@3?}DXBAvnUz&}J31l)0SAQ+*65s!0@H+*9WNHY5f>Pz8h0Msf$ATdNQ#5AeR>)nfNQ=8 z=IO`?syPugvH4AAAx=CIXjd@Fw=86O zT3Aszh^Uat><|bksn4oTpU7)O4OOV8k!vJKRn@2QYou2q;l-@KE6HYJi->1DDQE|I zj@tWd!pd%4?uqD;H6^_7bCk{8TDP>#LfeyqR3Z3;L@TMPYNG*@BA)VLBm=e&9vwj> z!W6xZfRq$f2Jt82DdJnCawK%*aO6E?8I+$W@Teb9`%vlQ5+lzeRgvc6F{2%$cOcCP zs0p_Se-K%tq>_|~>Lj!8R=AkTby0<K3x%m@0pCs(!z%5^Ep#|KbTxv(_7c0!;^QG_z;BI=KdROhT6N)& zMin3?l}ad_ehl#=E+F#lt}x^bBtdL9?pcT9I$p#F3X?2o6zxrhGqQ4mMwmO)O+j`Z z1cI^dSd6#g?I=*`@&tP@!z`Od2To8~*gqxP zX{a#Zr6`mGAijyFKRg#FJonAqLNbU_tFZVB^~49|&fJKRf*E8RDfr!-3cl zLsZq%Kvl*fgHu4qqo_|yNWi$mvt(mYQ+cmbwXXRqq$5xCu;ZIaV6b!uePCP&ao}>u zLkK}AddEYACYBx^6n-Z@8jK!cG-Ij;f}N$~<{S0~_S0X_&tnD9>gcb+in1LYq>T=5 z+tms~da1ggwjd->-^5l#oQEfdV+KHme~iqQh9e|2O@FcQ=x{W#F=fwQafI=p+H_}M zj7X#W8hVGhDaJkx;YdOf-r-8f&uLmzMG>5N%2|IBw8wULW(fC!3fXl_PC-ae?&H8v z57&IL@g+uR2Z9luk$6yUP;qd~(Qnza-!*cO1b*O4LckF(ZvQZh!70;_Yi*Y9plhd^ zB}Y9<^9ALBF|4-|yuh(`hny;$lN(&F2};6!al)YwVj)YwYA5r7rKlj0;_r8pVd_F@ z-27gFQ*W2w1@H@RKAeXg-3U0W2*by1?TJ6q1s*+mVwB6TCfvsG@e{fK@$V2C|Ip9q z@pJp(ou~m9MX2OQRW{BL2tsy?f&|B)#^eeyY1jWIk^inNtB<^&Yb zmDvjw_--;>o0j}6aq&|d%?!|k!A?1X1T8w|>^rh{aG&VjmU(3A{bz4KN!#k z-AT*`!)?f>u!$x>W8U8gojM0~KVD3-G(bp{HJ!25B^0w@6#fC(X_Gq}RrMDkcPd%x zIb~k^)tEd>kRj?M_xB`$wcFolcotKwL4c2uhBe1SRGGGnDsmOl9`##U` z+A6T|yEKHR1gxr(2A-z$$^?`pd^Ox+Zhk&oY_OKNes&K9+PIgcL^aJKc4<^?sFtYE zkD7^HOV4T%FG$}&GO@Pr?&C81j92(xsJ`K3k|I<@f$5^6P;UY^VB`XoMSSkqdm*Tj zL2hJfV-jLgU@|OfN)ZrVFGJ)1^6VRZ&+HPQw80~!Ju13&&x@WzbaK!cxHT#P#ZTS_i1 zMMK6;puBp`%^d=XDm6?#bu?Sr^-DTLNt$=l2F0$PiL-U$1Hq<)se=W<&Y9)*4|2tn z!f$sFG2WuALeAx)&ce5l%R`e{Z~Y;BXy3!G`{nf96CgO0TR97(KyB;sy=GZAdfD}1 zhpET!5gxK3qOJY95P$Xn0g+?Qt$26bWgB-wvh`WnDMN z3feO;a_Go{0m)J4Fid%ag9v=OB-yYgl-y^u$~l(=YJc2Mct4-9)QZ?B-+>=L*eI{1 zrZ!Uk=2}BzY_dn$gcD!4yO1aQEo~<+)J1A3T7p}p{S#ZweN4m}iJwOAOE#n5GWVx< ztW!cGQX@%3w?)Lo#3YO{j-ST7W$6Eat)mNh?*S!|=EDow`se{w+@md$4Popj+wl^z zSxm0hUT%up!91H%sI6InlUQ7&Q_arDAyKhNOGh{Q^^FiKD_Wwpg@uKV4gr*INR^+T zU)B2&@d3{&!~XA~lt_+7S3GhZ9ufkcm6l!@5kG|dM*19ZkctELLYyf~bu=_^e5mca z;yZ89*FnNTk&Zz^Z7Ho0n-0N@WX}bP_D8nwks$SmiH*(Hl|#yXmBSW6>F@7fpczs- zo{^v~NvR|S$^%FOGl)uRP`S!sH0$c>icuC87MhC5#0)N-Igc+jz63*%s+J@sVm1?d z2BfsM`q|mB2H6;)A%%8wez*Udq62sHZ#@hyb--zCY*f#i1jTG5R#Z$3NC5S{y@l>+ z&^j$WJP11XL1iJ!egCK==#h!|z=DOeL(lK`=pic`@#)j2h=_>H%%#*<`X0nEFd&2P zd$>NDm@O(Q`uOpqr>7?&At3@xRaF(JC5HZ1QuB~5SPf{~8ygi?Gew{Z_3_*ixI)E= z$GY`)U}R+UX}ApeQ%q-od*v@m@9O5J{HFhhOgxf^Kc(GNzEZOWDEvlD%*@IdnVHS8 zC=J9MF4n!tR?mNf`e(Z{6#2~9&CN|rOzhRGS0E|%h`%eZt;MULV8aGhD&A0_6&@E% zPg!$GbPniKP)PJIB@btO$xb zHdw0nAbJ6w@fbgl5AC(T{q}Kjx-XvG805dVzV{L0m~hU!!-*iHYo3~z7#JRY?S4XH zADoc=xA@%~{gRrBcL93+1zD{NMl;6%4k>e*ls((*G4J`m{C-DkI?Q4`XeOcTL~b{yA;b zxaaw%6et$}vuK-^09KjXaeBD=Xf#<@VY9$Vl5iV8{=dgMcmfpQ;c*v3$W>WYwbty} zrSLR7K8|r49`xSl^psLiKwun33^wLc$qzk+oof2AC{>zU2YllzOYo?{jySotFp8DXXpR?&Fh{ z_OM3s#!Ev&qN}%e_hM(LId=@yFzKH^f3&tPE+_z10vMRc=x7Cp4sYPj045z5mzBl6 zhJ%9xmB;SxF7T=Tu;i$ys0*|!=l_sibbwD`Ny+r|G!7;v?F+e^@%wF?E)z0LQMo40|NseKP@RKDJ@M~Q?tflqx0h80+(3}1qJ2m_Lj}K zwHbJ8MFr*zBMVCwpZ(YPcywiW)zBhH1iIBgKeT_XY6>e8M{<6Bjf;()oS1libMw6F zUC@S~Ge8jx>L;={Ufl{$_5eNM5fVne7P&lF+8IjAuAZKmQRR8}?p>DMNCr={ZBW4f zkT-x=oUE*@uCA~1^73A>u%xmXk1F7DCMPGWuqTL3t>nS<_Vw*-Z-a^sl=R&S4`g0m zUZA#y!@JttsI0!P%;AR<>u0WQV~>u zpg;r+&ZDPIN=gdAC0AG1nwpy5zkdUt5OJ>91Cy1XE*C4{6Cwgadxt7SfI7I8sCZ(j z$wK8jk+VlRFg*11KU-UcS6?~<|GNjh2n@Z z;9x@&)VUH85}KO0mC|3Mv$9B>z(`7v2)PaS_J)1h_y+9R0tk$Koe0XmX1>n^AFZsZ z3Dp3!=JM)_g_(KF_KvpM=icf1aE6SG?6nd%>cqqZh-2%&FT=(DMZW$b+GPd@`}@DD zs*=;v!fhtU$93xLNbQ&G0cnMxlGE0%%gNb1UZ`rG7D4}SMDfAhZ~rm-`t@sb?wXjn zId$%&HaYg0%zr0kdFSDgetVME)ppPX=4IN|&;JPXCu7tXRR9M6CCls^3VEPvc0XM` zS9_8D&nqs9H~b;+F)+@y2e6F}$r1l^Ge2nHm$fxDw$|2wPeHRC#Q(!%K}7oWG5g<8 zf%H!Azw?NH#{18+Rq{jsHU9t0Loc+?H>Se*zO5?z_&hys4fTY`}o{komo%RyP?$Uo0}Ujz)vWv)bH*uc9^xxBzY~20A>N}DIdrRegE75biDZs zfTd>Ow6Vl|AiKT;SPekA^QgaZx-%qC?W2>E6TsIXzM+%7t_NQVJ0yqY&EPy^|XJ-SZ2)qF}VNXv_XlN){y+L%m+#4GMVG|(7 zw{PEq2qiC{!Sw-{!pFwO#>K@2c!rLSj;yS#ii(PfiAlSEFix&H^998RkmTIRgVzDB zS5oTX06_)N+vun$z|jFAQ9;3hlj=+gc7=@|1ldJJj!C3AF37B+iA*8AAFd7nHS}Qy8B22mq&Rg!uP z+#7(WmN(nm7A{nc?Td>x-@K;578|)h4%xi-ll%wBH144Sq*q zn$~dMT36MtK9=k2XzQtFB!5f(`uS@@ItXtYh}l3T*^ikcd< zM8I0e%v=nDG>Et5<@RP)W+2kr+n;W3Zf+cGY;6Sx#!|-WnLqaR^o)FcLwqfjnEWr3L#P1OVk$mV+eHvKV%zo<_! zUQl63oXp;@wE2@yA(<0jo=+F5gSj9C7HZI#q5Q*s!GX*U#UVEC3usrdR_Wo%NtjNz zwYIkQhY$3P>FCc=f?gzDDU`GvrRqQDSIgH;?zuIO*CYW8YcNP#oMD zP~5sTLjAkWGcz&(3*>-hzZu6TNZyCqtY1IBGeY(idrS!pg`EVK*(d>BmhrZ3d2j2_+fz)jH}~zI(UQNdwx6Bq$F+F(RorHwoUXNIdEDPEBzvQutkkL&I$Ch@I!MQ0XOSv}ugb`c2QXkQVoZ_K zcJBwli%JG2QG4B2-eQ^v)Y=Fj%nMmOQP-?&|u9UE3y?X;h@k2lU(^Tn1B z>$iQJ+pRda6+$~+^mRFHP5u+kTO#arFdu3Cb97nI{rR~^A->GW*KO+}xwvj^x#`a{ z5k>ep2gXz(T=$R+VK(U;i3N7Zu;3VKFW3x4hD7s8h#!Y z?l-Sls5xIVGjR&hS^3#q1=a5_-=#N)%s;}k35ZqPSD7QfcQ(5G(1$x5$K2h9$Z?N2 z;d!nq;HZjhMqT-%Yfmcly)?`iDzYLfsw~pY7wq-q^*yZ3U9yc(Z5e<1CEXh>GTvR* z)ZUx-aI?~0yAO+Wf<$l`MS_Qe8B9o4QIi*(oJf^wm6KSLNt;QVIh$q$>xzk=x%g+k z1oBxz@-wRW3g?QoN?IW4;2`P{1@hwqlrG1rrlzJ-9S{?P0?4M}g{YVjsKqcD7?~KE z84DR03z@7BtQd<69TdNqGZB$UY(z2^F>Ywesq5+)>8VP{sTv}tBx!3VXeXwrr>1Ep zC2M|?0z8IM;3K0hqa2}}nmPyK71e_pj?|83s(Rp<<~ohDDA7Vl)b}$6_NXW*vkB0a z3x^889|vGM$-ch_ECb~reU|N51i>VhmQWy(+}qTc1oF2iS{!uFLjj))^aTZ%TSqHD zXu?)RMk3BS1we1UQ9FbCFgYr<=aBOmG3 z#!<4KR2T^}LW*5>Qbn6#7bUCdadHYdJN=1@n$yy{I*-it@> zHM6$%WrWs6tIIkK6|H85h6}Pv0}h(!CQ=)sy3d1?%{x5;Z$dAdE~H${nE}t-;MYZ-_lT=ml#_SS6G(uwJ`~fi7x&CVoMRm?$r5D z6nvehheS~BnarK`1~-R$4CHew%mtgN6_QhuFURYCZc1zzbqPdgaVaS!B_+^R5xHrf zhBUufqX-r8V6RRf^iJd`EGmkE-u%TcJQ`#goG2$h#D=1!&eFbZY(q=5prh*j2tQ5K z*CD&Ei07zk6Li#$)6T!)p}?W4Oq|_D)4i@^fn%}m=JM)F({+YBhP!6O<+=nV<~T+v zYvk2(Y03MA#d`rAPaUDqdcp8Uf$;iGNUmwJvYfU!B@%2Tg6xB zQd@idt19^T+|lXE+3mvJ715!mbB}2Igy=YK(=qzD1>aD|Vz9c6x{NcmzPYc0#ITT( zgc6V8=ybBS>N<-wr>VxfTay7%AP4u%mhuuln>a?vNoL65Gx;Ql_Z5KIF7Y z!acIHB*_zyBd6k4lO0$I{;IdrR@g}mOPV-*?5KntLgs36np~_(!po2Jr5hjJ>=O6Is~H}RDf^F%qj46S3-EikV38I8BqO-H+=*_OrBXg2k$K^HL_ zF^!qD?w|S3jp<9U{PXaFrfhvG_2oD#?$Yt*j+7~hb@gh}^=geqmZrzHMzAVG zu*SwSMaHwlNwi7g^oHPfhwMsTu<&uRura+BArQ|f z89982nUB}xU1x5K^B!8zE2k%vbG}Zt?#hTR3{&T_9Mbu^+xEK?Xm2;t`Ibuxo4L`h zCO5K`mdp7QL;BleVXoHO$JX;9_#0ypm$RFRF7!BZZ?D7d;wt*JEFodf-Tm#tu4H<& zX5re?>%4MP+w?$4( zU*2Z1I{Df~%*@=&K+{aakwlM&oeQRGm8%0D8W(z%wS8i-Z?>}wDR`m3113s-Oy0Q9 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 diff --git a/programming_examples/ml/weight_expand/test.cpp b/programming_examples/ml/weight_expand/test.cpp deleted file mode 100644 index 7cf3c01fea..0000000000 --- a/programming_examples/ml/weight_expand/test.cpp +++ /dev/null @@ -1,329 +0,0 @@ -//===- test.cpp -------------------------------------------000---*- C++ -*-===// -// -// This file is licensed under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// Copyright (C) 2023, Advanced Micro Devices, Inc. -// -//===----------------------------------------------------------------------===// - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xrt/xrt_bo.h" -#include "xrt/xrt_device.h" -#include "xrt/xrt_kernel.h" - -constexpr bool VERIFY = true; - -constexpr int TEST_SIZE = 65536; -constexpr int TILE_SIZE = 1024; -constexpr int NUM_TILES = TEST_SIZE / TILE_SIZE; - -constexpr int SF_BLOCK_SIZE = 32; - -constexpr int TOTAL_TILE_SIZE = - (TILE_SIZE / 2) + (TILE_SIZE / SF_BLOCK_SIZE) * 2; - -constexpr int IN_SIZE = (TEST_SIZE / 2) + (TEST_SIZE / SF_BLOCK_SIZE) * 2; -constexpr int OUT_SIZE = TEST_SIZE * 2; - -namespace po = boost::program_options; - -void check_arg_file_exists(po::variables_map &vm_in, std::string name) { - if (!vm_in.count(name)) { - throw std::runtime_error("Error: no " + name + " file was provided\n"); - } else { - std::ifstream test(vm_in[name].as()); - if (!test) { - throw std::runtime_error("The " + name + " file " + - vm_in[name].as() + - " does not exist.\n"); - } - } -} - -static inline std::bfloat16_t random_bfloat16_t() { - // Random numbers should NOT be uniformly between 0 and 1, because that - // would make the matrix product AB always close to 1. - return std::bfloat16_t(4.0 * (float)rand() / (float)(RAND_MAX)); -} - -bool nearly_equal(std::bfloat16_t a, std::bfloat16_t b) { - std::bfloat16_t diff = fabs(a - b); - if ((diff / a) < 0.01) - return true; - else - return false; -} - -std::vector load_instr_sequence(std::string instr_path) { - std::ifstream instr_file(instr_path); - std::string line; - std::vector instr_v; - while (std::getline(instr_file, line)) { - std::istringstream iss(line); - uint32_t a; - if (!(iss >> std::hex >> a)) { - throw std::runtime_error("Unable to parse instruction file\n"); - } - instr_v.push_back(a); - } - return instr_v; -} - -int main(int argc, const char *argv[]) { - - // Program arguments parsing - po::options_description desc("Allowed options"); - - desc.add_options()("help,h", "produce help message")( - "xclbin,x", po::value()->required(), - "the input xclbin path")( - "kernel,k", po::value()->required(), - "the kernel name in the XCLBIN (for instance PP_PRE_FD)")( - "verbosity,v", po::value()->default_value(0), - "the verbosity of the output")( - "instr,i", po::value()->required(), - "path of file containing userspace instructions to be sent to the LX6"); - po::variables_map vm; - - try { - po::store(po::parse_command_line(argc, argv, desc), vm); - po::notify(vm); - - if (vm.count("help")) { - std::cout << desc << "\n"; - return 1; - } - } catch (const std::exception &ex) { - std::cerr << ex.what() << "\n\n"; - std::cerr << "Usage:\n" << desc << "\n"; - return 1; - } - - check_arg_file_exists(vm, "xclbin"); - check_arg_file_exists(vm, "instr"); - - std::vector instr_v = - load_instr_sequence(vm["instr"].as()); - - int verbosity = vm["verbosity"].as(); - if (verbosity >= 1) - std::cout << "Sequence instr count: " << instr_v.size() << "\n"; - - // Start the XRT test code - // Get a device handle - unsigned int device_index = 0; - auto device = xrt::device(device_index); - - // Load the xclbin - if (verbosity >= 1) - std::cout << "Loading xclbin: " << vm["xclbin"].as() << "\n"; - auto xclbin = xrt::xclbin(vm["xclbin"].as()); - - if (verbosity >= 1) - std::cout << "Kernel opcode: " << vm["kernel"].as() << "\n"; - std::string Node = vm["kernel"].as(); - - // Get the kernel from the xclbin - auto xkernels = xclbin.get_kernels(); - auto xkernel = *std::find_if(xkernels.begin(), xkernels.end(), - [Node](xrt::xclbin::kernel &k) { - auto name = k.get_name(); - std::cout << "Name: " << name << std::endl; - return name.rfind(Node, 0) == 0; - }); - auto kernelName = xkernel.get_name(); - - if (verbosity >= 1) - std::cout << "Registering xclbin: " << vm["xclbin"].as() - << "\n"; - - device.register_xclbin(xclbin); - - // get a hardware context - if (verbosity >= 1) - std::cout << "Getting hardware context.\n"; - xrt::hw_context context(device, xclbin.get_uuid()); - - // get a kernel handle - if (verbosity >= 1) - std::cout << "Getting handle to kernel:" << kernelName << "\n"; - auto kernel = xrt::kernel(context, kernelName); - - auto bo_instr = xrt::bo(device, instr_v.size() * sizeof(int), - XCL_BO_FLAGS_CACHEABLE, kernel.group_id(0)); - auto bo_in = xrt::bo(device, IN_SIZE * sizeof(char), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(2)); - auto bo_out = xrt::bo(device, OUT_SIZE * sizeof(char), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(3)); - - if (verbosity >= 1) - std::cout << "Writing data into buffer objects.\n"; - - char *bufA = bo_in.map(); - std::vector AVec(IN_SIZE); - - std::vector A_private; - std::vector A_sf; - - for (int t = 0; t < NUM_TILES; t++) { - for (int pr = 0; pr < TILE_SIZE / 2; pr++) { - std::int8_t lower = (rand()) & 0xf; - std::int8_t upper = (rand()) & 0xf; - AVec[t * TOTAL_TILE_SIZE + pr] = ((upper) << 4) + lower; - A_private.push_back(lower); - A_private.push_back(upper); - if (verbosity >= 2) { - if (t == 0) - std::cout << std::hex << (t * TOTAL_TILE_SIZE + pr) << " : " - << ((upper << 4) + lower) << std::dec << std::endl; - } - } - for (int isf = 0; isf < TILE_SIZE / SF_BLOCK_SIZE; isf++) { - std::bfloat16_t sf = - std::bfloat16_t(4.0 * (float)rand() / (float)(RAND_MAX)); - std::uint16_t bits = *((std::uint16_t *)&sf); - std::int8_t upper = (std::int8_t)(bits >> 8); - std::int8_t lower = (std::int8_t)(bits & 0x00ff); - AVec[t * TOTAL_TILE_SIZE + TILE_SIZE / 2 + isf * 2] = lower; - AVec[t * TOTAL_TILE_SIZE + TILE_SIZE / 2 + isf * 2 + 1] = upper; - A_sf.push_back(sf); - if (verbosity >= 2) { - if (t == 0) - std::cout << std::hex - << (t * TOTAL_TILE_SIZE + TILE_SIZE / 2 + isf * 2) - << " and +1 :" << sf << std::dec << std::endl; - } - } - } - - memcpy(bufA, AVec.data(), (AVec.size() * sizeof(char))); - - if (verbosity >= 2) - std::cout << "Pre run values in " << std::hex << int(bufA[0]) << ", " - << int(bufA[1]) << ", " << int(bufA[2]) << std::dec << std::endl; - - void *bufInstr = bo_instr.map(); - memcpy(bufInstr, instr_v.data(), instr_v.size() * sizeof(int)); - - bo_instr.sync(XCL_BO_SYNC_BO_TO_DEVICE); - bo_in.sync(XCL_BO_SYNC_BO_TO_DEVICE); - - int sticky_errors = 0; - - unsigned num_iter = 16; - float npu_time_total = 0; - float npu_time_min = 9999999; - float npu_time_max = 0; - for (unsigned iter = 0; iter < num_iter; iter++) { - - if (verbosity >= 1) - std::cout << "Running Kernel.\n"; - - auto start = std::chrono::high_resolution_clock::now(); - - auto run = kernel(bo_instr, instr_v.size(), bo_in, bo_out); - run.wait(); - auto stop = std::chrono::high_resolution_clock::now(); - - bo_out.sync(XCL_BO_SYNC_BO_FROM_DEVICE); - - std::bfloat16_t *bufOut = bo_out.map(); - - int errors = 0; - - if (verbosity >= 2) { - std::cout << "First values in " << std::hex << int(bufA[0]) << ", " - << int(bufA[1]) << ", " << int(bufA[2]) << std::dec - << std::endl; - std::cout << "First sf values in " << std::hex << int(bufA[512]) << ", " - << int(bufA[513]) << ", " << int(bufA[514]) << ", " - << int(bufA[515]) << std::dec << std::endl; - std::cout << "First values out " << std::hex << bufOut[0] << ", " - << bufOut[1] << ", " << bufOut[2] << ", " << bufOut[3] - << std::dec << std::endl; - std::cout << "Second values out " << std::hex << bufOut[32] << ", " - << bufOut[33] << ", " << bufOut[34] << ", " << bufOut[35] - << std::dec << std::endl; - - std::cout << "Reference values " << std::hex << A_private[0] << ", " - << A_private[1] << std::dec << std::endl; - std::cout << "Reference sfs " << A_sf[0] << ", " << A_sf[1] - << std::endl; - } - float npu_time = - std::chrono::duration_cast(stop - start) - .count(); - - npu_time_total += npu_time; - npu_time_min = (npu_time < npu_time_min) ? npu_time : npu_time_min; - npu_time_max = (npu_time > npu_time_max) ? npu_time : npu_time_max; - - if (VERIFY) { - for (int t = 0; t < NUM_TILES; t++) { - for (int pr = 0; pr < TILE_SIZE; pr++) { - std::bfloat16_t sf = A_sf[t * SF_BLOCK_SIZE + pr / SF_BLOCK_SIZE]; - int val = (int)(A_private[t * TILE_SIZE + pr]); - if (val >= 8) - val = (val & 0x7) - 8; // Two's complement, but threes a crowd - std::bfloat16_t scaled = sf * val; - - std::bfloat16_t from_AIE = bufOut[(t * TILE_SIZE) + pr]; - - // These will not exactly match - // The default rounding mode in AIE2 is to truncate, so we will get - // off by one errors. - std::uint16_t from_AIE_raw = - *reinterpret_cast(&from_AIE); - std::uint16_t scaled_raw = - *reinterpret_cast(&scaled); - - std::bfloat16_t abs_diff = fabs(from_AIE - scaled); - if ((abs_diff / fabs(from_AIE)) > 0.01) { - std::cout << "Tile " << t << ":" << pr << " From AIE " - << std::setprecision(12) << from_AIE << " ref " - << std::setprecision(12) << scaled << " from " - << std::setprecision(12) << sf << "*" << std::hex << val - << std::dec << std::endl; - std::cout << "Tile " << t << ":" << pr << " From AIE " << std::hex - << from_AIE_raw << " ref " << scaled_raw << " from " - << *reinterpret_cast(&sf) << "*" << val - << std::dec << std::endl; - errors++; - } - } - } - } - - if (VERIFY && !errors) { - std::cout << iter << ": pass!\n"; - } else { - std::cout << iter << ": fail! " << errors << " errors\n"; - } - } - - std::cout << "Avg NPU exec time: " << npu_time_total / num_iter << "us." - << std::endl; - std::cout << "Min NPU matmul time: " << npu_time_min << "us." << std::endl; - std::cout << "Max NPU matmul time: " << npu_time_max << "us." << std::endl; - if (VERIFY && !sticky_errors) { - std::cout << "\nPASS!\n\n"; - return 0; - } else { - std::cout << "\nFAIL.\n\n"; - return 1; - } -} diff --git a/programming_examples/vision/README.md b/programming_examples/vision/README.md index a369ac9bbe..ab9649aa50 100644 --- a/programming_examples/vision/README.md +++ b/programming_examples/vision/README.md @@ -12,18 +12,10 @@ The vision pipeline reference designs show how complex vision pipelines can be constructed from basic vision kernel building blocks. Those building blocks can be found in [aie_kernels/aie2](../../aie_kernels/aie2) and contain example kernels written for AI engines in both scalar and unoptimized vector format. -## [Vision Pass Through](./vision_passthrough/) -The [Vision Pass Through pipeline design](./vision_passthrough/) consists of a simple pipeline with just one `passThrough` kernel. This pipeline's main purpose is to test whether the data movement works correctly. - -## [Color Detect](./color_detect/) - -The [Color Detect pipeline design](./color_detect/) consists of the following blocks arranged in a pipeline fashion for the detecting of 2 colors in a sequence of images : `rgba2hue`, `threshold`, `threshold`, `bitwiseOR`, `gray2rgba`, `bitwiseAND`. - -## [Edge Detect](./edge_detect/) - -The [Edge Detect pipeline design](./edge_detect/) consists of the following blocks arranged in a pipeline fashion for the detection of edges in a sequence of images: `rgba2gray`, `filter2D`, `threshold`, `gray2rgba`, `addWeighted`. - -## [Color Threshold](./color_threshold/) - -The [Color Threshold pipeline design](./color_threshold/) consists of 4 threshold blocks in separate tiles that process a different region of an input image. The results are then merged back together and sent to the output. \ No newline at end of file +| Design name | Data type | Description | +|-|-|-| +| [Vision Passthrough](../../programming_examples/vision/vision_passthrough/) | i8 | A simple pipeline with just one `passThrough` kernel. This pipeline mainly aims to test whether the data movement works correctly to copy a greyscale image. | +| [Color Detect](../../programming_examples/vision/color_detect/) | i32 | This multi-kernel, multi-core pipeline detects colors in an RGBA image. The design consists of the following blocks arranged in a pipeline fashion for the detecting of 2 colors in a sequence of images : `rgba2hue`, `threshold`, `threshold`, `bitwiseOR`, `gray2rgba`, `bitwiseAND`.| +| [Edge Detect](../../programming_examples/vision/edge_detect/) | i32 | A multi-kernel, multi-core pipeline that detects edges in an image and overlays the detection on the original image. The design consists of the following blocks arranged in a pipeline fashion for the detection of edges in a sequence of images: `rgba2gray`, `filter2D`, `threshold`, `gray2rgba`, `addWeighted`.| +| [Color Threshold](../../programming_examples/vision/color_threshold/) | i32 | A multi-core data-parallel implementation of color thresholding of a RGBA image. The design consists of 4 threshold blocks in separate tiles that process a different region of an input image. The results are then merged back together and sent to the output.| diff --git a/programming_guide/section-5/README.md b/programming_guide/section-5/README.md index 0e22fde08a..bfceae9e95 100644 --- a/programming_guide/section-5/README.md +++ b/programming_guide/section-5/README.md @@ -30,12 +30,14 @@ The [passthrough DMAs](../../programming_examples/basic/passthrough_dmas/) examp |-|-|-| | [Vector Scalar Add](../../programming_examples/basic/vector_scalar_add/) | i32 | Adds 1 to every element in vector | | [Vector Scalar Mul](../../programming_examples/basic/vector_scalar_mul/) | i32 | Returns a vector multiplied by a scale factor | +| [Vector Vector Add](../../programming_examples/basic/vector_vector_add/) | i32 | Returns a vector summed with another vector | +| [Vector Vector Multiply](../../programming_examples/basic/vector_scalar_mul/) | i32 | Returns a vector multiplied by a vector | | [Vector Reduce Add](../../programming_examples/basic/vector_reduce_add/) | bfloat16 | Returns the sum of all elements in a vector | | [Vector Reduce Max](../../programming_examples/basic/vector_reduce_max/) | bfloat16 | Returns the maximum of all elements in a vector | | [Vector Reduce Min](../../programming_examples/basic/vector_reduce_min/) | bfloat16 | Returns the minimum of all elements in a vector | | [Vector Exp](../../programming_examples/basic/vector_exp/) | bfloat16 | Returns a vector representing $e^x$ of the inputs | | [DMA Transpose](../../programming_examples/basic/dma_transpose/) | i32 | Transposes a matrix with the Shim DMA using `npu_dma_memcpy_nd` | -| [Single core GEMM](../../programming_examples/basic/matrix_multiplication/single_core) | bfloat16 | A single core matrix-matrix multiply | +| [Matrix Scalar Add](../../programming_examples/basic/matrix_scalar_add/) | i32 | Returns a matrix multiplied by a scalar | [Single core GEMM](../../programming_examples/basic/matrix_multiplication/single_core) | bfloat16 | A single core matrix-matrix multiply | | [Multi core GEMM](../../programming_examples/basic/matrix_multiplication/whole_array) | bfloat16 | A matrix-matrix multiply using 16 AIEs with operand broadcast. Uses a simple "accumulate in place" strategy | | [GEMV](../../programming_examples/basic/matrix_multiplication/matrix_vector) | bfloat16 | A vector-matrix multiply returning a vector