Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] use peano for ukernels #731

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions build_tools/ci/run_matmul_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ function run_matmul_test() {

local amd_aie_install_path="${IREE_INSTALL_DIR}"

local vitis_path="${VITIS}"
local vitis_path=""

local use_chess="false"

Expand Down Expand Up @@ -540,16 +540,15 @@ run_matmul_test \
# MLIR-AIR Matmul tests
###################################################################

if [ -d "$VITIS" ]; then
run_matmul_test \
--name_prefix "ukern" \
--lower_to_aie_pipeline "air" \
--tile_pipeline "pad-pack" \
--lhs_rhs_type "bf16" \
--acc_type "f32" \
--m "256" --k "256" --n "256" \
--use_ukernel "1"
fi
run_matmul_test \
--name_prefix "ukern" \
--lower_to_aie_pipeline "air" \
--tile_pipeline "pad-pack" \
--lhs_rhs_type "bf16" \
--acc_type "f32" \
--m "256" --k "256" --n "256" \
--vitis_path "${VITIS}" \
--use_ukernel "1"

# Example of a run with a group of 2+ matmuls. Currently this test is passed
# the flag '--num_repeat_runs 0" as there is currently an issue with the runtime if
Expand Down Expand Up @@ -720,6 +719,7 @@ if [ -d "$VITIS" ]; then
--lhs_rhs_type "bf16" \
--acc_type "f32" \
--num_repeat_runs "2" \
--vitis_path "${VITIS}" \
--use_ukernel "1"

run_matmul_test_on_shapes ${bf16_ukernel_shapes_medium[@]} \
Expand All @@ -729,6 +729,7 @@ if [ -d "$VITIS" ]; then
--lhs_rhs_type "bf16" \
--acc_type "f32" \
--num_repeat_runs "2" \
--vitis_path "${VITIS}" \
--use_ukernel "1"
fi

Expand All @@ -746,6 +747,7 @@ if [ -d "$VITIS" ]; then
--n "32" \
--k "32" \
--use_chess "1" \
--vitis_path "${VITIS}" \
--num_repeat_runs "10"

run_matmul_test \
Expand All @@ -757,6 +759,7 @@ if [ -d "$VITIS" ]; then
--k "64" \
--use_chess "1" \
--num_repeat_runs "10" \
--vitis_path "${VITIS}" \
--use_ukernel "1"

run_matmul_test \
Expand All @@ -769,6 +772,7 @@ if [ -d "$VITIS" ]; then
--n "32" \
--k "32" \
--use_chess "1" \
--vitis_path "${VITIS}" \
--num_repeat_runs "10"

fi
Expand Down
2 changes: 1 addition & 1 deletion build_tools/download_peano.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/bin/bash

RELEASE=19.0.0.2024082221+90abe71b
RELEASE=19.0.0.2024083101+42158757
pip download llvm_aie==$RELEASE -f https://github.com/Xilinx/llvm-aie/releases/expanded_assets/nightly
unzip llvm_aie*whl
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ iree_cc_library(
NAME
AIETargets
SRCS
"AMDAIETargetBCF.cpp"
"AMDAIETargetCDODirect.cpp"
"AMDAIETargetLdScript.cpp"
"XCLBinGen.cpp"
AMDAIETargetBCF.cpp
AMDAIETargetCDODirect.cpp
AMDAIETargetLdScript.cpp
PeanoDriver.cpp
XCLBinGen.cpp
DEPS
iree-amd-aie::aie_runtime::iree_aie_runtime_static
iree::target::amd-aie::Transforms
Expand All @@ -28,9 +29,9 @@ iree_cc_library(
NAME
Target
HDRS
"AIETarget.h"
AIETarget.h
SRCS
"AIETarget.cpp"
AIETarget.cpp
DEPS
::AIETargets
iree-amd-aie::schemas::xrt_executable_def_c_fbs
Expand Down
106 changes: 106 additions & 0 deletions compiler/plugins/target/AMD-AIE/iree-amd-aie/Target/PeanoDriver.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Copyright 2024 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include "PeanoDriver.h"

#include <filesystem>
#include <string>
#include <vector>

#include "llvm/Support/Error.h"

using Path = std::filesystem::path;

void addExternCSystemInclude(std::vector<std::string> &CC1Args,
const std::string &Path) {
CC1Args.push_back("-internal-externc-isystem");
CC1Args.push_back(Path);
}

void addSystemInclude(std::vector<std::string> &CC1Args,
const std::string &Path) {
CC1Args.push_back("-internal-isystem");
CC1Args.push_back(Path);
}

void AddClangSystemIncludeArgs(std::vector<std::string> &CC1Args,
const Path &peanoDir, const std::string &target,
bool novitisheaders, bool nostdlibinc) {
// Always include our instrinsics, for compatibility with existing toolchain.
if (!novitisheaders) {
std::string path;
if (target.rfind("aie2-", 0) == 0) {
path = peanoDir / "lib" / "clang" / "19" / "include" / "aiev2intrin.h";
} else {
llvm::report_fatal_error(("unsupported target: " + target).c_str());
}
CC1Args.push_back("-include");
CC1Args.push_back(path);
}

CC1Args.push_back("-D__AIENGINE__");
if (target.rfind("aie2-", 0) == 0) {
CC1Args.push_back("-D__AIEARCH__=20");
} else {
llvm::report_fatal_error(("unsupported target: " + target).c_str());
}

// Don't pull in system headers from /usr/include or /usr/local/include.
// All the basic headers that we need come from the compiler.
CC1Args.push_back("-nostdsysteminc");

if (nostdlibinc) return;
addExternCSystemInclude(CC1Args, peanoDir / "include" / target);
}

void addLibCxxIncludePaths(std::vector<std::string> &CC1Args,
const Path &peanoDir, const std::string &target,
bool nostdinc, bool nostdlibinc, bool nostdincxx) {
if (nostdinc || nostdlibinc || nostdincxx) return;
addSystemInclude(CC1Args, peanoDir / "include" / target / "c++" / "v1");
// Second add the generic one.
addSystemInclude(CC1Args, peanoDir / "include" / "c++" / "v1");
}

void addOptTargetOptions(std::vector<std::string> &CC1Args) {
// For now, we disable the auto-vectorizers by default, as the backend cannot
// handle many vector types. For experimentation the vectorizers can still be
// enabled explicitly by the user
CC1Args.push_back("-vectorize-loops=false");
CC1Args.push_back("-vectorize-slp=false");
// An if-then-else cascade requires at least 5 delay slots for evaluating the
// condition and 5 delay slots for one of the branches, thus speculating 10
// instructions should be fine
CC1Args.push_back("--two-entry-phi-node-folding-threshold=10");
// Make sure to perform most optimizations before mandatory inlinings,
// otherwise noalias attributes can get lost and hurt AA results.
CC1Args.push_back("-mandatory-inlining-before-opt=false");
// Perform complete AA analysis on phi nodes.
CC1Args.push_back("-basic-aa-full-phi-analysis=true");
// Extend the max limit of the search depth in BasicAA
CC1Args.push_back("-basic-aa-max-lookup-search-depth=10");
}

void addClangTargetOptions(std::vector<std::string> &CC1Args,
const std::string &target) {
CC1Args.push_back("-triple");
CC1Args.push_back(target);
CC1Args.push_back("-fno-use-init-array");
// Pass -fno-threadsafe-statics to prevent dependence on lock acquire/release
// handling for static local variables.
CC1Args.push_back("-fno-threadsafe-statics");
std::vector<std::string> peanoArgs;
addOptTargetOptions(peanoArgs);
CC1Args.reserve(CC1Args.size() + 2 * peanoArgs.size());
for (const std::string &item : peanoArgs) {
CC1Args.emplace_back("-mllvm");
CC1Args.emplace_back(item);
}
}

// Avoid using newer dwarf versions, as the simulator doesn't understand newer
// dwarf.
unsigned getMaxDwarfVersion() { return 4; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright 2024 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include <filesystem>
#include <string>
#include <vector>

#include "llvm/Support/Error.h"

void AddClangSystemIncludeArgs(std::vector<std::string> &CC1Args,
const std::filesystem::path &peanoDir,
const std::string &target,
bool novitisheaders = false,
bool nostdlibinc = false);

void addLibCxxIncludePaths(std::vector<std::string> &CC1Args,
const std::filesystem::path &peanoDir,
const std::string &target, bool nostdinc = false,
bool nostdlibinc = false, bool nostdincxx = false);

void addOptTargetOptions(std::vector<std::string> &CC1Args);
void addClangTargetOptions(std::vector<std::string> &CC1Args,
const std::string &target);

unsigned getMaxDwarfVersion();
Loading
Loading