<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Dear LLVM-Developers and Vinod Grover,<br>
      <br>
      we are trying to extend the cling C++ interpreter (<a
        class="moz-txt-link-freetext"
        href="https://github.com/root-project/cling">https://github.com/root-project/cling</a>)
      with CUDA functionality for Nvidia GPUs.<br>
      <br>
      I already developed a prototype based on OrcJIT and am seeking for
      feedback. I am currently a stuck with a runtime issue, on which my
      interpreter prototype fails to execute kernels with a CUDA runtime
      error.<br>
    </p>
    <p><br>
      === How to use the prototype<br>
      <br>
      This application interprets cuda runtime code. The program needs
      the whole cuda-program (.cu-file) and its pre-compiled device code
      (as fatbin) as an input:<br>
      <br>
          command: cuda-interpreter [source].cu [kernels].fatbin<br>
      <br>
      I also implemented an alternative mode, which is generating an
      object file. The object file can be linked (ld) to an exectuable.
      This mode is just implemented to check if the LLVM module
      generation works as expected. Activate it by changing the define
      INTERPRET from 1 to 0 .<br>
      <br>
      === Implementation<br>
      <br>
      The prototype is based on the clang example in<br>
      <br>
      <a class="moz-txt-link-freetext"
href="https://github.com/llvm-mirror/clang/tree/master/examples/clang-interpreter">https://github.com/llvm-mirror/clang/tree/master/examples/clang-interpreter</a><br>
      <br>
      I also pushed the source code to github with the install
      instructions and examples:<br>
        <a class="moz-txt-link-freetext"
        href="https://github.com/SimeonEhrig/CUDA-Runtime-Interpreter">https://github.com/SimeonEhrig/CUDA-Runtime-Interpreter</a><br>
      <br>
      The device code generation can be performed with either clang's
      CUDA frontend or NVCC to ptx.<br>
      <br>
      Here is the workflow in five stages:<br>
    </p>
    <ol>
      <li>generating ptx device code (a kind of nvidia assembler)</li>
      <li>translate ptx to sass (machine code of ptx)</li>
      <li>generate a fatbinray (a kind of wrapper for the device code)</li>
      <li>generate host code object file (use fatbinary as input)</li>
      <li>link to executable</li>
    </ol>
    <p>(The exact commands are stored in the commands.txt in the github
      repo)<br>
      <br>
      The interpreter replaces the 4th and 5th step. It interprets the
      host code with pre-compiled device code as fatbinary. The
      fatbinary (Step 1 to 3) will be generated with the clang compiler
      and the nvidia tools ptxas and fatbinary.<br>
      <br>
      === Test Cases and Issues<br>
      <br>
      You find the test sources on GitHub in the directory
      "example_prog".<br>
      <br>
      Run the tests with cuda-interpeter and the two arguments as above:<br>
      <br>
       [1] path to the source code in "example_prog"<br>
           - note: even for host-only code, use the file-ending .cu<br>
           <br>
       [2] path to the runtime .fatbin<br>
           - note: needs the file ending .fatbin<br>
           - a fatbin file is necessary, but if the program doesn't need
      a kernel, the content of the file will ignore</p>
    Note: As a prototype, the input is just static and barely checked
    yet.<br>
    <br>
    1. hello.cu: simple c++ hello world program with cmath library call
    sqrt() -> works without problems<br>
    <br>
    2. pthread_test.cu: c++ program, which starts a second thread ->
    works without problems<br>
    <br>
    3. fat_memory.cu: use cuda library and allocate about 191 MB of
    VRAM. After the allocation, the program waits for 3 seconds, so you
    can check the memory usage with the nvidia-smi -> works without
    problems<br>
    <br>
    4. runtime.cu: combine cuda library with a simple cuda kernel ->
    Generating an object file, which can be linked (see 5th call in
    commands above -> ld ...) to a working executable.<br>
    <br>
    The last example has the following issues: Running the executable
    works fine. Interpreting the code instead does not work. The Cuda
    Runtime returns the error 8 (<span class="enum-member-name-def">cudaErrorInvalidDeviceFunction</span>)
    , the kernel failed.<br>
    <br>
    Do you have any idea how to proceed?<br>
    <br>
    <br>
    Best regards,<br>
    Simeon Ehrig
  </body>
</html>