Skip to content

Commit

Permalink
Add SPIRV-LLVM-Translator and translation pass
Browse files Browse the repository at this point in the history
  • Loading branch information
ShengYang1 committed Apr 11, 2024
1 parent b090636 commit a1db193
Show file tree
Hide file tree
Showing 7 changed files with 178 additions and 1 deletion.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
cc_library(
name = "spirv_llvm_translator",
srcs = glob([
"lib/SPIRV/libSPIRV/*.cpp",
"lib/SPIRV/libSPIRV/*.hpp",
"lib/SPIRV/libSPIRV/*.h",
"lib/SPIRV/Mangler/*.cpp",
"lib/SPIRV/Mangler/*.h",
"lib/SPIRV/*.cpp",
"lib/SPIRV/*.hpp",
"lib/SPIRV/*.h",
]),
hdrs = glob(["include/*"]),
includes = [
"include/",
"lib/SPIRV/",
"lib/SPIRV/Mangler/",
"lib/SPIRV/libSPIRV/",
],
visibility = ["//visibility:public"],
deps = [
"@llvm-project//llvm:Analysis",
"@llvm-project//llvm:BitWriter",
"@llvm-project//llvm:CodeGen",
"@llvm-project//llvm:Core",
"@llvm-project//llvm:Demangle",
"@llvm-project//llvm:IRReader",
"@llvm-project//llvm:Linker",
"@llvm-project//llvm:Passes",
"@llvm-project//llvm:Support",
"@llvm-project//llvm:TransformUtils",
"@spirv_headers//:spirv_cpp_headers",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
diff --git a/lib/SPIRV/SPIRVInternal.h b/lib/SPIRV/SPIRVInternal.h
index a828add8..924e13b4 100644
--- a/lib/SPIRV/SPIRVInternal.h
+++ b/lib/SPIRV/SPIRVInternal.h
@@ -179,11 +179,12 @@ typedef SPIRVMap<Op, Op, IntBoolOpMapId> IntBoolOpMap;
"-v512:512:512-v1024:1024:1024"

enum SPIRAddressSpace {
- SPIRAS_Private,
+ SPIRAS_Generic,
SPIRAS_Global,
- SPIRAS_Constant,
+ SPIRAS_Internal,
SPIRAS_Local,
- SPIRAS_Generic,
+ SPIRAS_Constant,
+ SPIRAS_Private,
SPIRAS_GlobalDevice,
SPIRAS_GlobalHost,
SPIRAS_Input,
16 changes: 16 additions & 0 deletions third_party/tsl/workspace2.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,22 @@ def _tf_repositories():
urls = tf_mirror_urls("https://github.com/google/glog/archive/refs/tags/v0.4.0.tar.gz"),
)

tf_http_archive(
name = "spirv_headers",
sha256 = "1a248f4199f4a30b2e7304ed4d62f731765bab12d9fa4c5abb189a5e2d57f1f5",
strip_prefix = "SPIRV-Headers-1c6bb2743599e6eb6f37b2969acc0aef812e32e3",
urls = tf_mirror_urls("https://github.com/KhronosGroup/SPIRV-Headers/archive/1c6bb2743599e6eb6f37b2969acc0aef812e32e3.tar.gz"),
)

tf_http_archive(
name = "spirv_llvm_translator",
sha256 = "8d33cb29a480457152ce0166bb823fddfba89dea6ce4e7d4eccef7509951f73d",
strip_prefix = "SPIRV-LLVM-Translator-0aab1249acbfb8d206c24988f0974638c290e931",
build_file = "//third_party/spirv_llvm_translator:spirv_llvm_translator.BUILD",
patch_file = ["//third_party/spirv_llvm_translator:spirv_llvm_translator.patch"],
urls = tf_mirror_urls("https://github.com/KhronosGroup/SPIRV-LLVM-Translator/archive/0aab1249acbfb8d206c24988f0974638c290e931.tar.gz"),
)

def workspace():
# Check the bazel version before executing any repository rules, in case
# those rules rely on the version we require here.
Expand Down
6 changes: 6 additions & 0 deletions xla/service/gpu/llvm_gpu_backend/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ load(
"@local_config_rocm//rocm:build_defs.bzl",
"if_rocm_is_configured",
)
load(
"@local_config_sycl//sycl:build_defs.bzl",
"if_sycl_is_configured",
)
load("//xla:xla.bzl", "xla_cc_test")
load("//xla/tsl:tsl.bzl", "internal_visibility")

Expand Down Expand Up @@ -80,6 +84,8 @@ cc_library(
"@local_config_rocm//rocm:rocm_headers",
"@llvm-project//llvm:AMDGPUCodeGen",
"@llvm-project//llvm:AMDGPUAsmParser",
]) + if_sycl_is_configured([
"@spirv_llvm_translator//:spirv_llvm_translator",
]),
)

Expand Down
96 changes: 95 additions & 1 deletion xla/service/gpu/llvm_gpu_backend/gpu_backend_lib.cc
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@ limitations under the License.
#include "third_party/gpus/cuda/include/cuda.h"
#endif

#if TENSORFLOW_USE_SYCL
#include "LLVMSPIRVLib.h"
#include "LLVMSPIRVOpts.h"
#endif // TENSORFLOW_USE_SYCL

namespace xla {
namespace gpu {
namespace {
Expand Down Expand Up @@ -396,7 +401,9 @@ absl::Status LinkAndOptimizeModule(
llvm::CGSCCAnalysisManager cgam;
llvm::ModuleAnalysisManager mam;

fam.registerPass([&] { return target_machine->getTargetIRAnalysis(); });
if (target_machine) {
fam.registerPass([&] { return target_machine->getTargetIRAnalysis(); });
}

llvm::PipelineTuningOptions pto;
pto.SLPVectorization = true;
Expand Down Expand Up @@ -1075,5 +1082,92 @@ absl::StatusOr<std::vector<uint8_t>> CompileToHsaco(

} // namespace amdgpu

namespace {
std::unique_ptr<llvm::TargetMachine> SPIRGetTargetMachine(
llvm::Triple target_triple, se::GpuComputeCapability gpu_version,
const DebugOptions& debug_options) {
return nullptr;
}

absl::Status SPIRTargetModuleLinker(
llvm::Module* module, se::GpuComputeCapability gpu_version,
const DebugOptions& debug_options,
const std::string& device_bitcode_dir_path) {
return OkStatus();
}

absl::StatusOr<std::string> EmitModuleToSpir(
llvm::Module* module, se::GpuComputeCapability gpu_version,
const DebugOptions& debug_options) {
#if TENSORFLOW_USE_SYCL
SPIRV::TranslatorOpts::ExtensionsStatusMap ExtensionsStatus;
SPIRV::TranslatorOpts opts(SPIRV::VersionNumber::MaximumVersion,
ExtensionsStatus);
opts.enableAllExtensions(); // enable all SPIR-V extension first

std::ostringstream oss;
std::string err;
bool success = llvm::writeSpirv(module, opts, oss, err);
if (!success) {
return xla::Internal("Fails to convert LLVM as SPIR-V: %s", err);
}
return oss.str();
#else
return absl::UnimplementedError("Not implemented for SYCL");
#endif
}

void SPIRBackendInit(const DebugOptions& debug_options) {
FeedLLVMWithFlags({"-slp-vectorize-hor=false"});

FeedLLVMWithFlags({
"-slp-min-reg-size=64",
"-slp-max-reg-size=64",
});

llvm_ir::InitializeLLVMCommandLineOptions(
debug_options.xla_backend_extra_options());

llvm::PassRegistry* registry = llvm::PassRegistry::getPassRegistry();
InitializePasses(registry);
}
} // namespace

namespace spir {
absl::StatusOr<std::vector<uint8_t>> CompileToSpir(
llvm::Module* module, se::GpuComputeCapability gpu_version,
const DebugOptions& debug_options) {
std::string libdevice_dir_path;
static absl::once_flag backend_init_flag;
absl::call_once(backend_init_flag, SPIRBackendInit, debug_options);

std::string spir;
{
XLA_SCOPED_LOGGING_TIMER("Compile module " + module->getName().str());

// If the module has no functions or globals, there's nothing to compile.
if (module->empty() && module->global_empty()) {
VLOG(2) << "Module '" << module->getName().str()
<< "' is empty. Skipping compilation.";
return std::vector<uint8_t>();
}

llvm::Triple default_target_triple("spir64-unknown-unknown");
std::unique_ptr<llvm::TargetMachine> target_machine =
SPIRGetTargetMachine(default_target_triple, gpu_version, debug_options);

TF_RETURN_IF_ERROR(LinkAndOptimizeModule(
module, gpu_version, debug_options, libdevice_dir_path,
SPIRTargetModuleLinker, default_target_triple, target_machine.get(),
kDefaultInlineThreshold));

// Lower optimized LLVM module to SPIR.
TF_ASSIGN_OR_RETURN(spir,
EmitModuleToSpir(module, gpu_version, debug_options));
}
return std::vector<uint8_t>(spir.begin(), spir.end());
}
} // namespace spir

} // namespace gpu
} // namespace xla
7 changes: 7 additions & 0 deletions xla/service/gpu/llvm_gpu_backend/gpu_backend_lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@ absl::StatusOr<std::vector<uint8_t>> CompileToHsaco(
const std::string& module_config_cache_key);
} // namespace amdgpu

namespace spir {
// Compiles the argument module and returns it.
absl::StatusOr<std::vector<uint8_t>> CompileToSpir(
llvm::Module* module, se::GpuComputeCapability gpu_version,
const DebugOptions& debug_options);
} // namespace spir

} // namespace gpu
} // namespace xla

Expand Down

0 comments on commit a1db193

Please sign in to comment.