Skip to content
A single-header C++ library for simplifying the use of CUDA Runtime Compilation (NVRTC).
Branch: master
Clone or download
Latest commit c7c55b3 Feb 14, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
example_headers Reformated using clang-format into Google style. Sep 5, 2018
.clang-format
.gitignore Initial code commit Aug 25, 2017
Doxyfile Initial code commit Aug 25, 2017
LICENSE Initial commit May 8, 2017
Makefile Small improvements to handling of thread safety Mar 17, 2018
README.md Small improvements to handling of thread safety Mar 17, 2018
jitify.hpp Merge pull request #22 from NVIDIA/hotfix/cuda-kernel-class-issues Feb 13, 2019
jitify_example.cpp
stringify.cpp Reformated using clang-format into Google style. Sep 5, 2018

README.md

Jitify

A single-header C++ library for simplifying the use of CUDA Runtime Compilation (NVRTC).

Rationale

Integrating NVRTC into existing and/or templated CUDA code can be tricky. Jitify aims to simplify this process by hiding the complexities behind a simple, high-level interface.

Quick example

const char* program_source = "my_program\n"
    "template<int N, typename T>\n"
    "__global__\n"
    "void my_kernel(T* data) {\n"
    "    T data0 = data[0];\n"
    "    for( int i=0; i<N-1; ++i ) {\n"
    "        data[0] *= data0;\n"
    "    }\n"
    "}\n";
static jitify::JitCache kernel_cache;
jitify::Program program = kernel_cache.program(program_source);
// ...set up data etc.
dim3 grid(1);
dim3 block(1);
using jitify::reflection::type_of;
program.kernel("my_kernel")
       .instantiate(3, type_of(*data))
       .configure(grid, block)
       .launch(data);

Features

Jitify provides/takes care of the following things:

  • All NVRTC and CUDA Driver API calls
  • Simple kernel instantiation and launch syntax
  • Caching compiled kernels
  • Loading source code from strings, files, or embedded in an executable
  • Ignoring host code in runtime-compiled sources
  • Skipping unneeded headers
  • Support for JIT-safe standard library headers (e.g., float.h, stdint.h etc.)
  • Dealing with kernel name mangling
  • Reflecting kernel template parameters into strings
  • Compiling specifically for the current device's compute capability
  • Support for CUDA versions 7.0, 7.5, 8.0, 9.0
  • Convenient parallel_for function and lambda support

Things you can do with Jitify and NVRTC:

  • Rapidly port existing code to use CUDA Runtime Compilation
  • Dramatically reduce code volume and offline-compilation times
  • Increase kernel performance by baking in runtime constants and autotuning

How to build

Jitify is just a single header file:

#include <jitify.hpp>

Compile with: -pthread (not needed if JITIFY_THREAD_SAFE is defined to 0)

Link with: -ldl -lcuda -lnvrtc

A small utility called stringify is included for converting text files into C string literals, which provides a convenient way to integrate JIT-compiled sources into a build.

Documentation

Examples

See jitify_example.cpp for some examples of how to use the library. The Makefile also demonstrates how to use the provided stringify utility.

GTC 2017 Talk by Ben Barsdell and Kate Clark

API documentation

Doxygen documentation can be generated by running:

$ make doc

The HTML and LaTeX results are placed into the doc/ subdirectory.

License

BSD-3-Clause

Authors

Ben Barsdell (NVIDIA)

Kate Clark (NVIDIA)

You can’t perform that action at this time.