-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add target and compile the amdgpu llvm backend.
- Loading branch information
Showing
11 changed files
with
177 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
compiler/rustc_target/src/spec/targets/amdgcn_amd_amdhsa.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
use crate::spec::{Cc, LinkerFlavor, Lld, PanicStrategy, Target, TargetOptions}; | ||
|
||
pub(crate) fn target() -> Target { | ||
Target { | ||
arch: "amdgpu".into(), | ||
data_layout: "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-p9:192:256:256:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9".into(), | ||
llvm_target: "amdgcn-amd-amdhsa".into(), | ||
metadata: crate::spec::TargetMetadata { | ||
description: Some("AMD GPU".into()), | ||
tier: Some(3), | ||
host_tools: Some(false), | ||
std: Some(false), | ||
}, | ||
pointer_width: 64, | ||
|
||
options: TargetOptions { | ||
os: "amdhsa".into(), | ||
vendor: "amd".into(), | ||
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes), | ||
linker: Some("rust-lld".into()), | ||
|
||
max_atomic_width: Some(64), | ||
|
||
// Unwinding on GPUs is not useful. | ||
panic_strategy: PanicStrategy::Abort, | ||
|
||
// amdgpu backend does not support libcalls. | ||
no_builtins: true, | ||
simd_types_indirect: false, | ||
|
||
// Allow `cdylib` crate type. | ||
dynamic_linking: true, | ||
only_cdylib: true, | ||
executables: false, | ||
dll_prefix: "".into(), | ||
dll_suffix: ".elf".into(), | ||
|
||
// The LLVM backend does not support stack canaries for this target | ||
supports_stack_protector: false, | ||
|
||
// Force LTO, object linking does not yet work with amdgpu. | ||
requires_lto: true, | ||
|
||
..Default::default() | ||
}, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
Change this file to make users of the `download-ci-llvm` configuration download | ||
a new version of LLVM from CI, even if the LLVM submodule hasn’t changed. | ||
|
||
Last change is for: /~https://github.com/rust-lang/rust/pull/129788 | ||
Last change is for: /~https://github.com/rust-lang/rust/pull/134740 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
# `amdgcn-amd-amdhsa` | ||
|
||
**Tier: 3** | ||
|
||
AMD GPU target for compute/HSA (Heterogeneous System Architecture). | ||
|
||
## Target maintainers | ||
|
||
- [@Flakebi](/~https://github.com/Flakebi) | ||
|
||
## Requirements | ||
|
||
AMD GPUs can be targeted via cross-compilation. | ||
The default binary format is ELF. | ||
Binaries can be loaded by the HSA runtime implemented in [ROCR-Runtime]. | ||
|
||
Binaries must be built with no-std. | ||
They can use `core` and `alloc` (`alloc` only if an allocator is supplied). | ||
At least one function needs to use the `"amdgpu-kernel"` calling convention. | ||
These functions can be used as kernel entrypoints in HSA. | ||
|
||
## Building the target | ||
|
||
The target is included in rustc. | ||
|
||
## Building Rust programs | ||
|
||
The amdgpu target supports many hardware generations, which need different binaries. | ||
The generations are all exposed as different target-cpus in the backend. | ||
As there are many, Rust does not ship pre-compiled libraries for this target. | ||
Therefore, you have to build your own copy of `core` by using `cargo -Zbuild-std=core` or similar. | ||
|
||
To build a binary that can be loaded with HSA, create a no-std library: | ||
```rust | ||
// src/lib.rs | ||
#![feature(abi_amdgpu_kernel)] | ||
#![no_std] | ||
|
||
#[panic_handler] | ||
fn panic(_: &core::panic::PanicInfo) -> ! { | ||
loop {} | ||
} | ||
|
||
#[no_mangle] | ||
pub extern "amdgpu-kernel" fn kernel(/* Arguments */) { | ||
// Code | ||
} | ||
``` | ||
|
||
Build the library as `cdylib`: | ||
```toml | ||
# Cargo.toml | ||
[lib] | ||
crate-type = ["cdylib"] | ||
|
||
[profile.dev] | ||
lto = true # LTO must be explicitly enabled for now | ||
[profile.release] | ||
lto = true | ||
``` | ||
|
||
The target-cpu must be from the list [supported by LLVM] (or printed with `rustc --target amdgcn-amd-amdhsa --print target-cpus`). | ||
The GPU version on the current system can be found e.g. with [`rocminfo`]. | ||
|
||
Example `.cargo/config.toml` file to set the target and GPU generation: | ||
```toml | ||
# .cargo/config.toml | ||
[build] | ||
target = "amdgcn-amd-amdhsa" | ||
rustflags = ["-Ctarget-cpu=gfx1100"] | ||
|
||
[unstable] | ||
build-std = ["core"] # Optional: "alloc" | ||
``` | ||
|
||
<!-- Mention an allocator once a suitable one exists for amdgpu --> | ||
|
||
<!-- Mention HSA bindings once they work | ||
## Testing | ||
Does the target support running binaries, or do binaries have varying | ||
expectations that prevent having a standard way to run them? If users can run | ||
binaries, can they do so in some common emulator, or do they need native | ||
hardware? Does the target support running the Rust testsuite? | ||
--> | ||
|
||
## Additional information | ||
|
||
More information can be found on the [LLVM page for amdgpu] | ||
|
||
[ROCR-Runtime]: /~https://github.com/ROCm/ROCR-Runtime | ||
[supported by LLVM]: https://llvm.org/docs/AMDGPUUsage.html#processors | ||
[LLVM page for amdgpu]: https://llvm.org/docs/AMDGPUUsage.html | ||
[`rocminfo`]: /~https://github.com/ROCm/rocminfo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
//@ assembly-output: emit-asm | ||
// ignore-tidy-linelength | ||
//@ revisions: amdgcn_amd_amdhsa | ||
//@ [amdgcn_amd_amdhsa] compile-flags: --target amdgcn-amd-amdhsa | ||
//@ [amdgcn_amd_amdhsa] needs-llvm-components: amdgpu | ||
|
||
// Sanity-check that each target can produce assembly code. | ||
|
||
#![feature(no_core, lang_items)] | ||
#![no_std] | ||
#![no_core] | ||
#![crate_type = "lib"] | ||
|
||
#[lang = "sized"] | ||
trait Sized {} | ||
|
||
pub fn test() -> u8 { | ||
42 | ||
} | ||
|
||
// CHECK: .version |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters