New Package: intel-graphics-compiler
This commit is contained in:
parent
93e551dbe9
commit
4b29f70498
6 changed files with 202 additions and 0 deletions
1
srcpkgs/intel-graphics-compiler-devel
Symbolic link
1
srcpkgs/intel-graphics-compiler-devel
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
intel-graphics-compiler
|
1
srcpkgs/intel-graphics-compiler/intel-graphics-compiler
Symbolic link
1
srcpkgs/intel-graphics-compiler/intel-graphics-compiler
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
intel-graphics-compiler
|
|
@ -0,0 +1,51 @@
|
||||||
|
From 12332c1ee8e92238c919ad7c2aa36119259cb622 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Artem Gindinson <artem.gindinson@intel.com>
|
||||||
|
Date: Thu, 30 Jun 2022 10:22:31 +0000
|
||||||
|
Subject: [PATCH] Avoid duplicate entries into !opencl.kernels metadata with
|
||||||
|
LLVM 14
|
||||||
|
|
||||||
|
The LLVM 14 version of the SPIR-V Translator (and, consequently, OpenCL Clang)
|
||||||
|
introduces the kernel entry point wrappers functionality (see commit KhronosGroup/SPIRV-LLVM-Translator@85815e7).
|
||||||
|
As IGC's SPIR-V Reader collects root nodes for kernel argument metadata into
|
||||||
|
the `!opencl.kernels` module metadata, it treats SPIR-V entry point wrappers as
|
||||||
|
separate kernels despite that they are mapped onto the same LLVM function.
|
||||||
|
Consequently, each LLVM IR kernel function recieves a "duplicate" set of kernel
|
||||||
|
argument metadata, which breaks our kernel argument analysis passes upon a
|
||||||
|
switch to LLVM 14.
|
||||||
|
|
||||||
|
Do not update the module metadata upon encountering previously seen LLVM
|
||||||
|
functions.
|
||||||
|
|
||||||
|
This fixes https://github.com/intel/intel-graphics-compiler/issues/245.
|
||||||
|
---
|
||||||
|
IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp b/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp
|
||||||
|
index 708d96edd97..33441cf620c 100644
|
||||||
|
--- a/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp
|
||||||
|
+++ b/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp
|
||||||
|
@@ -58,6 +58,7 @@ THE SOFTWARE.
|
||||||
|
#include <llvm/Support/ScaledNumber.h>
|
||||||
|
#include <llvm/IR/IntrinsicInst.h>
|
||||||
|
#include <llvm/Analysis/CFG.h>
|
||||||
|
+#include <llvm/ADT/SmallSet.h>
|
||||||
|
#include "libSPIRV/SPIRVDebugInfoExt.h"
|
||||||
|
#include "llvmWrapper/Transforms/Utils/Cloning.h"
|
||||||
|
#include "common/LLVMWarningsPop.hpp"
|
||||||
|
@@ -4706,11 +4707,15 @@ SPIRVToLLVM::transKernelMetadata()
|
||||||
|
transCapsIntoMetadata(MD);
|
||||||
|
|
||||||
|
NamedMDNode *KernelMDs = M->getOrInsertNamedMetadata(SPIR_MD_KERNELS);
|
||||||
|
+ SmallSet<Function*, 16> HandledLLVMKernels;
|
||||||
|
for (unsigned I = 0, E = BM->getNumFunctions(); I != E; ++I)
|
||||||
|
{
|
||||||
|
SPIRVFunction *BF = BM->getFunction(I);
|
||||||
|
Function *F = static_cast<Function *>(getTranslatedValue(BF));
|
||||||
|
IGC_ASSERT_MESSAGE(F, "Invalid translated function");
|
||||||
|
+ if (HandledLLVMKernels.count(F))
|
||||||
|
+ continue;
|
||||||
|
+ HandledLLVMKernels.insert(F);
|
||||||
|
|
||||||
|
// __attribute__((annotate("some_user_annotation"))) are passed via
|
||||||
|
// UserSemantic decoration on functions.
|
|
@ -0,0 +1,14 @@
|
||||||
|
--- a/IGC/cmake/igc_find_liblldELF.cmake
|
||||||
|
+++ b/IGC/cmake/igc_find_liblldELF.cmake
|
||||||
|
@@ -136,6 +136,11 @@ elseif(IGC_BUILD__LLVM_PREBUILDS)
|
||||||
|
${LLD_ELF_LLVM_DEPS}
|
||||||
|
lldCommon)
|
||||||
|
|
||||||
|
+ if(LLVM_ENABLE_ZLIB)
|
||||||
|
+ find_package(ZLIB)
|
||||||
|
+ target_link_libraries(lldELF INTERFACE ZLIB::ZLIB)
|
||||||
|
+ endif()
|
||||||
|
+
|
||||||
|
find_path(
|
||||||
|
LLD_INCLUDE_DIR
|
||||||
|
NAMES "Driver.h"
|
|
@ -0,0 +1,76 @@
|
||||||
|
From 6a13fa903f380e17378286a7cd43995b0ae162ad Mon Sep 17 00:00:00 2001
|
||||||
|
From: Artem Gindinson <artem.gindinson@intel.com>
|
||||||
|
Date: Thu, 7 Jul 2022 08:49:48 +0000
|
||||||
|
Subject: [PATCH] Rework kernel metadata handling in SPIR-V Reader
|
||||||
|
|
||||||
|
After the introduction of kernel entry point wrappers within
|
||||||
|
KhronosGroup/SPIRV-LLVM-Translator@85815e7, initial approach to avoiding kernel
|
||||||
|
metadata duplication within our internal SPIR-V consumer has been to skip
|
||||||
|
metadata generation whenever we encounter the entry point kernel (we would
|
||||||
|
assume that all necessary metadata had already been assigned to the LLVM
|
||||||
|
function upon encountering the "actual" SPIR-V kernel). For more details on the
|
||||||
|
initial approach, see intel/intel-graphics-compiler@12332c1.
|
||||||
|
|
||||||
|
The change, however, did not take into account that all SPIR-V information
|
||||||
|
regarding the kernel execution mode was being stored exclusively for the entry
|
||||||
|
point wrapper kernel. Therefore, by skipping the SPIR-V entry point wrappers we
|
||||||
|
end up losing certain metadata entries, e.g. "required WG size".
|
||||||
|
|
||||||
|
Assume that the entry point wrappers contain fuller information and generate
|
||||||
|
LLVM metadata based on these SPIR-V functions instead. This fixes kernel
|
||||||
|
attributes' lowering with LLVM 14.
|
||||||
|
|
||||||
|
An alternative SPIR-V Reader solution would imply copying over all SPIR-V
|
||||||
|
information from entry point wrappers to the actual kernel body, and then
|
||||||
|
dropping entry point wrappers from the `SPIRVModule`'s/`SPIRVToLLVM`'s
|
||||||
|
function collections.
|
||||||
|
---
|
||||||
|
IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp | 16 +++++++++++-----
|
||||||
|
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp b/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp
|
||||||
|
index 33441cf620c..29d098d7337 100644
|
||||||
|
--- a/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp
|
||||||
|
+++ b/IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp
|
||||||
|
@@ -58,7 +58,6 @@ THE SOFTWARE.
|
||||||
|
#include <llvm/Support/ScaledNumber.h>
|
||||||
|
#include <llvm/IR/IntrinsicInst.h>
|
||||||
|
#include <llvm/Analysis/CFG.h>
|
||||||
|
-#include <llvm/ADT/SmallSet.h>
|
||||||
|
#include "libSPIRV/SPIRVDebugInfoExt.h"
|
||||||
|
#include "llvmWrapper/Transforms/Utils/Cloning.h"
|
||||||
|
#include "common/LLVMWarningsPop.hpp"
|
||||||
|
@@ -4707,15 +4706,11 @@ SPIRVToLLVM::transKernelMetadata()
|
||||||
|
transCapsIntoMetadata(MD);
|
||||||
|
|
||||||
|
NamedMDNode *KernelMDs = M->getOrInsertNamedMetadata(SPIR_MD_KERNELS);
|
||||||
|
- SmallSet<Function*, 16> HandledLLVMKernels;
|
||||||
|
for (unsigned I = 0, E = BM->getNumFunctions(); I != E; ++I)
|
||||||
|
{
|
||||||
|
SPIRVFunction *BF = BM->getFunction(I);
|
||||||
|
Function *F = static_cast<Function *>(getTranslatedValue(BF));
|
||||||
|
IGC_ASSERT_MESSAGE(F, "Invalid translated function");
|
||||||
|
- if (HandledLLVMKernels.count(F))
|
||||||
|
- continue;
|
||||||
|
- HandledLLVMKernels.insert(F);
|
||||||
|
|
||||||
|
// __attribute__((annotate("some_user_annotation"))) are passed via
|
||||||
|
// UserSemantic decoration on functions.
|
||||||
|
@@ -4727,6 +4722,17 @@ SPIRVToLLVM::transKernelMetadata()
|
||||||
|
|
||||||
|
if (F->getCallingConv() != CallingConv::SPIR_KERNEL || F->isDeclaration())
|
||||||
|
continue;
|
||||||
|
+ // Kernel entry point wrappers and SPIR-V functions with actual kernel
|
||||||
|
+ // body resolve to the same LLVM functions. Only generate metadata upon
|
||||||
|
+ // encountering entry point wrappers, as SPIR-V stores all execution
|
||||||
|
+ // mode information at the entry point wrapper site.
|
||||||
|
+ // TODO: Instead, consider copying all SPIR-V function information from
|
||||||
|
+ // entry point wrappers to the actual SPIR-V funtions, and then
|
||||||
|
+ // erasing entry point wrappers as such from the SPIRVModule/
|
||||||
|
+ // SPIRVToLLVM classes. Preferably, such a rework should be done in the
|
||||||
|
+ // Khronos SPIR-V Translator and then downstreamed.
|
||||||
|
+ if (!isOpenCLKernel(BF))
|
||||||
|
+ continue;
|
||||||
|
std::vector<llvm::Metadata*> KernelMD;
|
||||||
|
KernelMD.push_back(ValueAsMetadata::get(F));
|
||||||
|
|
59
srcpkgs/intel-graphics-compiler/template
Normal file
59
srcpkgs/intel-graphics-compiler/template
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# Template file for 'intel-graphics-compiler'
|
||||||
|
pkgname=intel-graphics-compiler
|
||||||
|
version=1.0.12260.1
|
||||||
|
revision=1
|
||||||
|
wrksrc=${pkgname}-igc-${version}
|
||||||
|
build_style=cmake
|
||||||
|
configure_args="-DIGC_OPTION__LLVM_PREFERRED_VERSION='12.0.1' \
|
||||||
|
-DIGC_OPTION__LINK_KHRONOS_SPIRV_TRANSLATOR=ON \
|
||||||
|
-DIGC_OPTION__CLANG_MODE=Prebuilds \
|
||||||
|
-DIGC_OPTION__LLD_MODE=Prebuilds \
|
||||||
|
-DIGC_OPTION__LLVM_MODE=Prebuilds \
|
||||||
|
-DIGC_OPTION__USE_PREINSTALLED_SPIRV_HEADERS=ON \
|
||||||
|
-DIGC_OPTION__SPIRV_TOOLS_MODE=Sources \
|
||||||
|
-DIGC_OPTION__SPIRV_TRANSLATOR_MODE=Prebuilds \
|
||||||
|
-DIGC_OPTION__VC_INTRINSICS_MODE=Prebuilds \
|
||||||
|
-DINSTALL_GENX_IR=ON \
|
||||||
|
-Wno-dev"
|
||||||
|
repository="cereus-extra"
|
||||||
|
makedepends="git clang lld-devel llvm python3-devel libunwind-devel SPIRV-Headers clang-tools-extra libxml2-devel zlib-devel SPIRV-LLVM-Translator-devel SPIRV-Tools-devel vc-intrinsics protobuf-devel libprotoc-devel intel-opencl-clang bison flex"
|
||||||
|
depends="libllvm12 ncurses SPIRV-Tools zlib"
|
||||||
|
short_desc="Intel Graphics Compiler for OpenCL"
|
||||||
|
maintainer="KF-Art <https://github.com/KF-Art>"
|
||||||
|
license="MIT"
|
||||||
|
homepage="https://github.com/intel/intel-graphics-compiler"
|
||||||
|
changelog="${homepage}/releases/tag/igc-${version}"
|
||||||
|
distfiles="${homepage}/archive/igc-${version}.tar.gz"
|
||||||
|
_spirv_url="https://github.com/KhronosGroup"
|
||||||
|
checksum=5079e8a01fc64c167ca6f96d0087513406664b9e8692d56479f7c69c19253d5d
|
||||||
|
|
||||||
|
post_extract() {
|
||||||
|
# Clone extra required build dependencies
|
||||||
|
# As for now, the compiler does not detect the prebuilt SPIRV-Tools and Headers.
|
||||||
|
|
||||||
|
if [ -d ../SPIRV-* ]; then
|
||||||
|
rm -rf ../SPIRV-*
|
||||||
|
fi
|
||||||
|
|
||||||
|
for repo in Tools Headers; do
|
||||||
|
git -C ../ clone ${_spirv_url}/SPIRV-${repo}.git
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
post_install() {
|
||||||
|
vlicense LICENSE.md
|
||||||
|
vlicense ${DESTDIR}/usr/lib/igc/NOTICES.txt
|
||||||
|
|
||||||
|
# Remove SPIRV builddir
|
||||||
|
rm -rf ../SPIRV*
|
||||||
|
}
|
||||||
|
|
||||||
|
intel-graphics-compiler-devel_package() {
|
||||||
|
depends="${sourcepkg}>=${version}_${revision}"
|
||||||
|
short_desc+=" - development files"
|
||||||
|
pkg_install() {
|
||||||
|
vmove usr/include
|
||||||
|
vmove usr/lib/pkgconfig
|
||||||
|
vmove usr/lib/*.so
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue