| ==================== |
| Clang Nvlink Wrapper |
| ==================== |
| |
| .. contents:: |
| :local: |
| |
| .. _clang-nvlink-wrapper: |
| |
| Introduction |
| ============ |
| |
| This tool works as a wrapper over the ``nvlink`` program. It is required |
| because ``nvlink`` does not support linking of archive files implicitly. It |
| transparently passes every input option and object to ``nvlink`` except archive |
| files. It reads each input archive file to extract the archived cubin files as |
| temporary files. These temporary (\*.cubin) files are passed to ``nvlink``. |
| |
| Use Case |
| ======== |
| |
| During linking of heterogeneous device archive libraries with an OpenMP |
| program, the :doc:`ClangOffloadBundler` creates a device specific archive of |
| cubin files. Such an archive is then passed to this wrapper tool to extract |
| cubin files before passing to ``nvlink``. |
| |
| Working |
| ======= |
| |
| **Inputs** |
| |
| A command line generated by the OpenMP-Clang driver targeting NVPTX, |
| containing a set of flags, cubin object files, and zero or more archive |
| files. |
| |
| Example:: |
| |
| clang-nvlink-wrapper main.cubin /tmp/libTest-nvptx-sm_50.a -o main-linked.out |
| |
| **Processing** |
| |
| 1. From each archive file extract all cubin files as temporary files and |
| store their names in a list, `CubinFiles`. |
| 2. Create a new command line, `NVLinkCommand`, such that |
| * Program is ``nvlink`` |
| * All input flags are transparently passed on as flags |
| * All input archive file are replaced with `CubinFiles` |
| 3. Execute NVLinkCommand |
| |
| :: |
| |
| 1. Extract (libTest-nvptx-sm_50.a) => /tmp/a.cubin /tmp/b.cubin |
| 2. nvlink -o a.out-openmp-nvptx64 main.cubin /tmp/a.cubin /tmp/b.cubin |
| |
| **Output** |
| |
| Output file generated by ``nvlink`` which links all cubin files. |