22 releases

0.9.1 Mar 3, 2020
0.9.0 Feb 6, 2019
0.8.3 Jan 20, 2019
0.8.2 Nov 11, 2018
0.2.0 Dec 12, 2017

#675 in Build Utils

MIT license

46KB
1K SLoC

Rust PTX Linker

Build Status Current Version

LLVM NVPTX bitcode linker for Rust 🔥 without external system dependencies 🔥!

What's going on in v0.9?

The release is important for the linker and existing users. The former approach was using an external nvptx64-nvidia-cuda json target specification and xargo to automatically compile libcore.

As of 2019-02-06 Rust received built-in support for building the CUDA kernels, and which evolved from the experience gained with ptx-linker prior v0.9.

Currently, it's possible to jump into a CUDA development with Nightly Rust:

# Install the minimal required version of the linker.
$ cargo install ptx-linker -f --version ">= 0.9"

# Install `libcore` for the CUDA target.
$ rustup target add nvptx64-nvidia-cuda

More details about further usage can be found below (Advanced usage section).

Purpose

The linker solves several of issues mentioned in the NVPTX metabug:

  • Non-inlined functions can't be used cross crate - rust#38787
  • No "undefined reference" error is raised when it should be - rust#38786

Convenient usage

At the moment ptx-builder is recommended approach to build Rust crates that contains CUDA code.

Advanced usage

Alternatively, the linker can be used alone.

Make sure you are using a cdylib crate type (the step is needed to perform the actual "linking"). Add to your Cargo.toml:

[lib]
crate_type = ["cdylib"]

And finally, build the PTX assembly file:

$ cd /path/to/kernels/crate
$ cargo build --target nvptx64-nvidia-cuda --release

Rust will involve ptx-linker under-the-hood and the latter will write the assembly at:

target/nvptx64-nvidia-cuda/release/KERNELS_CRATE_NAME.ptx

How does it work?

The linker does the magic without external system dependencies (mainly, LLVM libs) installed. Thanks to the rustc-llvm-proxy the correct LLVM symbols are being loaded at runtime. The approach also ensures that the linker uses same libraries versions as Rust.

Windows users!

Unfortunately, due to LLVM dylib limitations, Windows targets are not supported. The issue can be worked around if the linker is built with a static LLVM, but this requires a tighter integration with the Rust build process. Currently, there is no work is done in this direction, but the situation might change.

Dependencies

~4–12MB
~120K SLoC