From 92fa41b16fd6799729ca3eb01d9c237e1f79136a Mon Sep 17 00:00:00 2001 From: AndraBisca Date: Wed, 16 Oct 2024 06:19:18 -0600 Subject: [PATCH 01/18] Add repeat support for compute tiles. --- include/aie/Dialect/AIE/IR/AIEOps.td | 4 +- lib/Dialect/AIE/IR/AIEDialect.cpp | 25 ++- .../AIEObjectFifoStatefulTransform.cpp | 48 +++-- .../compute_repeat}/CMakeLists.txt | 0 .../basic/repeat/compute_repeat/Makefile | 69 ++++++ .../compute_repeat}/README.md | 0 .../basic/repeat/compute_repeat/aie2.py | 70 ++++++ .../compute_repeat}/run_makefile.lit | 0 .../repeat/compute_repeat/simple_repeat.exe | Bin 0 -> 491456 bytes .../basic/repeat/compute_repeat/test.cpp | 199 ++++++++++++++++++ .../distribute_repeat}/CMakeLists.txt | 0 .../distribute_repeat/Makefile | 0 .../distribute_repeat/README.md | 0 .../distribute_repeat/aie2.py | 10 +- .../distribute_repeat}/run_makefile.lit | 0 .../distribute_repeat/test.cpp | 6 +- .../basic/repeat/simple_repeat/CMakeLists.txt | 75 +++++++ .../simple_repeat/Makefile | 0 .../basic/repeat/simple_repeat/README.md | 29 +++ .../simple_repeat/aie2.py | 8 +- .../repeat/simple_repeat/run_makefile.lit | 9 + .../simple_repeat/test.cpp | 8 +- python/dialects/aie.py | 4 +- ...st.mlir => memtile_repeat_count_test.mlir} | 6 +- .../repeat_count_test.mlir | 122 +++++++++++ test/python/objFifo.py | 2 +- 26 files changed, 649 insertions(+), 45 deletions(-) rename programming_examples/basic/{memtile_repeat/distribute_repeat => repeat/compute_repeat}/CMakeLists.txt (100%) create mode 100644 programming_examples/basic/repeat/compute_repeat/Makefile rename programming_examples/basic/{memtile_repeat/simple_repeat => repeat/compute_repeat}/README.md (100%) create mode 100644 programming_examples/basic/repeat/compute_repeat/aie2.py rename programming_examples/basic/{memtile_repeat/distribute_repeat => repeat/compute_repeat}/run_makefile.lit (100%) create mode 100755 programming_examples/basic/repeat/compute_repeat/simple_repeat.exe create mode 100644 programming_examples/basic/repeat/compute_repeat/test.cpp rename programming_examples/basic/{memtile_repeat/simple_repeat => repeat/distribute_repeat}/CMakeLists.txt (100%) rename programming_examples/basic/{memtile_repeat => repeat}/distribute_repeat/Makefile (100%) rename programming_examples/basic/{memtile_repeat => repeat}/distribute_repeat/README.md (100%) rename programming_examples/basic/{memtile_repeat => repeat}/distribute_repeat/aie2.py (94%) rename programming_examples/basic/{memtile_repeat/simple_repeat => repeat/distribute_repeat}/run_makefile.lit (100%) rename programming_examples/basic/{memtile_repeat => repeat}/distribute_repeat/test.cpp (98%) create mode 100644 programming_examples/basic/repeat/simple_repeat/CMakeLists.txt rename programming_examples/basic/{memtile_repeat => repeat}/simple_repeat/Makefile (100%) create mode 100644 programming_examples/basic/repeat/simple_repeat/README.md rename programming_examples/basic/{memtile_repeat => repeat}/simple_repeat/aie2.py (91%) create mode 100644 programming_examples/basic/repeat/simple_repeat/run_makefile.lit rename programming_examples/basic/{memtile_repeat => repeat}/simple_repeat/test.cpp (96%) rename test/objectFifo-stateful-transform/{memtile_repeat_test.mlir => memtile_repeat_count_test.mlir} (95%) create mode 100644 test/objectFifo-stateful-transform/repeat_count_test.mlir diff --git a/include/aie/Dialect/AIE/IR/AIEOps.td b/include/aie/Dialect/AIE/IR/AIEOps.td index 629bd99cfc..275b5a84c7 100644 --- a/include/aie/Dialect/AIE/IR/AIEOps.td +++ b/include/aie/Dialect/AIE/IR/AIEOps.td @@ -1680,8 +1680,8 @@ def AIE_ObjectFifoCreateOp: AIE_Op<"objectfifo", [HasParent<"DeviceOp">, Symbol] // via_shared_mem==0 means use producer tile's memory module // via_shared_mem==1 means use consumer tile's memory module OptionalAttr:$via_shared_mem, - // memtile_repeat==0 means "do it once" and don't repeat - OptionalAttr:$memtile_repeat + // repeat_count==1 means "do it once" + OptionalAttr:$repeat_count ); let assemblyFormat = [{ diff --git a/lib/Dialect/AIE/IR/AIEDialect.cpp b/lib/Dialect/AIE/IR/AIEDialect.cpp index d7fafb311a..24c5690eb6 100644 --- a/lib/Dialect/AIE/IR/AIEDialect.cpp +++ b/lib/Dialect/AIE/IR/AIEDialect.cpp @@ -494,10 +494,9 @@ LogicalResult ObjectFifoCreateOp::verify() { "`via_shared_mem` can only be used in 1-to-1 object FIFOs"); } - if (getMemtileRepeat().has_value()) { - if (!getProducerTileOp().isMemTile()) - return emitError("`memtile_repeat` can only be used with a mem tile " - "producer"); + if (getRepeatCount().has_value()) { + if (getProducerTileOp().isShimTile()) + return emitError("`repeat_count` unavailable for shim tiles"); } return success(); @@ -602,10 +601,18 @@ LogicalResult ObjectFifoLinkOp::verify() { return emitError("ObjectFifoLinkOp does not support 'join' and " "'distribute' at the same time"); - if (auto sharedTile = getOptionalSharedTile(); !sharedTile) + auto sharedTile = getOptionalSharedTile(); + if (!sharedTile) return emitError("ObjectFifoLinkOp must have a link point, i.e., a " "shared tile between objectFifos"); + TileOp tile = cast(sharedTile.value().getDefiningOp()); + if (!tile.isMemTile()) { + if (isJoin() || isDistribute()) + return emitError("ObjectFifoLinkOp join and distribute are " + "unavailable on compute or shim tiles"); + } + if (isJoin()) { if (getFifoIns().size() != getSrcOffsets().size()) return emitOpError("number of provided src offsets must be equal " @@ -643,8 +650,8 @@ LogicalResult ObjectFifoLinkOp::verify() { std::vector repeat_counts; for (auto fifoOut : getOutputObjectFifos()) { - if (fifoOut.getMemtileRepeat().has_value()) - repeat_counts.push_back(fifoOut.getMemtileRepeat().value()); + if (fifoOut.getRepeatCount().has_value()) + repeat_counts.push_back(fifoOut.getRepeatCount().value()); else repeat_counts.push_back(0); } @@ -761,8 +768,8 @@ std::vector ObjectFifoLinkOp::getDistributeTransferLengths() { std::optional ObjectFifoLinkOp::getRepeatCount() { for (auto fifoOut : getOutputObjectFifos()) - if (fifoOut.getMemtileRepeat().has_value()) - return {fifoOut.getMemtileRepeat().value()}; + if (fifoOut.getRepeatCount().has_value()) + return {fifoOut.getRepeatCount().value()}; return {}; } diff --git a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp index fdabf47423..318727126b 100644 --- a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp +++ b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp @@ -430,7 +430,7 @@ struct AIEObjectFifoStatefulTransformPass } if (linked) { if (linkOp->getRepeatCount().has_value()) - numElem *= linkOp->getRepeatCount().value() + 1; + numElem *= linkOp->getRepeatCount().value(); if (linkOp->isDistribute()) numElem *= linkOp->getFifoOuts().size(); else if (linkOp->isJoin()) @@ -541,12 +541,33 @@ struct AIEObjectFifoStatefulTransformPass auto elemType = llvm::cast(fifo.getElementType()); int len = elemType.getNumElements(); + // check for repeat count + int repeatCount = 1; + if (!dims.getValue().empty()) { + auto highestStride = dims.getValue().begin()->getStride() - 1; + if (highestStride == 0) { + repeatCount = dims.getValue().begin()->getSize(); + dims = AIE::BDDimLayoutArrayAttr::get(op->getContext(), + dims.getValue().drop_front(1)); + } + } + if (op.getRepeatCount().has_value()) + repeatCount = op.getRepeatCount().value(); + // search for the buffers/locks (based on if this objFifo has a link) ObjectFifoCreateOp target = op; if (std::optional linkOp = getOptionalLinkOp(op); - linkOp.has_value()) - if (objFifoLinks.find(linkOp.value()) != objFifoLinks.end()) + linkOp.has_value()) { + if (objFifoLinks.find(linkOp.value()) != objFifoLinks.end()) { target = objFifoLinks[linkOp.value()]; + if (target == op) { + if (linkOp->getRepeatCount().has_value()) { + acqNum *= linkOp->getRepeatCount().value(); + relNum *= linkOp->getRepeatCount().value(); + } + } + } + } // search for MemOp Operation *producerMem = nullptr; @@ -581,7 +602,7 @@ struct AIEObjectFifoStatefulTransformPass // create DMA channel builder.setInsertionPointToStart(dmaBlock); builder.create(builder.getUnknownLoc(), channelDir, - channelIndex, /*repeatCount*/ 0, bdBlock, + channelIndex, repeatCount - 1, bdBlock, endBlock); if (lastDmaBlock != nullptr) lastDmaBlock->getTerminator()->setSuccessor(dmaBlock, 1); @@ -700,7 +721,7 @@ struct AIEObjectFifoStatefulTransformPass int relNum = 1; // check for repeat count - int repeatCount = 0; + int repeatCount = 1; if (!dims.getValue().empty()) { auto highestStride = dims.getValue().begin()->getStride() - 1; if (highestStride == 0) { @@ -709,8 +730,8 @@ struct AIEObjectFifoStatefulTransformPass dims.getValue().drop_front(1)); } } - if (op.getMemtileRepeat().has_value()) - repeatCount = op.getMemtileRepeat().value(); + if (op.getRepeatCount().has_value()) + repeatCount = op.getRepeatCount().value(); // search for the buffers/locks (based on if this objFifo has a link) // identify size difference between input and output memrefs @@ -726,9 +747,8 @@ struct AIEObjectFifoStatefulTransformPass if (target == op) { if (linkOp->getRepeatCount().has_value()) { - // +1 for original data movement - acqNum *= linkOp->getRepeatCount().value() + 1; - relNum *= linkOp->getRepeatCount().value() + 1; + acqNum *= linkOp->getRepeatCount().value(); + relNum *= linkOp->getRepeatCount().value(); } } @@ -816,7 +836,7 @@ struct AIEObjectFifoStatefulTransformPass // create DMA channel builder.setInsertionPointToStart(dmaBlock); builder.create(builder.getUnknownLoc(), channelDir, - channelIndex, repeatCount, bdBlock, endBlock); + channelIndex, repeatCount - 1, bdBlock, endBlock); if (lastDmaBlock != nullptr) lastDmaBlock->getTerminator()->setSuccessor(dmaBlock, 1); @@ -1170,8 +1190,12 @@ struct AIEObjectFifoStatefulTransformPass // Only FIFOs using DMA are split into two ends; // skip in shared memory case - if (int share_direction = 0; !requiresDMAs(createOp, share_direction)) + if (int share_direction = 0; !requiresDMAs(createOp, share_direction)) { + if (createOp.getRepeatCount().has_value()) + createOp->emitWarning("Repeat unavailable for tiles sharing memory; " + "ignoring `repeat_count`"); continue; + } for (auto consumerTile : createOp.getConsumerTiles()) { auto consumerTileOp = dyn_cast(consumerTile.getDefiningOp()); diff --git a/programming_examples/basic/memtile_repeat/distribute_repeat/CMakeLists.txt b/programming_examples/basic/repeat/compute_repeat/CMakeLists.txt similarity index 100% rename from programming_examples/basic/memtile_repeat/distribute_repeat/CMakeLists.txt rename to programming_examples/basic/repeat/compute_repeat/CMakeLists.txt diff --git a/programming_examples/basic/repeat/compute_repeat/Makefile b/programming_examples/basic/repeat/compute_repeat/Makefile new file mode 100644 index 0000000000..afe3a3badc --- /dev/null +++ b/programming_examples/basic/repeat/compute_repeat/Makefile @@ -0,0 +1,69 @@ +##===- 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 +# +##===----------------------------------------------------------------------===## + +srcdir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) + +include ${srcdir}/../../../makefile-common + +all: build/final.xclbin build/insts.txt + +devicename ?= npu +targetname = compute_repeat +LENGTH ?= 4096 + +build/aie.mlir: ${srcdir}/aie2.py + mkdir -p ${@D} + python3 $< ${LENGTH} ${devicename} ${col} > $@ + +.PHONY: inst/insts.txt +inst/insts.txt: ${srcdir}/aie2.py + rm -rf inst + mkdir -p inst + python3 $< ${LENGTH} > inst/aie.mlir + pushd inst && aiecc.py --aie-only-generate-npu --npu-insts-name=insts.txt aie.mlir && popd + ${powershell} ./build/${targetname}.exe -x build/final.xclbin -i inst/insts.txt -k MLIR_AIE -l ${LENGTH} + +build/final.xclbin: build/aie.mlir + 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: ${srcdir}/test.cpp + rm -rf _build + mkdir -p _build + cd _build && ${powershell} cmake ${srcdir} -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 -l ${LENGTH} + +# Changing variables when we target VCK5000 +vck5000: devicename=xcvc1902 +vck5000: col=6 + +vck5000: build/aie.mlir + aiecc.py --link_against_hsa --host-target=x86_64-amd-linux-gnu build/aie.mlir \ + -I/opt/xaiengine/include \ + -I${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/include \ + -L/opt/xaiengine/lib \ + -L/lib/x86_64-linux-gnu/ \ + ${srcdir}/test_vck5000.cpp \ + ${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/src/test_library.cpp \ + -Wl,-R/opt/xaiengine/lib \ + -Wl,--whole-archive -Wl,--no-whole-archive -lstdc++ -ldl -lelf -o test.elf + +run_vck5000: + test.elf + +clean: + rm -rf build _build inst ${targetname}.exe diff --git a/programming_examples/basic/memtile_repeat/simple_repeat/README.md b/programming_examples/basic/repeat/compute_repeat/README.md similarity index 100% rename from programming_examples/basic/memtile_repeat/simple_repeat/README.md rename to programming_examples/basic/repeat/compute_repeat/README.md diff --git a/programming_examples/basic/repeat/compute_repeat/aie2.py b/programming_examples/basic/repeat/compute_repeat/aie2.py new file mode 100644 index 0000000000..ff325cf73f --- /dev/null +++ b/programming_examples/basic/repeat/compute_repeat/aie2.py @@ -0,0 +1,70 @@ +# repeat/compute_repeat/aie2.py -*- Python -*- +# +# 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 2024 Advanced Micro Devices, Inc. or its affiliates +import numpy as np +import sys + +from aie.dialects.aie import * +from aie.dialects.aiex import * +from aie.extras.context import mlir_mod_ctx + +N = 4096 +dev = AIEDevice.npu1_1col +col = 0 +repeat_count = 4 + +if len(sys.argv) > 1: + N = int(sys.argv[1]) +data_out_size = N * repeat_count + +if len(sys.argv) > 2: + if sys.argv[2] == "npu": + dev = AIEDevice.npu1_1col + elif sys.argv[2] == "xcvc1902": + dev = AIEDevice.xcvc1902 + else: + raise ValueError("[ERROR] Device name {} is unknown".format(sys.argv[2])) + +if len(sys.argv) > 3: + col = int(sys.argv[3]) + + +def compute_repeat(): + with mlir_mod_ctx() as ctx: + + @device(dev) + def device_body(): + tensor_ty = np.ndarray[(N,), np.dtype[np.int32]] + tensor_out_ty = np.ndarray[(data_out_size,), np.dtype[np.int32]] + + # Tile declarations + ShimTile = tile(col, 0) + ComputeTile = tile(col, 3) + + # AIE-array data movement with object fifos + of_in = object_fifo("in", ShimTile, ComputeTile, 1, tensor_ty) + of_out = object_fifo("out", ComputeTile, ShimTile, 1, tensor_ty) + of_out.set_repeat_count(repeat_count) + object_fifo_link(of_in, of_out) + + # To/from AIE-array data movement + @runtime_sequence(tensor_ty, tensor_ty, tensor_out_ty) + def sequence(A, B, C): + npu_dma_memcpy_nd(metadata=of_in, bd_id=1, mem=A, sizes=[1, 1, 1, N]) + npu_dma_memcpy_nd( + metadata=of_out, + bd_id=0, + mem=C, + sizes=[1, 1, 1, data_out_size], + ) + # of_out will only complete after of_in completes, so we just wait on of_out instead of both + dma_wait(of_out) + + print(ctx.module) + + +compute_repeat() diff --git a/programming_examples/basic/memtile_repeat/distribute_repeat/run_makefile.lit b/programming_examples/basic/repeat/compute_repeat/run_makefile.lit similarity index 100% rename from programming_examples/basic/memtile_repeat/distribute_repeat/run_makefile.lit rename to programming_examples/basic/repeat/compute_repeat/run_makefile.lit diff --git a/programming_examples/basic/repeat/compute_repeat/simple_repeat.exe b/programming_examples/basic/repeat/compute_repeat/simple_repeat.exe new file mode 100755 index 0000000000000000000000000000000000000000..d5aac73c00016c67769cc3c2decc9b2f7f4be55b GIT binary patch literal 491456 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

Y^xa&=BAexIQLu6jP(_ve5En7j@Uxl|;YH5^&K4 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 literal 0 HcmV?d00001 diff --git a/programming_examples/basic/repeat/compute_repeat/test.cpp b/programming_examples/basic/repeat/compute_repeat/test.cpp new file mode 100644 index 0000000000..305c6dbccd --- /dev/null +++ b/programming_examples/basic/repeat/compute_repeat/test.cpp @@ -0,0 +1,199 @@ +//===- 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) 2024, Advanced Micro Devices, Inc. +// +//===----------------------------------------------------------------------===// + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "xrt/xrt_bo.h" +#include "xrt/xrt_device.h" +#include "xrt/xrt_kernel.h" + +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"); + } + } +} + +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")( + "length,l", po::value()->default_value(4096), + "the length of the transfer in int32_t")( + "repeat,r", po::value()->default_value(4), + "the compute tile repeat count"); + 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 << std::endl; + return 1; + } + } catch (const std::exception &ex) { + std::cerr << ex.what() << "\n\n"; + std::cerr << "Usage:\n" << desc << std::endl; + 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() << std::endl; + + int N = vm["length"].as(); + if ((N % 1024)) { + std::cerr << "Length must be a multiple of 1024." << std::endl; + return 1; + } + int repeat_count = vm["repeat"].as(); + + // 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() + << std::endl; + auto xclbin = xrt::xclbin(vm["xclbin"].as()); + + if (verbosity >= 1) + std::cout << "Kernel opcode: " << vm["kernel"].as() + << std::endl; + 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." << std::endl; + xrt::hw_context context(device, xclbin.get_uuid()); + + // get a kernel handle + if (verbosity >= 1) + std::cout << "Getting handle to kernel:" << kernelName << std::endl; + auto kernel = xrt::kernel(context, kernelName); + + auto bo_instr = xrt::bo(device, instr_v.size() * sizeof(int), + XCL_BO_FLAGS_CACHEABLE, kernel.group_id(1)); + auto bo_inA = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, + kernel.group_id(3)); + auto bo_inB = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, + kernel.group_id(4)); + auto bo_out = xrt::bo(device, N * repeat_count * sizeof(int32_t), + XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(5)); + + if (verbosity >= 1) + std::cout << "Writing data into buffer objects." << std::endl; + + int32_t *bufInA = bo_inA.map(); + std::vector srcVecA; + for (int i = 0; i < N; i++) + srcVecA.push_back(i + 1); + memcpy(bufInA, srcVecA.data(), (srcVecA.size() * sizeof(uint32_t))); + + 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_inA.sync(XCL_BO_SYNC_BO_TO_DEVICE); + + if (verbosity >= 1) + std::cout << "Running Kernel." << std::endl; + unsigned int opcode = 3; + auto run = kernel(opcode, bo_instr, instr_v.size(), bo_inA, bo_inB, bo_out); + run.wait(); + + bo_out.sync(XCL_BO_SYNC_BO_FROM_DEVICE); + + uint32_t *bufOut = bo_out.map(); + + int errors = 0; + for (uint32_t i = 0; i < N * repeat_count; i++) { + uint32_t ref = (i % N) + 1; + if (*(bufOut + i) != ref) { + std::cout << "error at index[" << i << "]: expected " << ref << " got " + << *(bufOut + i) << std::endl; + errors++; + } + } + + if (!errors) { + std::cout << std::endl << "PASS!" << std::endl << std::endl; + return 0; + } else { + std::cout << std::endl + << errors << " mismatches." << std::endl + << std::endl; + std::cout << std::endl << "fail." << std::endl << std::endl; + return 1; + } +} diff --git a/programming_examples/basic/memtile_repeat/simple_repeat/CMakeLists.txt b/programming_examples/basic/repeat/distribute_repeat/CMakeLists.txt similarity index 100% rename from programming_examples/basic/memtile_repeat/simple_repeat/CMakeLists.txt rename to programming_examples/basic/repeat/distribute_repeat/CMakeLists.txt diff --git a/programming_examples/basic/memtile_repeat/distribute_repeat/Makefile b/programming_examples/basic/repeat/distribute_repeat/Makefile similarity index 100% rename from programming_examples/basic/memtile_repeat/distribute_repeat/Makefile rename to programming_examples/basic/repeat/distribute_repeat/Makefile diff --git a/programming_examples/basic/memtile_repeat/distribute_repeat/README.md b/programming_examples/basic/repeat/distribute_repeat/README.md similarity index 100% rename from programming_examples/basic/memtile_repeat/distribute_repeat/README.md rename to programming_examples/basic/repeat/distribute_repeat/README.md diff --git a/programming_examples/basic/memtile_repeat/distribute_repeat/aie2.py b/programming_examples/basic/repeat/distribute_repeat/aie2.py similarity index 94% rename from programming_examples/basic/memtile_repeat/distribute_repeat/aie2.py rename to programming_examples/basic/repeat/distribute_repeat/aie2.py index 18af2c1f18..10203f41dd 100644 --- a/programming_examples/basic/memtile_repeat/distribute_repeat/aie2.py +++ b/programming_examples/basic/repeat/distribute_repeat/aie2.py @@ -1,4 +1,4 @@ -# memtile_repeat/distribute_repeat/aie2.py -*- Python -*- +# repeat/distribute_repeat/aie2.py -*- Python -*- # # This file is licensed under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. @@ -32,8 +32,8 @@ col = int(sys.argv[3]) assert N % 2 == 0, "N must be even" -repeat_counter = 6 -out_size = N * (repeat_counter + 1) +repeat_counter = 7 +out_size = N * repeat_counter def distribute_repeat(): @@ -56,8 +56,8 @@ def device_body(): of_in = object_fifo("in", ShimTile, MemTile, 1, in_ty) of_in2 = object_fifo("in2", MemTile, ComputeTile2, 2, half_ty) of_in3 = object_fifo("in3", MemTile, ComputeTile3, 2, half_ty) - of_in2.set_memtile_repeat(repeat_counter) - of_in3.set_memtile_repeat(repeat_counter) + of_in2.set_repeat_count(repeat_counter) + of_in3.set_repeat_count(repeat_counter) object_fifo_link(of_in, [of_in2, of_in3], [], [0, N // 2]) of_out2 = object_fifo("out2", ComputeTile2, MemTile, 2, half_ty) diff --git a/programming_examples/basic/memtile_repeat/simple_repeat/run_makefile.lit b/programming_examples/basic/repeat/distribute_repeat/run_makefile.lit similarity index 100% rename from programming_examples/basic/memtile_repeat/simple_repeat/run_makefile.lit rename to programming_examples/basic/repeat/distribute_repeat/run_makefile.lit diff --git a/programming_examples/basic/memtile_repeat/distribute_repeat/test.cpp b/programming_examples/basic/repeat/distribute_repeat/test.cpp similarity index 98% rename from programming_examples/basic/memtile_repeat/distribute_repeat/test.cpp rename to programming_examples/basic/repeat/distribute_repeat/test.cpp index ce3cdd2a0a..e1d0ebb91f 100644 --- a/programming_examples/basic/memtile_repeat/distribute_repeat/test.cpp +++ b/programming_examples/basic/repeat/distribute_repeat/test.cpp @@ -4,7 +4,7 @@ // 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. +// Copyright (C) 2024, Advanced Micro Devices, Inc. // //===----------------------------------------------------------------------===// @@ -96,8 +96,8 @@ int main(int argc, const char *argv[]) { std::cerr << "Length must be a multiple of 2." << std::endl; return 1; } - int repeat_count = 6; - int out_size = N * (repeat_count + 1); + int repeat_count = 7; + int out_size = N * repeat_count; // Start the XRT test code // Get a device handle diff --git a/programming_examples/basic/repeat/simple_repeat/CMakeLists.txt b/programming_examples/basic/repeat/simple_repeat/CMakeLists.txt new file mode 100644 index 0000000000..5da03ef2b2 --- /dev/null +++ b/programming_examples/basic/repeat/simple_repeat/CMakeLists.txt @@ -0,0 +1,75 @@ +# 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 proj_${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/basic/memtile_repeat/simple_repeat/Makefile b/programming_examples/basic/repeat/simple_repeat/Makefile similarity index 100% rename from programming_examples/basic/memtile_repeat/simple_repeat/Makefile rename to programming_examples/basic/repeat/simple_repeat/Makefile diff --git a/programming_examples/basic/repeat/simple_repeat/README.md b/programming_examples/basic/repeat/simple_repeat/README.md new file mode 100644 index 0000000000..46ae72db7a --- /dev/null +++ b/programming_examples/basic/repeat/simple_repeat/README.md @@ -0,0 +1,29 @@ + + +# Simple Repeat + +This reference design can be run on a Ryzen™ AI NPU. + +In the [design](./aie2.py) data is brought from external memory via the `ShimTile` to the `MemTile` and back by using an implicit copy via the compute tile's Data Movement Accelerator (DMA). Furthermore, the input data is repeated by the `MemTile` three times which results in the output data consisting of four instances of the input data. + +The implicit copy is performed using the `object_fifo_link` operation that specifies how input data arriving via `of_in` should be sent further via `of_out` by specifically leveraging the compute tile's DMA. This operation and its functionality are described in more depth in [Section-2b](../../../programming_guide/section-2/section-2b/03_Link_Distribute_Join/README.md#object-fifo-link) of the programming guide. + +The repeat count is specified as follows: +```python +of_out.set_memtile_repeat(memtile_repeat_count) +``` +Specifically, the instruction above specifies the number of repetitions that the producer side of the `of_out` objectfifo should do. + +To compile and run the design for NPU: +``` +make +make run +``` diff --git a/programming_examples/basic/memtile_repeat/simple_repeat/aie2.py b/programming_examples/basic/repeat/simple_repeat/aie2.py similarity index 91% rename from programming_examples/basic/memtile_repeat/simple_repeat/aie2.py rename to programming_examples/basic/repeat/simple_repeat/aie2.py index 9ac32df317..718b7256ff 100644 --- a/programming_examples/basic/memtile_repeat/simple_repeat/aie2.py +++ b/programming_examples/basic/repeat/simple_repeat/aie2.py @@ -1,4 +1,4 @@ -# memtile_repeat/simple_repeat/aie2.py -*- Python -*- +# repeat/simple_repeat/aie2.py -*- Python -*- # # This file is licensed under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. @@ -15,11 +15,11 @@ N = 4096 dev = AIEDevice.npu1_1col col = 0 -memtile_repeat_count = 3 +memtile_repeat_count = 4 if len(sys.argv) > 1: N = int(sys.argv[1]) -data_out_size = N * (memtile_repeat_count + 1) +data_out_size = N * memtile_repeat_count if len(sys.argv) > 2: if sys.argv[2] == "npu": @@ -48,7 +48,7 @@ def device_body(): # AIE-array data movement with object fifos of_in = object_fifo("in", ShimTile, MemTile, 1, tensor_ty) of_out = object_fifo("out", MemTile, ShimTile, 1, tensor_ty) - of_out.set_memtile_repeat(memtile_repeat_count) + of_out.set_repeat_count(memtile_repeat_count) object_fifo_link(of_in, of_out) # To/from AIE-array data movement diff --git a/programming_examples/basic/repeat/simple_repeat/run_makefile.lit b/programming_examples/basic/repeat/simple_repeat/run_makefile.lit new file mode 100644 index 0000000000..6875524001 --- /dev/null +++ b/programming_examples/basic/repeat/simple_repeat/run_makefile.lit @@ -0,0 +1,9 @@ +// (c) Copyright 2024 Advanced Micro Devices, Inc. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// REQUIRES: ryzen_ai, chess +// +// RUN: make -f %S/Makefile clean +// RUN: make -f %S/Makefile +// RUN: %run_on_npu make -f %S/Makefile run | FileCheck %s +// CHECK: PASS! diff --git a/programming_examples/basic/memtile_repeat/simple_repeat/test.cpp b/programming_examples/basic/repeat/simple_repeat/test.cpp similarity index 96% rename from programming_examples/basic/memtile_repeat/simple_repeat/test.cpp rename to programming_examples/basic/repeat/simple_repeat/test.cpp index 2cdbc75097..72296936c0 100644 --- a/programming_examples/basic/memtile_repeat/simple_repeat/test.cpp +++ b/programming_examples/basic/repeat/simple_repeat/test.cpp @@ -4,7 +4,7 @@ // 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. +// Copyright (C) 2024, Advanced Micro Devices, Inc. // //===----------------------------------------------------------------------===// @@ -65,7 +65,7 @@ int main(int argc, const char *argv[]) { "path of file containing userspace instructions to be sent to the LX6")( "length,l", po::value()->default_value(4096), "the length of the transfer in int32_t")( - "repeat,r", po::value()->default_value(3), + "repeat,r", po::value()->default_value(4), "the memtile repeat count"); po::variables_map vm; @@ -148,7 +148,7 @@ int main(int argc, const char *argv[]) { kernel.group_id(3)); auto bo_inB = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(4)); - auto bo_out = xrt::bo(device, N * (repeat_count + 1) * sizeof(int32_t), + auto bo_out = xrt::bo(device, N * repeat_count * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(5)); if (verbosity >= 1) @@ -177,7 +177,7 @@ int main(int argc, const char *argv[]) { uint32_t *bufOut = bo_out.map(); int errors = 0; - for (uint32_t i = 0; i < N * (repeat_count + 1); i++) { + for (uint32_t i = 0; i < N * repeat_count; i++) { uint32_t ref = (i % N) + 1; if (*(bufOut + i) != ref) { std::cout << "error at index[" << i << "]: expected " << ref << " got " diff --git a/python/dialects/aie.py b/python/dialects/aie.py index a18701fefe..31bf95fab4 100644 --- a/python/dialects/aie.py +++ b/python/dialects/aie.py @@ -426,9 +426,9 @@ def set_via_shared_mem(self, port): int_num = IntegerAttr.get(T.i32(), num) self.attributes["via_shared_mem"] = int_num - def set_memtile_repeat(self, num): + def set_repeat_count(self, num): int_num = IntegerAttr.get(T.i32(), num) - self.attributes["memtile_repeat"] = int_num + self.attributes["repeat_count"] = int_num # Create an aie objectFifo_link between input and output objectFifos. diff --git a/test/objectFifo-stateful-transform/memtile_repeat_test.mlir b/test/objectFifo-stateful-transform/memtile_repeat_count_test.mlir similarity index 95% rename from test/objectFifo-stateful-transform/memtile_repeat_test.mlir rename to test/objectFifo-stateful-transform/memtile_repeat_count_test.mlir index f1533c47f8..c96c4f2e7c 100644 --- a/test/objectFifo-stateful-transform/memtile_repeat_test.mlir +++ b/test/objectFifo-stateful-transform/memtile_repeat_count_test.mlir @@ -1,4 +1,4 @@ -//===- memtile_repeat_test.mlir --------------------------------*- MLIR -*-===// +//===- memtile_repeat_count_test.mlir ---------------------------*- MLIR -*-===// // // This file is licensed under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -120,8 +120,8 @@ module @memtileRepeat { %tile33 = aie.tile(3, 3) aie.objectfifo @of0 (%tile10, {%tile11}, 2 : i32) : !aie.objectfifo> - aie.objectfifo @of1 (%tile11, {%tile12}, 2 : i32) {memtile_repeat = 2 : i32} : !aie.objectfifo> - aie.objectfifo @of2 (%tile11, {%tile33}, 2 : i32) {memtile_repeat = 2 : i32} : !aie.objectfifo> + aie.objectfifo @of1 (%tile11, {%tile12}, 2 : i32) {repeat_count = 3 : i32} : !aie.objectfifo> + aie.objectfifo @of2 (%tile11, {%tile33}, 2 : i32) {repeat_count = 3 : i32} : !aie.objectfifo> aie.objectfifo.link [@of0] -> [@of1, @of2] ([] [0, 16]) } } diff --git a/test/objectFifo-stateful-transform/repeat_count_test.mlir b/test/objectFifo-stateful-transform/repeat_count_test.mlir new file mode 100644 index 0000000000..7393bcf899 --- /dev/null +++ b/test/objectFifo-stateful-transform/repeat_count_test.mlir @@ -0,0 +1,122 @@ +//===- repeat_count_test.mlir -----------------------------------*- MLIR -*-===// +// +// 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) 2024, Advanced Micro Devices, Inc. +// +//===----------------------------------------------------------------------===// + +// RUN: aie-opt --aie-objectFifo-stateful-transform %s | FileCheck %s + +// CHECK: module @repeatCount { +// CHECK: aie.device(npu1) { +// CHECK: memref.global "public" @of2_cons : memref<16xi32> +// CHECK: memref.global "public" @of2 : memref<16xi32> +// CHECK: memref.global "public" @of1_cons : memref<16xi32> +// CHECK: memref.global "public" @of1 : memref<16xi32> +// CHECK: memref.global "public" @of0_cons : memref<32xi32> +// CHECK: memref.global "public" @of0 : memref<32xi32> +// CHECK: %tile_1_0 = aie.tile(1, 0) +// CHECK: %tile_1_1 = aie.tile(1, 1) +// CHECK: %tile_1_2 = aie.tile(1, 2) +// CHECK: %tile_3_3 = aie.tile(3, 3) +// CHECK: %of2_cons_buff_0 = aie.buffer(%tile_3_3) {sym_name = "of2_cons_buff_0"} : memref<16xi32> +// CHECK: %of2_cons_buff_1 = aie.buffer(%tile_3_3) {sym_name = "of2_cons_buff_1"} : memref<16xi32> +// CHECK: %of2_cons_prod_lock = aie.lock(%tile_3_3, 0) {init = 2 : i32, sym_name = "of2_cons_prod_lock"} +// CHECK: %of2_cons_cons_lock = aie.lock(%tile_3_3, 1) {init = 0 : i32, sym_name = "of2_cons_cons_lock"} +// CHECK: %of1_cons_buff_0 = aie.buffer(%tile_1_2) {sym_name = "of1_cons_buff_0"} : memref<16xi32> +// CHECK: %of1_cons_buff_1 = aie.buffer(%tile_1_2) {sym_name = "of1_cons_buff_1"} : memref<16xi32> +// CHECK: %of1_cons_prod_lock = aie.lock(%tile_1_2, 0) {init = 2 : i32, sym_name = "of1_cons_prod_lock"} +// CHECK: %of1_cons_cons_lock = aie.lock(%tile_1_2, 1) {init = 0 : i32, sym_name = "of1_cons_cons_lock"} +// CHECK: %of0_cons_buff_0 = aie.buffer(%tile_1_1) {sym_name = "of0_cons_buff_0"} : memref<32xi32> +// CHECK: %of0_cons_buff_1 = aie.buffer(%tile_1_1) {sym_name = "of0_cons_buff_1"} : memref<32xi32> +// CHECK: %of0_cons_prod_lock = aie.lock(%tile_1_1, 0) {init = 12 : i32, sym_name = "of0_cons_prod_lock"} +// CHECK: %of0_cons_cons_lock = aie.lock(%tile_1_1, 1) {init = 0 : i32, sym_name = "of0_cons_cons_lock"} +// CHECK: %of0_prod_lock = aie.lock(%tile_1_0, 0) {init = 1 : i32, sym_name = "of0_prod_lock"} +// CHECK: %of0_cons_lock = aie.lock(%tile_1_0, 1) {init = 0 : i32, sym_name = "of0_cons_lock"} +// CHECK: aie.flow(%tile_1_0, DMA : 0, %tile_1_1, DMA : 0) +// CHECK: aie.flow(%tile_1_1, DMA : 0, %tile_1_2, DMA : 0) +// CHECK: aie.flow(%tile_1_1, DMA : 1, %tile_3_3, DMA : 0) +// CHECK: aie.shim_dma_allocation @of0(MM2S, 0, 1) +// CHECK: %memtile_dma_1_1 = aie.memtile_dma(%tile_1_1) { +// CHECK: %0 = aie.dma_start(S2MM, 0, ^bb1, ^bb3) +// CHECK: ^bb1: // 2 preds: ^bb0, ^bb2 +// CHECK: aie.use_lock(%of0_cons_prod_lock, AcquireGreaterEqual, 6) +// CHECK: aie.dma_bd(%of0_cons_buff_0 : memref<32xi32>, 0, 32) +// CHECK: aie.use_lock(%of0_cons_cons_lock, Release, 6) +// CHECK: aie.next_bd ^bb2 +// CHECK: ^bb2: // pred: ^bb1 +// CHECK: aie.use_lock(%of0_cons_prod_lock, AcquireGreaterEqual, 6) +// CHECK: aie.dma_bd(%of0_cons_buff_1 : memref<32xi32>, 0, 32) +// CHECK: aie.use_lock(%of0_cons_cons_lock, Release, 6) +// CHECK: aie.next_bd ^bb1 +// CHECK: ^bb3: // pred: ^bb0 +// CHECK: %1 = aie.dma_start(MM2S, 0, ^bb4, ^bb6, repeat_count = 2) +// CHECK: ^bb4: // 2 preds: ^bb3, ^bb5 +// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of0_cons_buff_0 : memref<32xi32>, 0, 16) +// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) +// CHECK: aie.next_bd ^bb5 +// CHECK: ^bb5: // pred: ^bb4 +// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of0_cons_buff_1 : memref<32xi32>, 0, 16) +// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) +// CHECK: aie.next_bd ^bb4 +// CHECK: ^bb6: // pred: ^bb3 +// CHECK: %2 = aie.dma_start(MM2S, 1, ^bb7, ^bb9, repeat_count = 2) +// CHECK: ^bb7: // 2 preds: ^bb6, ^bb8 +// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of0_cons_buff_0 : memref<32xi32>, 16, 16) +// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) +// CHECK: aie.next_bd ^bb8 +// CHECK: ^bb8: // pred: ^bb7 +// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of0_cons_buff_1 : memref<32xi32>, 16, 16) +// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) +// CHECK: aie.next_bd ^bb7 +// CHECK: ^bb9: // pred: ^bb6 +// CHECK: aie.end +// CHECK: } +// CHECK: %mem_1_2 = aie.mem(%tile_1_2) { +// CHECK: %0 = aie.dma_start(S2MM, 0, ^bb1, ^bb3) +// CHECK: ^bb1: // 2 preds: ^bb0, ^bb2 +// CHECK: aie.use_lock(%of1_cons_prod_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of1_cons_buff_0 : memref<16xi32>, 0, 16) +// CHECK: aie.use_lock(%of1_cons_cons_lock, Release, 1) +// CHECK: aie.next_bd ^bb2 +// CHECK: ^bb2: // pred: ^bb1 +// CHECK: aie.use_lock(%of1_cons_prod_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of1_cons_buff_1 : memref<16xi32>, 0, 16) +// CHECK: aie.use_lock(%of1_cons_cons_lock, Release, 1) +// CHECK: aie.next_bd ^bb1 +// CHECK: ^bb3: // pred: ^bb0 +// CHECK: aie.end +// CHECK: } +// CHECK: %mem_3_3 = aie.mem(%tile_3_3) { +// CHECK: %0 = aie.dma_start(S2MM, 0, ^bb1, ^bb3) +// CHECK: ^bb1: // 2 preds: ^bb0, ^bb2 +// CHECK: aie.use_lock(%of2_cons_prod_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of2_cons_buff_0 : memref<16xi32>, 0, 16) +// CHECK: aie.use_lock(%of2_cons_cons_lock, Release, 1) +// CHECK: aie.next_bd ^bb2 +// CHECK: ^bb2: // pred: ^bb1 +// CHECK: aie.use_lock(%of2_cons_prod_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of2_cons_buff_1 : memref<16xi32>, 0, 16) +// CHECK: aie.use_lock(%of2_cons_cons_lock, Release, 1) +// CHECK: aie.next_bd ^bb1 +// CHECK: ^bb3: // pred: ^bb0 +// CHECK: aie.end +// CHECK: } +// CHECK: } +// CHECK: } + +module @repeatCount { + aie.device(npu1) { + %tile12 = aie.tile(1, 2) + %tile13 = aie.tile(1, 3) + + aie.objectfifo @of (%tile12, {%tile13}, 2 : i32) {repeat_count = 3 : i32} : !aie.objectfifo> + } +} diff --git a/test/python/objFifo.py b/test/python/objFifo.py index 434b3e9f07..0d2266c746 100644 --- a/test/python/objFifo.py +++ b/test/python/objFifo.py @@ -52,7 +52,7 @@ def objFifo_example(): of0 = object_fifo("of0", S, T_, 2, np.ndarray[(256,), np.dtype[np.int32]]) of1 = object_fifo("of1", M, T_, 2, np.ndarray[(256,), np.dtype[np.int32]]) - of1.set_memtile_repeat(4) + of1.set_repeat_count(4) of2 = object_fifo("of2", T_, C_, 2, np.ndarray[(256,), np.dtype[np.int32]]) of2.set_via_shared_mem(ObjectFifoPort.Consume) From d8c177dac26e107858aab0d94bac9bde17549c04 Mon Sep 17 00:00:00 2001 From: AndraBisca Date: Wed, 16 Oct 2024 06:27:50 -0600 Subject: [PATCH 02/18] Add test --- .../repeat_count_test.mlir | 86 +++++-------------- 1 file changed, 20 insertions(+), 66 deletions(-) diff --git a/test/objectFifo-stateful-transform/repeat_count_test.mlir b/test/objectFifo-stateful-transform/repeat_count_test.mlir index 7393bcf899..bdc8176aa7 100644 --- a/test/objectFifo-stateful-transform/repeat_count_test.mlir +++ b/test/objectFifo-stateful-transform/repeat_count_test.mlir @@ -14,82 +14,34 @@ // CHECK: aie.device(npu1) { // CHECK: memref.global "public" @of2_cons : memref<16xi32> // CHECK: memref.global "public" @of2 : memref<16xi32> -// CHECK: memref.global "public" @of1_cons : memref<16xi32> // CHECK: memref.global "public" @of1 : memref<16xi32> -// CHECK: memref.global "public" @of0_cons : memref<32xi32> -// CHECK: memref.global "public" @of0 : memref<32xi32> -// CHECK: %tile_1_0 = aie.tile(1, 0) -// CHECK: %tile_1_1 = aie.tile(1, 1) // CHECK: %tile_1_2 = aie.tile(1, 2) +// CHECK: %tile_1_3 = aie.tile(1, 3) // CHECK: %tile_3_3 = aie.tile(3, 3) // CHECK: %of2_cons_buff_0 = aie.buffer(%tile_3_3) {sym_name = "of2_cons_buff_0"} : memref<16xi32> // CHECK: %of2_cons_buff_1 = aie.buffer(%tile_3_3) {sym_name = "of2_cons_buff_1"} : memref<16xi32> // CHECK: %of2_cons_prod_lock = aie.lock(%tile_3_3, 0) {init = 2 : i32, sym_name = "of2_cons_prod_lock"} // CHECK: %of2_cons_cons_lock = aie.lock(%tile_3_3, 1) {init = 0 : i32, sym_name = "of2_cons_cons_lock"} -// CHECK: %of1_cons_buff_0 = aie.buffer(%tile_1_2) {sym_name = "of1_cons_buff_0"} : memref<16xi32> -// CHECK: %of1_cons_buff_1 = aie.buffer(%tile_1_2) {sym_name = "of1_cons_buff_1"} : memref<16xi32> -// CHECK: %of1_cons_prod_lock = aie.lock(%tile_1_2, 0) {init = 2 : i32, sym_name = "of1_cons_prod_lock"} -// CHECK: %of1_cons_cons_lock = aie.lock(%tile_1_2, 1) {init = 0 : i32, sym_name = "of1_cons_cons_lock"} -// CHECK: %of0_cons_buff_0 = aie.buffer(%tile_1_1) {sym_name = "of0_cons_buff_0"} : memref<32xi32> -// CHECK: %of0_cons_buff_1 = aie.buffer(%tile_1_1) {sym_name = "of0_cons_buff_1"} : memref<32xi32> -// CHECK: %of0_cons_prod_lock = aie.lock(%tile_1_1, 0) {init = 12 : i32, sym_name = "of0_cons_prod_lock"} -// CHECK: %of0_cons_cons_lock = aie.lock(%tile_1_1, 1) {init = 0 : i32, sym_name = "of0_cons_cons_lock"} -// CHECK: %of0_prod_lock = aie.lock(%tile_1_0, 0) {init = 1 : i32, sym_name = "of0_prod_lock"} -// CHECK: %of0_cons_lock = aie.lock(%tile_1_0, 1) {init = 0 : i32, sym_name = "of0_cons_lock"} -// CHECK: aie.flow(%tile_1_0, DMA : 0, %tile_1_1, DMA : 0) -// CHECK: aie.flow(%tile_1_1, DMA : 0, %tile_1_2, DMA : 0) -// CHECK: aie.flow(%tile_1_1, DMA : 1, %tile_3_3, DMA : 0) -// CHECK: aie.shim_dma_allocation @of0(MM2S, 0, 1) -// CHECK: %memtile_dma_1_1 = aie.memtile_dma(%tile_1_1) { -// CHECK: %0 = aie.dma_start(S2MM, 0, ^bb1, ^bb3) -// CHECK: ^bb1: // 2 preds: ^bb0, ^bb2 -// CHECK: aie.use_lock(%of0_cons_prod_lock, AcquireGreaterEqual, 6) -// CHECK: aie.dma_bd(%of0_cons_buff_0 : memref<32xi32>, 0, 32) -// CHECK: aie.use_lock(%of0_cons_cons_lock, Release, 6) -// CHECK: aie.next_bd ^bb2 -// CHECK: ^bb2: // pred: ^bb1 -// CHECK: aie.use_lock(%of0_cons_prod_lock, AcquireGreaterEqual, 6) -// CHECK: aie.dma_bd(%of0_cons_buff_1 : memref<32xi32>, 0, 32) -// CHECK: aie.use_lock(%of0_cons_cons_lock, Release, 6) -// CHECK: aie.next_bd ^bb1 -// CHECK: ^bb3: // pred: ^bb0 -// CHECK: %1 = aie.dma_start(MM2S, 0, ^bb4, ^bb6, repeat_count = 2) -// CHECK: ^bb4: // 2 preds: ^bb3, ^bb5 -// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) -// CHECK: aie.dma_bd(%of0_cons_buff_0 : memref<32xi32>, 0, 16) -// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) -// CHECK: aie.next_bd ^bb5 -// CHECK: ^bb5: // pred: ^bb4 -// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) -// CHECK: aie.dma_bd(%of0_cons_buff_1 : memref<32xi32>, 0, 16) -// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) -// CHECK: aie.next_bd ^bb4 -// CHECK: ^bb6: // pred: ^bb3 -// CHECK: %2 = aie.dma_start(MM2S, 1, ^bb7, ^bb9, repeat_count = 2) -// CHECK: ^bb7: // 2 preds: ^bb6, ^bb8 -// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) -// CHECK: aie.dma_bd(%of0_cons_buff_0 : memref<32xi32>, 16, 16) -// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) -// CHECK: aie.next_bd ^bb8 -// CHECK: ^bb8: // pred: ^bb7 -// CHECK: aie.use_lock(%of0_cons_cons_lock, AcquireGreaterEqual, 1) -// CHECK: aie.dma_bd(%of0_cons_buff_1 : memref<32xi32>, 16, 16) -// CHECK: aie.use_lock(%of0_cons_prod_lock, Release, 1) -// CHECK: aie.next_bd ^bb7 -// CHECK: ^bb9: // pred: ^bb6 -// CHECK: aie.end -// CHECK: } +// CHECK: %of2_buff_0 = aie.buffer(%tile_1_2) {sym_name = "of2_buff_0"} : memref<16xi32> +// CHECK: %of2_buff_1 = aie.buffer(%tile_1_2) {sym_name = "of2_buff_1"} : memref<16xi32> +// CHECK: %of2_prod_lock = aie.lock(%tile_1_2, 2) {init = 2 : i32, sym_name = "of2_prod_lock"} +// CHECK: %of2_cons_lock = aie.lock(%tile_1_2, 3) {init = 0 : i32, sym_name = "of2_cons_lock"} +// CHECK: %of1_buff_0 = aie.buffer(%tile_1_2) {sym_name = "of1_buff_0"} : memref<16xi32> +// CHECK: %of1_buff_1 = aie.buffer(%tile_1_2) {sym_name = "of1_buff_1"} : memref<16xi32> +// CHECK: %of1_prod_lock = aie.lock(%tile_1_2, 0) {init = 2 : i32, sym_name = "of1_prod_lock"} +// CHECK: %of1_cons_lock = aie.lock(%tile_1_2, 1) {init = 0 : i32, sym_name = "of1_cons_lock"} +// CHECK: aie.flow(%tile_1_2, DMA : 0, %tile_3_3, DMA : 0) // CHECK: %mem_1_2 = aie.mem(%tile_1_2) { -// CHECK: %0 = aie.dma_start(S2MM, 0, ^bb1, ^bb3) +// CHECK: %0 = aie.dma_start(MM2S, 0, ^bb1, ^bb3, repeat_count = 2) // CHECK: ^bb1: // 2 preds: ^bb0, ^bb2 -// CHECK: aie.use_lock(%of1_cons_prod_lock, AcquireGreaterEqual, 1) -// CHECK: aie.dma_bd(%of1_cons_buff_0 : memref<16xi32>, 0, 16) -// CHECK: aie.use_lock(%of1_cons_cons_lock, Release, 1) +// CHECK: aie.use_lock(%of2_cons_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of2_buff_0 : memref<16xi32>, 0, 16) +// CHECK: aie.use_lock(%of2_prod_lock, Release, 1) // CHECK: aie.next_bd ^bb2 // CHECK: ^bb2: // pred: ^bb1 -// CHECK: aie.use_lock(%of1_cons_prod_lock, AcquireGreaterEqual, 1) -// CHECK: aie.dma_bd(%of1_cons_buff_1 : memref<16xi32>, 0, 16) -// CHECK: aie.use_lock(%of1_cons_cons_lock, Release, 1) +// CHECK: aie.use_lock(%of2_cons_lock, AcquireGreaterEqual, 1) +// CHECK: aie.dma_bd(%of2_buff_1 : memref<16xi32>, 0, 16) +// CHECK: aie.use_lock(%of2_prod_lock, Release, 1) // CHECK: aie.next_bd ^bb1 // CHECK: ^bb3: // pred: ^bb0 // CHECK: aie.end @@ -116,7 +68,9 @@ module @repeatCount { aie.device(npu1) { %tile12 = aie.tile(1, 2) %tile13 = aie.tile(1, 3) + %tile33 = aie.tile(3, 3) - aie.objectfifo @of (%tile12, {%tile13}, 2 : i32) {repeat_count = 3 : i32} : !aie.objectfifo> + aie.objectfifo @of1 (%tile12, {%tile13}, 2 : i32) {repeat_count = 3 : i32} : !aie.objectfifo> + aie.objectfifo @of2 (%tile12, {%tile33}, 2 : i32) {repeat_count = 3 : i32} : !aie.objectfifo> } } From edab881d2f16608570f66f32d4e5a82731d64928 Mon Sep 17 00:00:00 2001 From: AndraBisca Date: Wed, 16 Oct 2024 06:30:15 -0600 Subject: [PATCH 03/18] Remove unnecessary file --- .../repeat/compute_repeat/simple_repeat.exe | Bin 491456 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 programming_examples/basic/repeat/compute_repeat/simple_repeat.exe diff --git a/programming_examples/basic/repeat/compute_repeat/simple_repeat.exe b/programming_examples/basic/repeat/compute_repeat/simple_repeat.exe deleted file mode 100755 index d5aac73c00016c67769cc3c2decc9b2f7f4be55b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491456 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

Y^xa&=BAexIQLu6jP(_ve5En7j@Uxl|;YH5^&K4 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 From d530ea93cedb0e59a56aa5f0da38c82ce1ab35ef Mon Sep 17 00:00:00 2001 From: AndraBisca Date: Wed, 16 Oct 2024 06:34:35 -0600 Subject: [PATCH 04/18] Add min value constraint for repeat_count --- include/aie/Dialect/AIE/IR/AIEOps.td | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/aie/Dialect/AIE/IR/AIEOps.td b/include/aie/Dialect/AIE/IR/AIEOps.td index 275b5a84c7..6557c5342a 100644 --- a/include/aie/Dialect/AIE/IR/AIEOps.td +++ b/include/aie/Dialect/AIE/IR/AIEOps.td @@ -1681,7 +1681,7 @@ def AIE_ObjectFifoCreateOp: AIE_Op<"objectfifo", [HasParent<"DeviceOp">, Symbol] // via_shared_mem==1 means use consumer tile's memory module OptionalAttr:$via_shared_mem, // repeat_count==1 means "do it once" - OptionalAttr:$repeat_count + OptionalAttr]>>:$repeat_count ); let assemblyFormat = [{ From 4404ae191a34ff55b7fcdaad564b0eb0b6e892f6 Mon Sep 17 00:00:00 2001 From: Andra Bisca Date: Fri, 18 Oct 2024 15:38:21 +0200 Subject: [PATCH 05/18] Update lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp index 2e1d1a8c5f..765ea6de5f 100644 --- a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp +++ b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp @@ -837,7 +837,8 @@ struct AIEObjectFifoStatefulTransformPass // create DMA channel builder.setInsertionPointToStart(dmaBlock); builder.create(builder.getUnknownLoc(), channelDir, - channelIndex, repeatCount - 1, bdBlock, endBlock); + channelIndex, repeatCount - 1, bdBlock, + endBlock); if (lastDmaBlock != nullptr) lastDmaBlock->getTerminator()->setSuccessor(dmaBlock, 1); From 26a572502634bc58b2facd72daa7c5741b4437fe Mon Sep 17 00:00:00 2001 From: AndraBisca Date: Fri, 18 Oct 2024 09:48:16 -0600 Subject: [PATCH 06/18] Fix tests. Remove generation of repeatCount attribute for compute tile DMAs from objectfifo repeatCount. --- .../AIEObjectFifoStatefulTransform.cpp | 16 ++-------------- test/python/objFifo.py | 2 +- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp index 2e1d1a8c5f..f2063c46ad 100644 --- a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp +++ b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp @@ -542,19 +542,6 @@ struct AIEObjectFifoStatefulTransformPass auto elemType = llvm::cast(fifo.getElementType()); int len = elemType.getNumElements(); - // check for repeat count - int repeatCount = 1; - if (!dims.getValue().empty()) { - auto highestStride = dims.getValue().begin()->getStride() - 1; - if (highestStride == 0) { - repeatCount = dims.getValue().begin()->getSize(); - dims = AIE::BDDimLayoutArrayAttr::get(op->getContext(), - dims.getValue().drop_front(1)); - } - } - if (op.getRepeatCount().has_value()) - repeatCount = op.getRepeatCount().value(); - // search for the buffers/locks (based on if this objFifo has a link) ObjectFifoCreateOp target = op; if (std::optional linkOp = getOptionalLinkOp(op); @@ -562,6 +549,7 @@ struct AIEObjectFifoStatefulTransformPass if (objFifoLinks.find(linkOp.value()) != objFifoLinks.end()) { target = objFifoLinks[linkOp.value()]; if (target == op) { + // check for repeat count if (linkOp->getRepeatCount().has_value()) { acqNum *= linkOp->getRepeatCount().value(); relNum *= linkOp->getRepeatCount().value(); @@ -603,7 +591,7 @@ struct AIEObjectFifoStatefulTransformPass // create DMA channel builder.setInsertionPointToStart(dmaBlock); builder.create(builder.getUnknownLoc(), channelDir, - channelIndex, repeatCount - 1, bdBlock, + channelIndex, /*repeatCount*/ 0, bdBlock, endBlock); if (lastDmaBlock != nullptr) lastDmaBlock->getTerminator()->setSuccessor(dmaBlock, 1); diff --git a/test/python/objFifo.py b/test/python/objFifo.py index 2ee044ee6c..e33af064ba 100644 --- a/test/python/objFifo.py +++ b/test/python/objFifo.py @@ -24,7 +24,7 @@ # CHECK: %tile_1_2 = aie.tile(1, 2) # CHECK: %tile_1_3 = aie.tile(1, 3) # CHECK: aie.objectfifo @of0(%tile_0_0, {%tile_1_2}, 2 : i32) : !aie.objectfifo> -# CHECK: aie.objectfifo @of1(%tile_0_1, {%tile_1_2}, 2 : i32) {memtile_repeat = 4 : i32} : !aie.objectfifo> +# CHECK: aie.objectfifo @of1(%tile_0_1, {%tile_1_2}, 2 : i32) {repeat_count = 4 : i32} : !aie.objectfifo> # CHECK: aie.objectfifo @of2(%tile_1_2, {%tile_1_3}, 2 : i32) {via_shared_mem = 1 : i32} : !aie.objectfifo> # CHECK: %core_1_2 = aie.core(%tile_1_2) { # CHECK: %0 = aie.objectfifo.acquire @of0(Consume, 1) : !aie.objectfifosubview> From dc2bcb00b5df1fd59e19db6002b06167c5244a6c Mon Sep 17 00:00:00 2001 From: AndraBisca Date: Fri, 18 Oct 2024 10:21:52 -0600 Subject: [PATCH 07/18] Remove ability to infer repeat from data layout transformations. --- .../AIEObjectFifoStatefulTransform.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp index dca7f950af..4509d83526 100644 --- a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp +++ b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp @@ -542,6 +542,11 @@ struct AIEObjectFifoStatefulTransformPass auto elemType = llvm::cast(fifo.getElementType()); int len = elemType.getNumElements(); + // check for repeat count + int repeatCount = 1; + if (op.getRepeatCount().has_value()) + repeatCount = op.getRepeatCount().value(); + // search for the buffers/locks (based on if this objFifo has a link) ObjectFifoCreateOp target = op; if (std::optional linkOp = getOptionalLinkOp(op); @@ -549,7 +554,6 @@ struct AIEObjectFifoStatefulTransformPass if (objFifoLinks.find(linkOp.value()) != objFifoLinks.end()) { target = objFifoLinks[linkOp.value()]; if (target == op) { - // check for repeat count if (linkOp->getRepeatCount().has_value()) { acqNum *= linkOp->getRepeatCount().value(); relNum *= linkOp->getRepeatCount().value(); @@ -591,7 +595,7 @@ struct AIEObjectFifoStatefulTransformPass // create DMA channel builder.setInsertionPointToStart(dmaBlock); builder.create(builder.getUnknownLoc(), channelDir, - channelIndex, /*repeatCount*/ 0, bdBlock, + channelIndex, repeatCount - 1, bdBlock, endBlock); if (lastDmaBlock != nullptr) lastDmaBlock->getTerminator()->setSuccessor(dmaBlock, 1); @@ -711,14 +715,6 @@ struct AIEObjectFifoStatefulTransformPass // check for repeat count int repeatCount = 1; - if (!dims.getValue().empty()) { - auto highestStride = dims.getValue().begin()->getStride() - 1; - if (highestStride == 0) { - repeatCount = dims.getValue().begin()->getSize(); - dims = AIE::BDDimLayoutArrayAttr::get(op->getContext(), - dims.getValue().drop_front(1)); - } - } if (op.getRepeatCount().has_value()) repeatCount = op.getRepeatCount().value(); @@ -825,8 +821,7 @@ struct AIEObjectFifoStatefulTransformPass // create DMA channel builder.setInsertionPointToStart(dmaBlock); builder.create(builder.getUnknownLoc(), channelDir, - channelIndex, repeatCount - 1, bdBlock, - endBlock); + channelIndex, repeatCount - 1, bdBlock, endBlock); if (lastDmaBlock != nullptr) lastDmaBlock->getTerminator()->setSuccessor(dmaBlock, 1); From afa59fe66dc911a45cdc1d9be0d5e39a70128bb3 Mon Sep 17 00:00:00 2001 From: Andra Bisca Date: Fri, 18 Oct 2024 18:23:47 +0200 Subject: [PATCH 08/18] Update lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp index 4509d83526..3734e3938b 100644 --- a/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp +++ b/lib/Dialect/AIE/Transforms/AIEObjectFifoStatefulTransform.cpp @@ -821,7 +821,8 @@ struct AIEObjectFifoStatefulTransformPass // create DMA channel builder.setInsertionPointToStart(dmaBlock); builder.create(builder.getUnknownLoc(), channelDir, - channelIndex, repeatCount - 1, bdBlock, endBlock); + channelIndex, repeatCount - 1, bdBlock, + endBlock); if (lastDmaBlock != nullptr) lastDmaBlock->getTerminator()->setSuccessor(dmaBlock, 1); From 44a240f6419eb5a8dd65f195c1baef317bd3ed39 Mon Sep 17 00:00:00 2001 From: Erika Hunhoff Date: Mon, 21 Oct 2024 10:07:48 -0600 Subject: [PATCH 09/18] Can see error with test.cpp locally; try redirecting stderr to stdout to see if I can see error in CI --- test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py b/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py index 2482492f0d..92d1239263 100644 --- a/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py +++ b/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py @@ -11,7 +11,7 @@ # RUN: %python %S/aie2.py 36 > ./aie2.mlir # RUN: %python aiecc.py --no-aiesim --aie-generate-cdo --aie-generate-npu --aie-generate-xclbin --no-compile-host --xclbin-name=final.xclbin --npu-insts-name=insts.txt ./aie2.mlir # RUN: clang %S/test.cpp -o test.exe -std=c++17 -Wall %xrt_flags -lrt -lstdc++ %test_utils_flags -# RUN: %run_on_npu ./test.exe -x final.xclbin -i insts.txt -k MLIR_AIE -l 36 | FileCheck %s +# RUN: %run_on_npu ./test.exe -x final.xclbin -i insts.txt -k MLIR_AIE -l 36 2>&1 | FileCheck %s # CHECK: PASS! import numpy as np import sys From ae94b4431e9e62a6d25c32000dda82bc2016a2e3 Mon Sep 17 00:00:00 2001 From: Erika Hunhoff Date: Mon, 21 Oct 2024 11:05:53 -0600 Subject: [PATCH 10/18] Fix discrepencies in test.cpp between distribute-repeat test and example --- .../distribute_repeat/aie2.py | 2 +- .../distribute_repeat/test.cpp | 21 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py b/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py index 92d1239263..2482492f0d 100644 --- a/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py +++ b/test/npu-xrt/objectfifo_repeat/distribute_repeat/aie2.py @@ -11,7 +11,7 @@ # RUN: %python %S/aie2.py 36 > ./aie2.mlir # RUN: %python aiecc.py --no-aiesim --aie-generate-cdo --aie-generate-npu --aie-generate-xclbin --no-compile-host --xclbin-name=final.xclbin --npu-insts-name=insts.txt ./aie2.mlir # RUN: clang %S/test.cpp -o test.exe -std=c++17 -Wall %xrt_flags -lrt -lstdc++ %test_utils_flags -# RUN: %run_on_npu ./test.exe -x final.xclbin -i insts.txt -k MLIR_AIE -l 36 2>&1 | FileCheck %s +# RUN: %run_on_npu ./test.exe -x final.xclbin -i insts.txt -k MLIR_AIE -l 36 | FileCheck %s # CHECK: PASS! import numpy as np import sys diff --git a/test/npu-xrt/objectfifo_repeat/distribute_repeat/test.cpp b/test/npu-xrt/objectfifo_repeat/distribute_repeat/test.cpp index 305c6dbccd..cea2be1a1c 100644 --- a/test/npu-xrt/objectfifo_repeat/distribute_repeat/test.cpp +++ b/test/npu-xrt/objectfifo_repeat/distribute_repeat/test.cpp @@ -65,7 +65,7 @@ int main(int argc, const char *argv[]) { "path of file containing userspace instructions to be sent to the LX6")( "length,l", po::value()->default_value(4096), "the length of the transfer in int32_t")( - "repeat,r", po::value()->default_value(4), + "repeat,r", po::value()->default_value(7), "the compute tile repeat count"); po::variables_map vm; @@ -94,11 +94,12 @@ int main(int argc, const char *argv[]) { std::cout << "Sequence instr count: " << instr_v.size() << std::endl; int N = vm["length"].as(); - if ((N % 1024)) { - std::cerr << "Length must be a multiple of 1024." << std::endl; + if ((N % 2 == 1)) { + std::cerr << "Length must be a multiple of 2." << std::endl; return 1; } int repeat_count = vm["repeat"].as(); + int out_size = N * repeat_count; // Start the XRT test code // Get a device handle @@ -148,7 +149,7 @@ int main(int argc, const char *argv[]) { kernel.group_id(3)); auto bo_inB = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(4)); - auto bo_out = xrt::bo(device, N * repeat_count * sizeof(int32_t), + auto bo_out = xrt::bo(device, out_size * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(5)); if (verbosity >= 1) @@ -177,8 +178,16 @@ int main(int argc, const char *argv[]) { uint32_t *bufOut = bo_out.map(); int errors = 0; - for (uint32_t i = 0; i < N * repeat_count; i++) { - uint32_t ref = (i % N) + 1; + for (uint32_t i = 0; i < out_size / 2; i++) { + uint32_t ref = (i % (N / 2)) + 2; + if (*(bufOut + i) != ref) { + std::cout << "error at index[" << i << "]: expected " << ref << " got " + << *(bufOut + i) << std::endl; + errors++; + } + } + for (uint32_t i = out_size / 2; i < out_size; i++) { + uint32_t ref = (i % (N / 2)) + (N / 2) + 3; if (*(bufOut + i) != ref) { std::cout << "error at index[" << i << "]: expected " << ref << " got " << *(bufOut + i) << std::endl; From a7b0d64c4b7e9245dfd0274a38a0cf04560c897b Mon Sep 17 00:00:00 2001 From: Erika Hunhoff Date: Mon, 21 Oct 2024 11:10:58 -0600 Subject: [PATCH 11/18] Fix discrepencies between test.cpp in simple_repeat test vs programming example --- .../objectfifo_repeat/simple_repeat/test.cpp | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp b/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp index e1d0ebb91f..9775fc50bf 100644 --- a/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp +++ b/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp @@ -64,7 +64,9 @@ int main(int argc, const char *argv[]) { "instr,i", po::value()->required(), "path of file containing userspace instructions to be sent to the LX6")( "length,l", po::value()->default_value(4096), - "the length of the transfer in int32_t"); + "the length of the transfer in int32_t")( + "repeat,r", po::value()->default_value(4), + "the memtile repeat count"); po::variables_map vm; try { @@ -92,12 +94,11 @@ int main(int argc, const char *argv[]) { std::cout << "Sequence instr count: " << instr_v.size() << std::endl; int N = vm["length"].as(); - if ((N % 2 == 1)) { - std::cerr << "Length must be a multiple of 2." << std::endl; + if ((N % 1024)) { + std::cerr << "Length must be a multiple of 1024." << std::endl; return 1; } - int repeat_count = 7; - int out_size = N * repeat_count; + int repeat_count = vm["repeat"].as(); // Start the XRT test code // Get a device handle @@ -147,7 +148,7 @@ int main(int argc, const char *argv[]) { kernel.group_id(3)); auto bo_inB = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(4)); - auto bo_out = xrt::bo(device, out_size * sizeof(int32_t), + auto bo_out = xrt::bo(device, N * repeat_count * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(5)); if (verbosity >= 1) @@ -177,16 +178,8 @@ int main(int argc, const char *argv[]) { int errors = 0; - for (uint32_t i = 0; i < out_size / 2; i++) { - uint32_t ref = (i % (N / 2)) + 2; - if (*(bufOut + i) != ref) { - std::cout << "error at index[" << i << "]: expected " << ref << " got " - << *(bufOut + i) << std::endl; - errors++; - } - } - for (uint32_t i = out_size / 2; i < out_size; i++) { - uint32_t ref = (i % (N / 2)) + (N / 2) + 3; + for (uint32_t i = 0; i < N * repeat_count; i++) { + +uint32_t ref = (i % N) + 1; if (*(bufOut + i) != ref) { std::cout << "error at index[" << i << "]: expected " << ref << " got " << *(bufOut + i) << std::endl; From 46052e96d4abdafc6a2cbbde38d8a30d6625ce47 Mon Sep 17 00:00:00 2001 From: Erika Hunhoff Date: Mon, 21 Oct 2024 11:13:38 -0600 Subject: [PATCH 12/18] fix typo --- test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp b/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp index 9775fc50bf..e5a2656b9f 100644 --- a/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp +++ b/test/npu-xrt/objectfifo_repeat/simple_repeat/test.cpp @@ -179,7 +179,7 @@ int main(int argc, const char *argv[]) { int errors = 0; for (uint32_t i = 0; i < N * repeat_count; i++) { - +uint32_t ref = (i % N) + 1; + uint32_t ref = (i % N) + 1; if (*(bufOut + i) != ref) { std::cout << "error at index[" << i << "]: expected " << ref << " got " << *(bufOut + i) << std::endl; From 5ecaf9c77953e0a6c3b509a9eb55da24c61593ce Mon Sep 17 00:00:00 2001 From: Erika Hunhoff Date: Mon, 21 Oct 2024 11:22:28 -0600 Subject: [PATCH 13/18] Deleted repeat from programming examples (this is replaced by test/npu-xrt/objectfifo_repeat); delete unused cmake files --- .../repeat/compute_repeat/CMakeLists.txt | 75 ------- .../basic/repeat/compute_repeat/Makefile | 69 ------ .../basic/repeat/compute_repeat/README.md | 29 --- .../basic/repeat/compute_repeat/aie2.py | 70 ------ .../repeat/compute_repeat/run_makefile.lit | 9 - .../basic/repeat/compute_repeat/test.cpp | 199 ----------------- .../repeat/distribute_repeat/CMakeLists.txt | 75 ------- .../basic/repeat/distribute_repeat/Makefile | 69 ------ .../basic/repeat/distribute_repeat/README.md | 23 -- .../basic/repeat/distribute_repeat/aie2.py | 113 ---------- .../repeat/distribute_repeat/run_makefile.lit | 9 - .../basic/repeat/distribute_repeat/test.cpp | 207 ------------------ .../basic/repeat/simple_repeat/CMakeLists.txt | 75 ------- .../basic/repeat/simple_repeat/Makefile | 69 ------ .../basic/repeat/simple_repeat/README.md | 29 --- .../basic/repeat/simple_repeat/aie2.py | 78 ------- .../repeat/simple_repeat/run_makefile.lit | 9 - .../basic/repeat/simple_repeat/test.cpp | 199 ----------------- .../compute_repeat/CMakeLists.txt | 75 ------- .../distribute_repeat/CMakeLists.txt | 75 ------- .../simple_repeat/CMakeLists.txt | 75 ------- 21 files changed, 1631 deletions(-) delete mode 100644 programming_examples/basic/repeat/compute_repeat/CMakeLists.txt delete mode 100644 programming_examples/basic/repeat/compute_repeat/Makefile delete mode 100644 programming_examples/basic/repeat/compute_repeat/README.md delete mode 100644 programming_examples/basic/repeat/compute_repeat/aie2.py delete mode 100644 programming_examples/basic/repeat/compute_repeat/run_makefile.lit delete mode 100644 programming_examples/basic/repeat/compute_repeat/test.cpp delete mode 100644 programming_examples/basic/repeat/distribute_repeat/CMakeLists.txt delete mode 100644 programming_examples/basic/repeat/distribute_repeat/Makefile delete mode 100644 programming_examples/basic/repeat/distribute_repeat/README.md delete mode 100644 programming_examples/basic/repeat/distribute_repeat/aie2.py delete mode 100644 programming_examples/basic/repeat/distribute_repeat/run_makefile.lit delete mode 100644 programming_examples/basic/repeat/distribute_repeat/test.cpp delete mode 100644 programming_examples/basic/repeat/simple_repeat/CMakeLists.txt delete mode 100644 programming_examples/basic/repeat/simple_repeat/Makefile delete mode 100644 programming_examples/basic/repeat/simple_repeat/README.md delete mode 100644 programming_examples/basic/repeat/simple_repeat/aie2.py delete mode 100644 programming_examples/basic/repeat/simple_repeat/run_makefile.lit delete mode 100644 programming_examples/basic/repeat/simple_repeat/test.cpp delete mode 100644 test/npu-xrt/objectfifo_repeat/compute_repeat/CMakeLists.txt delete mode 100644 test/npu-xrt/objectfifo_repeat/distribute_repeat/CMakeLists.txt delete mode 100644 test/npu-xrt/objectfifo_repeat/simple_repeat/CMakeLists.txt diff --git a/programming_examples/basic/repeat/compute_repeat/CMakeLists.txt b/programming_examples/basic/repeat/compute_repeat/CMakeLists.txt deleted file mode 100644 index 5da03ef2b2..0000000000 --- a/programming_examples/basic/repeat/compute_repeat/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 proj_${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/basic/repeat/compute_repeat/Makefile b/programming_examples/basic/repeat/compute_repeat/Makefile deleted file mode 100644 index afe3a3badc..0000000000 --- a/programming_examples/basic/repeat/compute_repeat/Makefile +++ /dev/null @@ -1,69 +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 -# -##===----------------------------------------------------------------------===## - -srcdir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) - -include ${srcdir}/../../../makefile-common - -all: build/final.xclbin build/insts.txt - -devicename ?= npu -targetname = compute_repeat -LENGTH ?= 4096 - -build/aie.mlir: ${srcdir}/aie2.py - mkdir -p ${@D} - python3 $< ${LENGTH} ${devicename} ${col} > $@ - -.PHONY: inst/insts.txt -inst/insts.txt: ${srcdir}/aie2.py - rm -rf inst - mkdir -p inst - python3 $< ${LENGTH} > inst/aie.mlir - pushd inst && aiecc.py --aie-only-generate-npu --npu-insts-name=insts.txt aie.mlir && popd - ${powershell} ./build/${targetname}.exe -x build/final.xclbin -i inst/insts.txt -k MLIR_AIE -l ${LENGTH} - -build/final.xclbin: build/aie.mlir - 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: ${srcdir}/test.cpp - rm -rf _build - mkdir -p _build - cd _build && ${powershell} cmake ${srcdir} -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 -l ${LENGTH} - -# Changing variables when we target VCK5000 -vck5000: devicename=xcvc1902 -vck5000: col=6 - -vck5000: build/aie.mlir - aiecc.py --link_against_hsa --host-target=x86_64-amd-linux-gnu build/aie.mlir \ - -I/opt/xaiengine/include \ - -I${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/include \ - -L/opt/xaiengine/lib \ - -L/lib/x86_64-linux-gnu/ \ - ${srcdir}/test_vck5000.cpp \ - ${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/src/test_library.cpp \ - -Wl,-R/opt/xaiengine/lib \ - -Wl,--whole-archive -Wl,--no-whole-archive -lstdc++ -ldl -lelf -o test.elf - -run_vck5000: - test.elf - -clean: - rm -rf build _build inst ${targetname}.exe diff --git a/programming_examples/basic/repeat/compute_repeat/README.md b/programming_examples/basic/repeat/compute_repeat/README.md deleted file mode 100644 index 46ae72db7a..0000000000 --- a/programming_examples/basic/repeat/compute_repeat/README.md +++ /dev/null @@ -1,29 +0,0 @@ - - -# Simple Repeat - -This reference design can be run on a Ryzen™ AI NPU. - -In the [design](./aie2.py) data is brought from external memory via the `ShimTile` to the `MemTile` and back by using an implicit copy via the compute tile's Data Movement Accelerator (DMA). Furthermore, the input data is repeated by the `MemTile` three times which results in the output data consisting of four instances of the input data. - -The implicit copy is performed using the `object_fifo_link` operation that specifies how input data arriving via `of_in` should be sent further via `of_out` by specifically leveraging the compute tile's DMA. This operation and its functionality are described in more depth in [Section-2b](../../../programming_guide/section-2/section-2b/03_Link_Distribute_Join/README.md#object-fifo-link) of the programming guide. - -The repeat count is specified as follows: -```python -of_out.set_memtile_repeat(memtile_repeat_count) -``` -Specifically, the instruction above specifies the number of repetitions that the producer side of the `of_out` objectfifo should do. - -To compile and run the design for NPU: -``` -make -make run -``` diff --git a/programming_examples/basic/repeat/compute_repeat/aie2.py b/programming_examples/basic/repeat/compute_repeat/aie2.py deleted file mode 100644 index ff325cf73f..0000000000 --- a/programming_examples/basic/repeat/compute_repeat/aie2.py +++ /dev/null @@ -1,70 +0,0 @@ -# repeat/compute_repeat/aie2.py -*- Python -*- -# -# 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 2024 Advanced Micro Devices, Inc. or its affiliates -import numpy as np -import sys - -from aie.dialects.aie import * -from aie.dialects.aiex import * -from aie.extras.context import mlir_mod_ctx - -N = 4096 -dev = AIEDevice.npu1_1col -col = 0 -repeat_count = 4 - -if len(sys.argv) > 1: - N = int(sys.argv[1]) -data_out_size = N * repeat_count - -if len(sys.argv) > 2: - if sys.argv[2] == "npu": - dev = AIEDevice.npu1_1col - elif sys.argv[2] == "xcvc1902": - dev = AIEDevice.xcvc1902 - else: - raise ValueError("[ERROR] Device name {} is unknown".format(sys.argv[2])) - -if len(sys.argv) > 3: - col = int(sys.argv[3]) - - -def compute_repeat(): - with mlir_mod_ctx() as ctx: - - @device(dev) - def device_body(): - tensor_ty = np.ndarray[(N,), np.dtype[np.int32]] - tensor_out_ty = np.ndarray[(data_out_size,), np.dtype[np.int32]] - - # Tile declarations - ShimTile = tile(col, 0) - ComputeTile = tile(col, 3) - - # AIE-array data movement with object fifos - of_in = object_fifo("in", ShimTile, ComputeTile, 1, tensor_ty) - of_out = object_fifo("out", ComputeTile, ShimTile, 1, tensor_ty) - of_out.set_repeat_count(repeat_count) - object_fifo_link(of_in, of_out) - - # To/from AIE-array data movement - @runtime_sequence(tensor_ty, tensor_ty, tensor_out_ty) - def sequence(A, B, C): - npu_dma_memcpy_nd(metadata=of_in, bd_id=1, mem=A, sizes=[1, 1, 1, N]) - npu_dma_memcpy_nd( - metadata=of_out, - bd_id=0, - mem=C, - sizes=[1, 1, 1, data_out_size], - ) - # of_out will only complete after of_in completes, so we just wait on of_out instead of both - dma_wait(of_out) - - print(ctx.module) - - -compute_repeat() diff --git a/programming_examples/basic/repeat/compute_repeat/run_makefile.lit b/programming_examples/basic/repeat/compute_repeat/run_makefile.lit deleted file mode 100644 index 6875524001..0000000000 --- a/programming_examples/basic/repeat/compute_repeat/run_makefile.lit +++ /dev/null @@ -1,9 +0,0 @@ -// (c) Copyright 2024 Advanced Micro Devices, Inc. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// REQUIRES: ryzen_ai, chess -// -// RUN: make -f %S/Makefile clean -// RUN: make -f %S/Makefile -// RUN: %run_on_npu make -f %S/Makefile run | FileCheck %s -// CHECK: PASS! diff --git a/programming_examples/basic/repeat/compute_repeat/test.cpp b/programming_examples/basic/repeat/compute_repeat/test.cpp deleted file mode 100644 index 305c6dbccd..0000000000 --- a/programming_examples/basic/repeat/compute_repeat/test.cpp +++ /dev/null @@ -1,199 +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) 2024, Advanced Micro Devices, Inc. -// -//===----------------------------------------------------------------------===// - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xrt/xrt_bo.h" -#include "xrt/xrt_device.h" -#include "xrt/xrt_kernel.h" - -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"); - } - } -} - -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")( - "length,l", po::value()->default_value(4096), - "the length of the transfer in int32_t")( - "repeat,r", po::value()->default_value(4), - "the compute tile repeat count"); - 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 << std::endl; - return 1; - } - } catch (const std::exception &ex) { - std::cerr << ex.what() << "\n\n"; - std::cerr << "Usage:\n" << desc << std::endl; - 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() << std::endl; - - int N = vm["length"].as(); - if ((N % 1024)) { - std::cerr << "Length must be a multiple of 1024." << std::endl; - return 1; - } - int repeat_count = vm["repeat"].as(); - - // 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() - << std::endl; - auto xclbin = xrt::xclbin(vm["xclbin"].as()); - - if (verbosity >= 1) - std::cout << "Kernel opcode: " << vm["kernel"].as() - << std::endl; - 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." << std::endl; - xrt::hw_context context(device, xclbin.get_uuid()); - - // get a kernel handle - if (verbosity >= 1) - std::cout << "Getting handle to kernel:" << kernelName << std::endl; - auto kernel = xrt::kernel(context, kernelName); - - auto bo_instr = xrt::bo(device, instr_v.size() * sizeof(int), - XCL_BO_FLAGS_CACHEABLE, kernel.group_id(1)); - auto bo_inA = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(3)); - auto bo_inB = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(4)); - auto bo_out = xrt::bo(device, N * repeat_count * sizeof(int32_t), - XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(5)); - - if (verbosity >= 1) - std::cout << "Writing data into buffer objects." << std::endl; - - int32_t *bufInA = bo_inA.map(); - std::vector srcVecA; - for (int i = 0; i < N; i++) - srcVecA.push_back(i + 1); - memcpy(bufInA, srcVecA.data(), (srcVecA.size() * sizeof(uint32_t))); - - 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_inA.sync(XCL_BO_SYNC_BO_TO_DEVICE); - - if (verbosity >= 1) - std::cout << "Running Kernel." << std::endl; - unsigned int opcode = 3; - auto run = kernel(opcode, bo_instr, instr_v.size(), bo_inA, bo_inB, bo_out); - run.wait(); - - bo_out.sync(XCL_BO_SYNC_BO_FROM_DEVICE); - - uint32_t *bufOut = bo_out.map(); - - int errors = 0; - for (uint32_t i = 0; i < N * repeat_count; i++) { - uint32_t ref = (i % N) + 1; - if (*(bufOut + i) != ref) { - std::cout << "error at index[" << i << "]: expected " << ref << " got " - << *(bufOut + i) << std::endl; - errors++; - } - } - - if (!errors) { - std::cout << std::endl << "PASS!" << std::endl << std::endl; - return 0; - } else { - std::cout << std::endl - << errors << " mismatches." << std::endl - << std::endl; - std::cout << std::endl << "fail." << std::endl << std::endl; - return 1; - } -} diff --git a/programming_examples/basic/repeat/distribute_repeat/CMakeLists.txt b/programming_examples/basic/repeat/distribute_repeat/CMakeLists.txt deleted file mode 100644 index 5da03ef2b2..0000000000 --- a/programming_examples/basic/repeat/distribute_repeat/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 proj_${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/basic/repeat/distribute_repeat/Makefile b/programming_examples/basic/repeat/distribute_repeat/Makefile deleted file mode 100644 index 470206c9a6..0000000000 --- a/programming_examples/basic/repeat/distribute_repeat/Makefile +++ /dev/null @@ -1,69 +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 -# -##===----------------------------------------------------------------------===## - -srcdir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) - -include ${srcdir}/../../../makefile-common - -all: build/final.xclbin build/insts.txt - -devicename ?= npu -targetname = distribute_repeat -LENGTH ?= 36 - -build/aie.mlir: ${srcdir}/aie2.py - mkdir -p ${@D} - python3 $< ${LENGTH} ${devicename} ${col} > $@ - -.PHONY: inst/insts.txt -inst/insts.txt: ${srcdir}/aie2.py - rm -rf inst - mkdir -p inst - python3 $< ${LENGTH} > inst/aie.mlir - pushd inst && aiecc.py --aie-only-generate-npu --npu-insts-name=insts.txt aie.mlir && popd - ${powershell} ./build/${targetname}.exe -x build/final.xclbin -i inst/insts.txt -k MLIR_AIE -l ${LENGTH} - -build/final.xclbin: build/aie.mlir - 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: ${srcdir}/test.cpp - rm -rf _build - mkdir -p _build - cd _build && ${powershell} cmake ${srcdir} -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 -l ${LENGTH} - -# Changing variables when we target VCK5000 -vck5000: devicename=xcvc1902 -vck5000: col=6 - -vck5000: build/aie.mlir - aiecc.py --link_against_hsa --host-target=x86_64-amd-linux-gnu build/aie.mlir \ - -I/opt/xaiengine/include \ - -I${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/include \ - -L/opt/xaiengine/lib \ - -L/lib/x86_64-linux-gnu/ \ - ${srcdir}/test_vck5000.cpp \ - ${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/src/test_library.cpp \ - -Wl,-R/opt/xaiengine/lib \ - -Wl,--whole-archive -Wl,--no-whole-archive -lstdc++ -ldl -lelf -o test.elf - -run_vck5000: - test.elf - -clean: - rm -rf build _build inst ${targetname}.exe diff --git a/programming_examples/basic/repeat/distribute_repeat/README.md b/programming_examples/basic/repeat/distribute_repeat/README.md deleted file mode 100644 index 1ec8edaf4e..0000000000 --- a/programming_examples/basic/repeat/distribute_repeat/README.md +++ /dev/null @@ -1,23 +0,0 @@ - - -# Distribute Repeat - -This reference design can be run on a Ryzen™ AI NPU. - -In the [design](./aie2.py) data is brought from external memory via the `ShimTile` to the `MemTile`. The data is then split between two `ComputeTile`s using a distribute operation specified via an `object_fifo_link`. Each input objectfifo between the `MemTile` and each `ComputeTile` is further configured to repeat the data so as to send multiple copies of that data to each `ComputeTile`. - -For more information, the `object_fifo_link` operation as well as the concept of distribution and its functionality is described in more depth in [Section-2b](../../../programming_guide/section-2/section-2b/03_Link_Distribute_Join/README.md#object-fifo-link) of the programming guide. - -To compile and run the design for NPU: -``` -make -make run -``` \ No newline at end of file diff --git a/programming_examples/basic/repeat/distribute_repeat/aie2.py b/programming_examples/basic/repeat/distribute_repeat/aie2.py deleted file mode 100644 index 472ac87965..0000000000 --- a/programming_examples/basic/repeat/distribute_repeat/aie2.py +++ /dev/null @@ -1,113 +0,0 @@ -# repeat/distribute_repeat/aie2.py -*- Python -*- -# -# 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 2024 AMD Inc. - -# REQUIRES: ryzen_ai, valid_xchess_license -# -# RUN: %python %S/aie2.py 36 > ./aie2.mlir -# RUN: %python aiecc.py --no-aiesim --aie-generate-cdo --aie-generate-npu --aie-generate-xclbin --no-compile-host --xclbin-name=final.xclbin --npu-insts-name=insts.txt ./aie2.mlir -# RUN: clang %S/test.cpp -o test.exe -std=c++17 -Wall %xrt_flags -lrt -lstdc++ %test_utils_flags -# RUN: %run_on_npu ./test.exe -x final.xclbin -i insts.txt -k MLIR_AIE -l 36 | FileCheck %s -# CHECK: PASS! -import numpy as np -import sys - -from aie.dialects.aie import * -from aie.dialects.aiex import * -from aie.extras.context import mlir_mod_ctx -from aie.helpers.dialects.ext.scf import _for as range_ - -dev = AIEDevice.npu1_1col -col = 0 -N = 36 - -if len(sys.argv) > 1: - N = int(sys.argv[1]) - -if len(sys.argv) > 2: - if sys.argv[2] == "npu": - dev = AIEDevice.npu1_1col - elif sys.argv[2] == "xcvc1902": - dev = AIEDevice.xcvc1902 - else: - raise ValueError("[ERROR] Device name {} is unknown".format(sys.argv[2])) - -if len(sys.argv) > 3: - col = int(sys.argv[3]) - -assert N % 2 == 0, "N must be even" -repeat_counter = 7 -out_size = N * repeat_counter - - -def distribute_repeat(): - with mlir_mod_ctx() as ctx: - - @device(dev) - def device_body(): - dtype = np.dtype[np.int32] - in_ty = np.ndarray[(N,), dtype] - half_ty = np.ndarray[(N // 2,), dtype] - out_ty = np.ndarray[(out_size,), dtype] - - # Tile declarations - ShimTile = tile(col, 0) - MemTile = tile(col, 1) - ComputeTile2 = tile(col, 2) - ComputeTile3 = tile(col, 3) - - # AIE-array data movement with object fifos - of_in = object_fifo("in", ShimTile, MemTile, 1, in_ty) - of_in2 = object_fifo("in2", MemTile, ComputeTile2, 2, half_ty) - of_in3 = object_fifo("in3", MemTile, ComputeTile3, 2, half_ty) - of_in2.set_repeat_count(repeat_counter) - of_in3.set_repeat_count(repeat_counter) - object_fifo_link(of_in, [of_in2, of_in3], [], [0, N // 2]) - - of_out2 = object_fifo("out2", ComputeTile2, MemTile, 2, half_ty) - of_out3 = object_fifo("out3", ComputeTile3, MemTile, 2, half_ty) - of_out = object_fifo("out", MemTile, ShimTile, 1, out_ty) - object_fifo_link([of_out2, of_out3], of_out, [0, out_size // 2], []) - - # Set up compute tiles - - # Compute tile 2 - @core(ComputeTile2) - def core_body(): - for _ in range_(sys.maxsize): - elemOut = of_out2.acquire(ObjectFifoPort.Produce, 1) - elemIn = of_in2.acquire(ObjectFifoPort.Consume, 1) - for i in range_(N // 2): - elemOut[i] = elemIn[i] + 1 - of_in2.release(ObjectFifoPort.Consume, 1) - of_out2.release(ObjectFifoPort.Produce, 1) - - # Compute tile 3 - @core(ComputeTile3) - def core_body(): - for _ in range_(sys.maxsize): - elemOut = of_out3.acquire(ObjectFifoPort.Produce, 1) - elemIn = of_in3.acquire(ObjectFifoPort.Consume, 1) - for i in range_(N // 2): - elemOut[i] = elemIn[i] + 2 - of_in3.release(ObjectFifoPort.Consume, 1) - of_out3.release(ObjectFifoPort.Produce, 1) - - # To/from AIE-array data movement - @runtime_sequence(in_ty, in_ty, out_ty) - def sequence(A, B, C): - npu_dma_memcpy_nd(metadata=of_in, bd_id=1, mem=A, sizes=[1, 1, 1, N]) - npu_dma_memcpy_nd( - metadata=of_out, bd_id=0, mem=C, sizes=[1, 1, 1, out_size] - ) - # of_out will only complete after of_in completes, so we just wait on of_out instead of both - dma_wait(of_out) - - print(ctx.module) - - -distribute_repeat() diff --git a/programming_examples/basic/repeat/distribute_repeat/run_makefile.lit b/programming_examples/basic/repeat/distribute_repeat/run_makefile.lit deleted file mode 100644 index 6875524001..0000000000 --- a/programming_examples/basic/repeat/distribute_repeat/run_makefile.lit +++ /dev/null @@ -1,9 +0,0 @@ -// (c) Copyright 2024 Advanced Micro Devices, Inc. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// REQUIRES: ryzen_ai, chess -// -// RUN: make -f %S/Makefile clean -// RUN: make -f %S/Makefile -// RUN: %run_on_npu make -f %S/Makefile run | FileCheck %s -// CHECK: PASS! diff --git a/programming_examples/basic/repeat/distribute_repeat/test.cpp b/programming_examples/basic/repeat/distribute_repeat/test.cpp deleted file mode 100644 index e1d0ebb91f..0000000000 --- a/programming_examples/basic/repeat/distribute_repeat/test.cpp +++ /dev/null @@ -1,207 +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) 2024, Advanced Micro Devices, Inc. -// -//===----------------------------------------------------------------------===// - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xrt/xrt_bo.h" -#include "xrt/xrt_device.h" -#include "xrt/xrt_kernel.h" - -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"); - } - } -} - -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")( - "length,l", po::value()->default_value(4096), - "the length of the transfer in int32_t"); - 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 << std::endl; - return 1; - } - } catch (const std::exception &ex) { - std::cerr << ex.what() << "\n\n"; - std::cerr << "Usage:\n" << desc << std::endl; - 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() << std::endl; - - int N = vm["length"].as(); - if ((N % 2 == 1)) { - std::cerr << "Length must be a multiple of 2." << std::endl; - return 1; - } - int repeat_count = 7; - int out_size = N * repeat_count; - - // 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() - << std::endl; - auto xclbin = xrt::xclbin(vm["xclbin"].as()); - - if (verbosity >= 1) - std::cout << "Kernel opcode: " << vm["kernel"].as() - << std::endl; - 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." << std::endl; - xrt::hw_context context(device, xclbin.get_uuid()); - - // get a kernel handle - if (verbosity >= 1) - std::cout << "Getting handle to kernel:" << kernelName << std::endl; - auto kernel = xrt::kernel(context, kernelName); - - auto bo_instr = xrt::bo(device, instr_v.size() * sizeof(int), - XCL_BO_FLAGS_CACHEABLE, kernel.group_id(1)); - auto bo_inA = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(3)); - auto bo_inB = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(4)); - auto bo_out = xrt::bo(device, out_size * sizeof(int32_t), - XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(5)); - - if (verbosity >= 1) - std::cout << "Writing data into buffer objects." << std::endl; - - int32_t *bufInA = bo_inA.map(); - std::vector srcVecA; - for (int i = 0; i < N; i++) - srcVecA.push_back(i + 1); - memcpy(bufInA, srcVecA.data(), (srcVecA.size() * sizeof(uint32_t))); - - 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_inA.sync(XCL_BO_SYNC_BO_TO_DEVICE); - - if (verbosity >= 1) - std::cout << "Running Kernel." << std::endl; - unsigned int opcode = 3; - auto run = kernel(opcode, bo_instr, instr_v.size(), bo_inA, bo_inB, bo_out); - run.wait(); - - bo_out.sync(XCL_BO_SYNC_BO_FROM_DEVICE); - - uint32_t *bufOut = bo_out.map(); - - int errors = 0; - - for (uint32_t i = 0; i < out_size / 2; i++) { - uint32_t ref = (i % (N / 2)) + 2; - if (*(bufOut + i) != ref) { - std::cout << "error at index[" << i << "]: expected " << ref << " got " - << *(bufOut + i) << std::endl; - errors++; - } - } - for (uint32_t i = out_size / 2; i < out_size; i++) { - uint32_t ref = (i % (N / 2)) + (N / 2) + 3; - if (*(bufOut + i) != ref) { - std::cout << "error at index[" << i << "]: expected " << ref << " got " - << *(bufOut + i) << std::endl; - errors++; - } - } - - if (!errors) { - std::cout << std::endl << "PASS!" << std::endl << std::endl; - return 0; - } else { - std::cout << std::endl - << errors << " mismatches." << std::endl - << std::endl; - std::cout << std::endl << "fail." << std::endl << std::endl; - return 1; - } -} \ No newline at end of file diff --git a/programming_examples/basic/repeat/simple_repeat/CMakeLists.txt b/programming_examples/basic/repeat/simple_repeat/CMakeLists.txt deleted file mode 100644 index 5da03ef2b2..0000000000 --- a/programming_examples/basic/repeat/simple_repeat/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 proj_${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/basic/repeat/simple_repeat/Makefile b/programming_examples/basic/repeat/simple_repeat/Makefile deleted file mode 100644 index 1461af0f86..0000000000 --- a/programming_examples/basic/repeat/simple_repeat/Makefile +++ /dev/null @@ -1,69 +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 -# -##===----------------------------------------------------------------------===## - -srcdir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) - -include ${srcdir}/../../../makefile-common - -all: build/final.xclbin build/insts.txt - -devicename ?= npu -targetname = simple_repeat -LENGTH ?= 4096 - -build/aie.mlir: ${srcdir}/aie2.py - mkdir -p ${@D} - python3 $< ${LENGTH} ${devicename} ${col} > $@ - -.PHONY: inst/insts.txt -inst/insts.txt: ${srcdir}/aie2.py - rm -rf inst - mkdir -p inst - python3 $< ${LENGTH} > inst/aie.mlir - pushd inst && aiecc.py --aie-only-generate-npu --npu-insts-name=insts.txt aie.mlir && popd - ${powershell} ./build/${targetname}.exe -x build/final.xclbin -i inst/insts.txt -k MLIR_AIE -l ${LENGTH} - -build/final.xclbin: build/aie.mlir - 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: ${srcdir}/test.cpp - rm -rf _build - mkdir -p _build - cd _build && ${powershell} cmake ${srcdir} -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 -l ${LENGTH} - -# Changing variables when we target VCK5000 -vck5000: devicename=xcvc1902 -vck5000: col=6 - -vck5000: build/aie.mlir - aiecc.py --link_against_hsa --host-target=x86_64-amd-linux-gnu build/aie.mlir \ - -I/opt/xaiengine/include \ - -I${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/include \ - -L/opt/xaiengine/lib \ - -L/lib/x86_64-linux-gnu/ \ - ${srcdir}/test_vck5000.cpp \ - ${srcdir}/../../../../install/runtime_lib/x86_64-hsa/test_lib/src/test_library.cpp \ - -Wl,-R/opt/xaiengine/lib \ - -Wl,--whole-archive -Wl,--no-whole-archive -lstdc++ -ldl -lelf -o test.elf - -run_vck5000: - test.elf - -clean: - rm -rf build _build inst ${targetname}.exe diff --git a/programming_examples/basic/repeat/simple_repeat/README.md b/programming_examples/basic/repeat/simple_repeat/README.md deleted file mode 100644 index 46ae72db7a..0000000000 --- a/programming_examples/basic/repeat/simple_repeat/README.md +++ /dev/null @@ -1,29 +0,0 @@ - - -# Simple Repeat - -This reference design can be run on a Ryzen™ AI NPU. - -In the [design](./aie2.py) data is brought from external memory via the `ShimTile` to the `MemTile` and back by using an implicit copy via the compute tile's Data Movement Accelerator (DMA). Furthermore, the input data is repeated by the `MemTile` three times which results in the output data consisting of four instances of the input data. - -The implicit copy is performed using the `object_fifo_link` operation that specifies how input data arriving via `of_in` should be sent further via `of_out` by specifically leveraging the compute tile's DMA. This operation and its functionality are described in more depth in [Section-2b](../../../programming_guide/section-2/section-2b/03_Link_Distribute_Join/README.md#object-fifo-link) of the programming guide. - -The repeat count is specified as follows: -```python -of_out.set_memtile_repeat(memtile_repeat_count) -``` -Specifically, the instruction above specifies the number of repetitions that the producer side of the `of_out` objectfifo should do. - -To compile and run the design for NPU: -``` -make -make run -``` diff --git a/programming_examples/basic/repeat/simple_repeat/aie2.py b/programming_examples/basic/repeat/simple_repeat/aie2.py deleted file mode 100644 index 748497b664..0000000000 --- a/programming_examples/basic/repeat/simple_repeat/aie2.py +++ /dev/null @@ -1,78 +0,0 @@ -# repeat/simple_repeat/aie2.py -*- Python -*- -# -# 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 2024 AMD Inc. - -# REQUIRES: ryzen_ai, valid_xchess_license -# -# RUN: %python %S/aie2.py 4096 > ./aie2.mlir -# RUN: %python aiecc.py --no-aiesim --aie-generate-cdo --aie-generate-npu --aie-generate-xclbin --no-compile-host --xclbin-name=final.xclbin --npu-insts-name=insts.txt ./aie2.mlir -# RUN: clang %S/test.cpp -o test.exe -std=c++17 -Wall %xrt_flags -lrt -lstdc++ %test_utils_flags -# RUN: %run_on_npu ./test.exe -x final.xclbin -i insts.txt -k MLIR_AIE -l 4096 | FileCheck %s -# CHECK: PASS! -import numpy as np -import sys - -from aie.dialects.aie import * -from aie.dialects.aiex import * -from aie.extras.context import mlir_mod_ctx - -N = 4096 -dev = AIEDevice.npu1_1col -col = 0 -memtile_repeat_count = 4 - -if len(sys.argv) > 1: - N = int(sys.argv[1]) -data_out_size = N * memtile_repeat_count - -if len(sys.argv) > 2: - if sys.argv[2] == "npu": - dev = AIEDevice.npu1_1col - elif sys.argv[2] == "xcvc1902": - dev = AIEDevice.xcvc1902 - else: - raise ValueError("[ERROR] Device name {} is unknown".format(sys.argv[2])) - -if len(sys.argv) > 3: - col = int(sys.argv[3]) - - -def simple_repeat(): - with mlir_mod_ctx() as ctx: - - @device(dev) - def device_body(): - tensor_ty = np.ndarray[(N,), np.dtype[np.int32]] - tensor_out_ty = np.ndarray[(data_out_size,), np.dtype[np.int32]] - - # Tile declarations - ShimTile = tile(col, 0) - MemTile = tile(col, 1) - - # AIE-array data movement with object fifos - of_in = object_fifo("in", ShimTile, MemTile, 1, tensor_ty) - of_out = object_fifo("out", MemTile, ShimTile, 1, tensor_ty) - of_out.set_repeat_count(memtile_repeat_count) - object_fifo_link(of_in, of_out) - - # To/from AIE-array data movement - @runtime_sequence(tensor_ty, tensor_ty, tensor_out_ty) - def sequence(A, B, C): - npu_dma_memcpy_nd(metadata=of_in, bd_id=1, mem=A, sizes=[1, 1, 1, N]) - npu_dma_memcpy_nd( - metadata=of_out, - bd_id=0, - mem=C, - sizes=[1, 1, 1, data_out_size], - ) - # of_out will only complete after of_in completes, so we just wait on of_out instead of both - dma_wait(of_out) - - print(ctx.module) - - -simple_repeat() diff --git a/programming_examples/basic/repeat/simple_repeat/run_makefile.lit b/programming_examples/basic/repeat/simple_repeat/run_makefile.lit deleted file mode 100644 index 6875524001..0000000000 --- a/programming_examples/basic/repeat/simple_repeat/run_makefile.lit +++ /dev/null @@ -1,9 +0,0 @@ -// (c) Copyright 2024 Advanced Micro Devices, Inc. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// REQUIRES: ryzen_ai, chess -// -// RUN: make -f %S/Makefile clean -// RUN: make -f %S/Makefile -// RUN: %run_on_npu make -f %S/Makefile run | FileCheck %s -// CHECK: PASS! diff --git a/programming_examples/basic/repeat/simple_repeat/test.cpp b/programming_examples/basic/repeat/simple_repeat/test.cpp deleted file mode 100644 index 72296936c0..0000000000 --- a/programming_examples/basic/repeat/simple_repeat/test.cpp +++ /dev/null @@ -1,199 +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) 2024, Advanced Micro Devices, Inc. -// -//===----------------------------------------------------------------------===// - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xrt/xrt_bo.h" -#include "xrt/xrt_device.h" -#include "xrt/xrt_kernel.h" - -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"); - } - } -} - -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")( - "length,l", po::value()->default_value(4096), - "the length of the transfer in int32_t")( - "repeat,r", po::value()->default_value(4), - "the memtile repeat count"); - 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 << std::endl; - return 1; - } - } catch (const std::exception &ex) { - std::cerr << ex.what() << "\n\n"; - std::cerr << "Usage:\n" << desc << std::endl; - 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() << std::endl; - - int N = vm["length"].as(); - if ((N % 1024)) { - std::cerr << "Length must be a multiple of 1024." << std::endl; - return 1; - } - int repeat_count = vm["repeat"].as(); - - // 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() - << std::endl; - auto xclbin = xrt::xclbin(vm["xclbin"].as()); - - if (verbosity >= 1) - std::cout << "Kernel opcode: " << vm["kernel"].as() - << std::endl; - 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." << std::endl; - xrt::hw_context context(device, xclbin.get_uuid()); - - // get a kernel handle - if (verbosity >= 1) - std::cout << "Getting handle to kernel:" << kernelName << std::endl; - auto kernel = xrt::kernel(context, kernelName); - - auto bo_instr = xrt::bo(device, instr_v.size() * sizeof(int), - XCL_BO_FLAGS_CACHEABLE, kernel.group_id(1)); - auto bo_inA = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(3)); - auto bo_inB = xrt::bo(device, N * sizeof(int32_t), XRT_BO_FLAGS_HOST_ONLY, - kernel.group_id(4)); - auto bo_out = xrt::bo(device, N * repeat_count * sizeof(int32_t), - XRT_BO_FLAGS_HOST_ONLY, kernel.group_id(5)); - - if (verbosity >= 1) - std::cout << "Writing data into buffer objects." << std::endl; - - int32_t *bufInA = bo_inA.map(); - std::vector srcVecA; - for (int i = 0; i < N; i++) - srcVecA.push_back(i + 1); - memcpy(bufInA, srcVecA.data(), (srcVecA.size() * sizeof(uint32_t))); - - 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_inA.sync(XCL_BO_SYNC_BO_TO_DEVICE); - - if (verbosity >= 1) - std::cout << "Running Kernel." << std::endl; - unsigned int opcode = 3; - auto run = kernel(opcode, bo_instr, instr_v.size(), bo_inA, bo_inB, bo_out); - run.wait(); - - bo_out.sync(XCL_BO_SYNC_BO_FROM_DEVICE); - - uint32_t *bufOut = bo_out.map(); - - int errors = 0; - for (uint32_t i = 0; i < N * repeat_count; i++) { - uint32_t ref = (i % N) + 1; - if (*(bufOut + i) != ref) { - std::cout << "error at index[" << i << "]: expected " << ref << " got " - << *(bufOut + i) << std::endl; - errors++; - } - } - - if (!errors) { - std::cout << std::endl << "PASS!" << std::endl << std::endl; - return 0; - } else { - std::cout << std::endl - << errors << " mismatches." << std::endl - << std::endl; - std::cout << std::endl << "fail." << std::endl << std::endl; - return 1; - } -} diff --git a/test/npu-xrt/objectfifo_repeat/compute_repeat/CMakeLists.txt b/test/npu-xrt/objectfifo_repeat/compute_repeat/CMakeLists.txt deleted file mode 100644 index 5da03ef2b2..0000000000 --- a/test/npu-xrt/objectfifo_repeat/compute_repeat/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 proj_${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/test/npu-xrt/objectfifo_repeat/distribute_repeat/CMakeLists.txt b/test/npu-xrt/objectfifo_repeat/distribute_repeat/CMakeLists.txt deleted file mode 100644 index 5da03ef2b2..0000000000 --- a/test/npu-xrt/objectfifo_repeat/distribute_repeat/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 proj_${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/test/npu-xrt/objectfifo_repeat/simple_repeat/CMakeLists.txt b/test/npu-xrt/objectfifo_repeat/simple_repeat/CMakeLists.txt deleted file mode 100644 index 5da03ef2b2..0000000000 --- a/test/npu-xrt/objectfifo_repeat/simple_repeat/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 proj_${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() From b26795dc3cf624d507d16f00a964a19eaac93b8b Mon Sep 17 00:00:00 2001 From: Erika Hunhoff Date: Mon, 21 Oct 2024 11:24:57 -0600 Subject: [PATCH 14/18] Remove unused makefiles --- .../objectfifo_repeat/compute_repeat/Makefile | 51 ------------------- .../distribute_repeat/Makefile | 51 ------------------- .../objectfifo_repeat/simple_repeat/Makefile | 51 ------------------- 3 files changed, 153 deletions(-) delete mode 100644 test/npu-xrt/objectfifo_repeat/compute_repeat/Makefile delete mode 100644 test/npu-xrt/objectfifo_repeat/distribute_repeat/Makefile delete mode 100644 test/npu-xrt/objectfifo_repeat/simple_repeat/Makefile diff --git a/test/npu-xrt/objectfifo_repeat/compute_repeat/Makefile b/test/npu-xrt/objectfifo_repeat/compute_repeat/Makefile deleted file mode 100644 index 43d3fad014..0000000000 --- a/test/npu-xrt/objectfifo_repeat/compute_repeat/Makefile +++ /dev/null @@ -1,51 +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 -# -##===----------------------------------------------------------------------===## - -srcdir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) - -include ${srcdir}/../../makefile-common - -all: build/final.xclbin build/insts.txt - -devicename ?= npu -targetname = compute_repeat -LENGTH ?= 4096 - -build/aie.mlir: ${srcdir}/aie2.py - mkdir -p ${@D} - python3 $< ${LENGTH} ${devicename} ${col} > $@ - -.PHONY: inst/insts.txt -inst/insts.txt: ${srcdir}/aie2.py - rm -rf inst - mkdir -p inst - python3 $< ${LENGTH} > inst/aie.mlir - pushd inst && aiecc.py --aie-only-generate-npu --npu-insts-name=insts.txt aie.mlir && popd - ${powershell} ./build/${targetname}.exe -x build/final.xclbin -i inst/insts.txt -k MLIR_AIE -l ${LENGTH} - -build/final.xclbin: build/aie.mlir - 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: ${srcdir}/test.cpp - rm -rf _build - mkdir -p _build - cd _build && ${powershell} cmake ${srcdir} -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 -l ${LENGTH} - -clean: - rm -rf build _build inst ${targetname}.exe diff --git a/test/npu-xrt/objectfifo_repeat/distribute_repeat/Makefile b/test/npu-xrt/objectfifo_repeat/distribute_repeat/Makefile deleted file mode 100644 index eb858fc3b9..0000000000 --- a/test/npu-xrt/objectfifo_repeat/distribute_repeat/Makefile +++ /dev/null @@ -1,51 +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 -# -##===----------------------------------------------------------------------===## - -srcdir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) - -include ${srcdir}/../../makefile-common - -all: build/final.xclbin build/insts.txt - -devicename ?= npu -targetname = distribute_repeat -LENGTH ?= 36 - -build/aie.mlir: ${srcdir}/aie2.py - mkdir -p ${@D} - python3 $< ${LENGTH} ${devicename} ${col} > $@ - -.PHONY: inst/insts.txt -inst/insts.txt: ${srcdir}/aie2.py - rm -rf inst - mkdir -p inst - python3 $< ${LENGTH} > inst/aie.mlir - pushd inst && aiecc.py --aie-only-generate-npu --npu-insts-name=insts.txt aie.mlir && popd - ${powershell} ./build/${targetname}.exe -x build/final.xclbin -i inst/insts.txt -k MLIR_AIE -l ${LENGTH} - -build/final.xclbin: build/aie.mlir - 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: ${srcdir}/test.cpp - rm -rf _build - mkdir -p _build - cd _build && ${powershell} cmake ${srcdir} -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 -l ${LENGTH} - -clean: - rm -rf build _build inst ${targetname}.exe diff --git a/test/npu-xrt/objectfifo_repeat/simple_repeat/Makefile b/test/npu-xrt/objectfifo_repeat/simple_repeat/Makefile deleted file mode 100644 index e143435724..0000000000 --- a/test/npu-xrt/objectfifo_repeat/simple_repeat/Makefile +++ /dev/null @@ -1,51 +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 -# -##===----------------------------------------------------------------------===## - -srcdir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) - -include ${srcdir}/../../makefile-common - -all: build/final.xclbin build/insts.txt - -devicename ?= npu -targetname = simple_repeat -LENGTH ?= 4096 - -build/aie.mlir: ${srcdir}/aie2.py - mkdir -p ${@D} - python3 $< ${LENGTH} ${devicename} ${col} > $@ - -.PHONY: inst/insts.txt -inst/insts.txt: ${srcdir}/aie2.py - rm -rf inst - mkdir -p inst - python3 $< ${LENGTH} > inst/aie.mlir - pushd inst && aiecc.py --aie-only-generate-npu --npu-insts-name=insts.txt aie.mlir && popd - ${powershell} ./build/${targetname}.exe -x build/final.xclbin -i inst/insts.txt -k MLIR_AIE -l ${LENGTH} - -build/final.xclbin: build/aie.mlir - 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: ${srcdir}/test.cpp - rm -rf _build - mkdir -p _build - cd _build && ${powershell} cmake ${srcdir} -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 -l ${LENGTH} - -clean: - rm -rf build _build inst ${targetname}.exe From aafda433037ba62975a3af3c36e86cee52cbd262 Mon Sep 17 00:00:00 2001 From: AndraBisca Date: Mon, 21 Oct 2024 11:48:46 -0600 Subject: [PATCH 15/18] Update READMEs --- .../npu-xrt/objectfifo_repeat/compute_repeat/README.md | 10 ++-------- .../objectfifo_repeat/distribute_repeat/README.md | 8 +------- test/npu-xrt/objectfifo_repeat/simple_repeat/README.md | 10 ++-------- 3 files changed, 5 insertions(+), 23 deletions(-) diff --git a/test/npu-xrt/objectfifo_repeat/compute_repeat/README.md b/test/npu-xrt/objectfifo_repeat/compute_repeat/README.md index 7567d94f74..ccacccba88 100644 --- a/test/npu-xrt/objectfifo_repeat/compute_repeat/README.md +++ b/test/npu-xrt/objectfifo_repeat/compute_repeat/README.md @@ -1,4 +1,4 @@ -