Skip to content

Commit

Permalink
[WIP] use peano for kernels
Browse files Browse the repository at this point in the history
fixes #637
  • Loading branch information
makslevental committed Aug 31, 2024
1 parent 37bb7f1 commit 5e2f81d
Show file tree
Hide file tree
Showing 6 changed files with 237 additions and 109 deletions.
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
105 changes: 105 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,105 @@
// 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.emplace_back("--target=" + 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; }
28 changes: 28 additions & 0 deletions compiler/plugins/target/AMD-AIE/iree-amd-aie/Target/PeanoDriver.h
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

0 comments on commit 5e2f81d

Please sign in to comment.