Skip to content

Commit

Permalink
Color detect (#777)
Browse files Browse the repository at this point in the history
  • Loading branch information
denolf authored Dec 20, 2023
1 parent e6831a1 commit 0fd15a2
Show file tree
Hide file tree
Showing 14 changed files with 1,624 additions and 2 deletions.
8 changes: 8 additions & 0 deletions lib/Dialect/AIE/IR/AIEDialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,14 @@ LogicalResult ObjectFifoAcquireOp::verify() {
"on non-consumer tile");
}

auto objFifoElem =
getObjectFifo().getElemType().cast<AIEObjectFifoType>().getElementType();
auto objFifoSubviewElem =
getResult().getType().cast<AIEObjectFifoSubviewType>().getElementType();
if (objFifoElem != objFifoSubviewElem)
return emitOpError(
"ObjectFifo element and ObjectFifoSubview element must match.\n");

return success();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# 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 Xilinx Inc.

# parameters
# -DBOOST_ROOT: Path to Boost install
# -DOpenCV_DIR: Path to OpenCV 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)

find_program(WSL NAMES powershell.exe)

if (NOT WSL)
set(BOOST_ROOT /usr/include/boost CACHE STRING "Path to Boost install")
set(OpenCV_DIR /usr/include/opencv4 CACHE STRING "Path to OpenCV 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(OpenCV_DIR C:/Technical/thirdParty/opencv/build CACHE STRING "Path to OpenCV 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/xrtIPUfromDLL CACHE STRING "Path to xrt_coreutil.lib")
endif ()

set(COLORDETECT_WIDTH 1920 CACHE STRING "image width")
set(COLORDETECT_HEIGHT 1080 CACHE STRING "image height")

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)
find_package(OpenCV REQUIRED)
message("opencv library paht: ${OpenCV_LIB_PATH}")
message("opencv libs: ${OpenCV_LIBS}")


add_executable(${currentTarget}
${CMAKE_CURRENT_SOURCE_DIR}/../../../utils/OpenCVUtils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../../utils/xrtUtils.cpp
test.cpp
)

target_compile_definitions(${currentTarget} PUBLIC
COLORDETECT_WIDTH=${COLORDETECT_WIDTH}
COLORDETECT_HEIGHT=${COLORDETECT_HEIGHT}
DISABLE_ABI_CHECK=1
)

target_include_directories (${currentTarget} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../../../utils
${XRT_INC_DIR}
${OpenCV_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)

target_link_directories(${currentTarget} PUBLIC
${XRT_LIB_DIR}
${OpenCV_LIB_PATH}
${Boost_LIBRARY_DIRS}
)

if (NOT WSL)
target_link_libraries(${currentTarget} PUBLIC
xrt_coreutil
${OpenCV_LIBS}
boost_program_options
boost_filesystem
)
else()
target_link_libraries(${currentTarget} PUBLIC
xrt_coreutil
${OpenCV_LIBS}
)
endif()
61 changes: 61 additions & 0 deletions reference_designs/ipu-xrt/vision_pipelines/color_detect/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
##===- 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

VPATH := ../vision_kernels

COLORDETECT_WIDTH = 1920
COLORDETECT_HEIGHT = 1080

targetname = colorDetect

#COLORDETECT_WIDTH = 64
#COLORDETECT_HEIGHT = 36

#COLORDETECT_WIDTH = 640
#COLORDETECT_HEIGHT = 480

all: build/final_${COLORDETECT_WIDTH}.xclbin

mlir: build/aie2_lineBased_8b_${COLORDETECT_WIDTH}.mlir

build/%.cc.o: %.cc
mkdir -p ${@D}
cd ${@D} && xchesscc_wrapper ${CHESSCCWRAP2_FLAGS} -DBIT_WIDTH=8 -c $(<:%=../%) -o ${@F}

build/combined_gray2rgba_addWeighted.a: build/gray2rgba.cc.o build/addWeighted.cc.o
mkdir -p ${@D}
ar rvs $@ $< $(word 2,$^)

build/aie2_lineBased_8b_${COLORDETECT_WIDTH}.mlir: aie2_colorDetect.py
mkdir -p ${@D}
python3 $< ${COLORDETECT_WIDTH} ${COLORDETECT_HEIGHT} > $@

build/final_${COLORDETECT_WIDTH}.xclbin: build/aie2_lineBased_8b_${COLORDETECT_WIDTH}.mlir build/rgba2gray.cc.o build/gray2rgba.cc.o build/filter2d.cc.o build/threshold.cc.o build/addWeighted.cc.o build/combined_gray2rgba_addWeighted.a
mkdir -p ${@D}
cd ${@D} && aiecc.py --aie-generate-cdo --aie-generate-ipu --no-compile-host \
--xclbin-name=${@F} --ipu-insts-name=insts.txt $(<:%=../%)

build/${targetname}.exe: test.cpp
mkdir -p ${@D}
rm -rf _build
mkdir -p _build
cd _build && ${powershell} cmake .. -DTARGET_NAME=${targetname} -DCOLORDETECT_WIDTH=${COLORDETECT_WIDTH} -DCOLORDETECT_HEIGHT=${COLORDETECT_HEIGHT}
cd _build && ${powershell} cmake --build . --config Release
ifeq "${powershell}" "powershell.exe"
cp _build/${targetname}.exe $@
else
cp _build/${targetname} $@
endif

run: build/${targetname}.exe build/final_${COLORDETECT_WIDTH}.xclbin build/insts.txt
${powershell} ./$< -x build/final_${COLORDETECT_WIDTH}.xclbin -i build/insts.txt -k MLIR_AIE

clean:
rm -rf build _build
38 changes: 38 additions & 0 deletions reference_designs/ipu-xrt/vision_pipelines/color_detect/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<!---//===- README.md --------------------------*- Markdown -*-===//
//
// 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.
//
//===----------------------------------------------------------------------===//-->

# <ins>Edge Detect</ins>

The Color Detect pipeline design consists of the following blocks arranged in a pipeline fashion for the detecting 2 colors in a sequence of images : `rgba2hue`, `threshold`, `threshold`, `bitwiseOR`, `gray2rgba`, `bitwiseAND`.

The pipeline is mapped onto a single column of the ipu device, with one Shim tile (0, 0), one Mem tile (0, 1) and four AIE compute tiles (0, 2) through (0, 5). As shown in the image below, the `rgba2hue`, and the two `threshold` kernels are each mapped onto one compute tile, while `bitwiseOR`, `gray2rgba` and `bitwiseAND` are mapped together on AIE tile (0, 5).

<p align="center">
<img
src="./color_detect_pipeline.png"
width="1150">
</p>

The data movement of this pipeline is described using the ObjectFifo (OF) primitive. Input data is brought into the array via the Shim tile. The data then needs to be broadcasted both to AIE tile (0, 2) and AIE tile (0, 5). However, tile (0, 5) has to wait for additional data from the other kernels before it can proceed with its execution, so in order to avoid any stalls in the broadcast, data for tile (0, 5) is instead buffered in the Mem tile. Because of the size of the data, the buffering couldn't directly be done in the smaller L1 memory module of tile (0, 5). This is described using two OFs, one for the broadcast to tile (0, 2) and the Mem tile, and one for the data movement between the Mem tile and tile (0, 5). The two OFs are linked to express that data from the first OF should be copied to the second OF implicitly through the Mem tile's DMA.

Starting from tile (0, 2) data is processed by each compute tile and the result is sent to the next tile. This is described by a series of one-to-one OFs. An OF also describes the broadcast from tile (0, 2) to tiles (0, 3) and (0, 4). As the three kernels `bitwiseOR`, `gray2rgba` and `bitwiseAND` are mapped together on AIE tile (0, 5), two OFs are also created with tile (0, 5) being both their source and destination to describe the data movement between the three kernels.

Finally, the output is sent from tile (0, 5) to the Mem tile and finally back to the output through the Shim tile.

To compile desing in Windows:
```
make
make colorDetect.exe
```

To run the design:
```
make run
```
Loading

0 comments on commit 0fd15a2

Please sign in to comment.