| :::{program} clang |
| ::: |
| |
| # OpenMP Command-Line Argument Reference |
| |
| Welcome to the OpenMP in LLVM command line argument reference. The content is |
| not a complete list of arguments but includes the essential command-line |
| arguments you may need when compiling and linking OpenMP. |
| Section {ref}`general_command_line_arguments` lists OpenMP command line options |
| for multicore programming while {ref}`offload_command_line_arguments` lists |
| options relevant to OpenMP target offloading. |
| |
| (general_command_line_arguments)= |
| |
| ## OpenMP Command-Line Arguments |
| |
| (fopenmp)= |
| |
| :::{option} -fopenmp |
| Enable the OpenMP compilation toolchain. The compiler will parse OpenMP |
| compiler directives and generate parallel code. |
| ::: |
| |
| (fopenmp-extensions)= |
| |
| :::{option} -fopenmp-extensions |
| Enable all `Clang` extensions for OpenMP directives and clauses. A list of |
| current extensions and their implementation status can be found on the |
| [support](https://clang.llvm.org/docs/OpenMPSupport.html#openmp-extensions) |
| page. |
| ::: |
| |
| (fopenmp-simd)= |
| |
| :::{option} -fopenmp-simd |
| This option enables OpenMP only for single instruction, multiple data |
| (SIMD) constructs. |
| ::: |
| |
| (static-openmp)= |
| |
| :::{option} -static-openmp |
| Use the static OpenMP host runtime while linking. |
| ::: |
| |
| (fopenmp-version-arg)= |
| |
| :::{option} -fopenmp-version=<arg> |
| Set the OpenMP version to a specific version `<arg>` of the OpenMP standard. |
| For example, you may use `-fopenmp-version=45` to select version 4.5 of |
| the OpenMP standard. The default value is `-fopenmp-version=51` for `Clang`. |
| ::: |
| |
| (offload_command_line_arguments)= |
| |
| ## Offloading Specific Command-Line Arguments |
| |
| (fopenmp-targets)= |
| |
| :::{option} -fopenmp-targets |
| Specify which OpenMP offloading targets should be supported. For example, you |
| may specify `-fopenmp-targets=amdgcn-amd-amdhsa,nvptx64`. This option is |
| often optional when {option}`--offload-arch` is provided. |
| |
| It is also possible to offload to CPU architectures, for instance with |
| `-fopenmp-targets=x86_64-pc-linux-gnu`. |
| ::: |
| |
| (offload_arch)= |
| |
| :::{option} --offload-arch |
| Specify the device architecture for OpenMP offloading. For instance |
| `--offload-arch=sm_80` to target an Nvidia Tesla A100, |
| `--offload-arch=gfx90a` to target an AMD Instinct MI250X, or |
| `--offload-arch=sm_80,gfx90a` to target both. |
| |
| It is also possible to specify {option}`-fopenmp-targets` without specifying |
| `--offload-arch`. In that case, the executables `amdgpu-arch` or |
| `nvptx-arch` will be executed as part of the compiler driver to |
| detect the device architecture automatically. |
| |
| Finally, the device architecture will also be automatically inferred with |
| `--offload-arch=native`. |
| ::: |
| |
| (offload-device-only)= |
| |
| :::{option} --offload-device-only |
| Compile only the code that goes on the device. This option is mainly for |
| debugging purposes. It is primarily used for inspecting the intermediate |
| representation (IR) output when compiling for the device. It may also be used |
| if device-only runtimes are created. |
| ::: |
| |
| (offload-host-only)= |
| |
| :::{option} --offload-host-only |
| Compile only the code that goes on the host. With this option enabled, the |
| `.llvm.offloading` section with embedded device code will not be included in |
| the intermediate representation. |
| ::: |
| |
| (offload-host-device)= |
| |
| :::{option} --offload-host-device |
| Compile the target regions for both the host and the device. That is the |
| default option. |
| ::: |
| |
| (xopenmp-target-arg)= |
| |
| (xopenmp-target-triple-arg)= |
| |
| :::{option} -Xopenmp-target[=<triple>] <arg> |
| Pass an argument `<arg>` to the offloading toolchain, for instance |
| `-Xopenmp-target -march=sm_80`. |
| |
| Pass an argument `<arg>` to the offloading toolchain for the target |
| `<triple>`. That is especially useful when an argument must differ for each |
| triple. For instance `-Xopenmp-target=nvptx64 --offload-arch=sm_80 |
| -Xopenmp-target=amdgcn --offload-arch=gfx90a` to specify the device |
| architecture. Alternatively, {option}`-Xarch_host` and |
| {option}`-Xarch_device` can |
| pass an argument to the host and device compilation toolchain. |
| ::: |
| |
| (xoffload-linker-triple-arg)= |
| |
| :::{option} -Xoffload-linker<triple> <arg> |
| Pass an argument `<arg>` to the offloading linker for the target specified in |
| `<triple>`. |
| ::: |
| |
| (Xarch_device)= |
| |
| (xarch-device-arg)= |
| |
| :::{option} -Xarch_device <arg> |
| Pass an argument `<arg>` to the device compilation toolchain. |
| ::: |
| |
| (Xarch_host)= |
| |
| (xarch-host-arg)= |
| |
| :::{option} -Xarch_host <arg> |
| Pass an argument `<arg>` to the host compilation toolchain. |
| ::: |
| |
| (foffload-lto-arg)= |
| |
| :::{option} -foffload-lto[=<arg>] |
| Enable device link time optimization (LTO) and select the LTO mode `<arg>`. |
| Select either `-foffload-lto=thin` or `-foffload-lto=full`. Thin LTO takes |
| less time while still achieving some performance gains. If no argument is set, |
| this option defaults to `-foffload-lto=full`. |
| ::: |
| |
| (fopenmp-offload-mandatory)= |
| |
| :::{option} -fopenmp-offload-mandatory |
| This option is set to avoid generating the host fallback code |
| executed when offloading to the device fails. That is |
| helpful when the target contains code that cannot be compiled for the host, for |
| instance, if it contains unguarded device intrinsics. |
| |
| This option can also be used to reduce compile time. |
| |
| This option should not be used when one wants to verify that the code is being |
| offloaded to the device. Instead, set the environment variable |
| `OMP_TARGET_OFFLOAD='MANDATORY'` to confirm that the code is being offloaded to |
| the device. |
| ::: |
| |
| (fopenmp-target-debug-arg)= |
| |
| :::{option} -fopenmp-target-debug[=<arg>] |
| Enable debugging in the device runtime library (RTL). Note that it is both |
| necessary to configure the debugging in the device runtime at compile-time with |
| `-fopenmp-target-debug=<arg>` and enable debugging at runtime with the |
| environment variable `LIBOMPTARGET_DEVICE_RTL_DEBUG=<arg>`. Further, it is |
| currently only supported for Nvidia targets as of July 2023. Alternatively, the |
| environment variable `LIBOMPTARGET_DEBUG` can be set to debug both Nvidia and |
| AMD GPU targets. For more information, see the |
| [debugging instructions](https://openmp.llvm.org/design/Runtimes.html#debugging). |
| The debugging instructions list the supported debugging arguments. |
| ::: |
| |
| (fopenmp-target-jit)= |
| |
| :::{option} -fopenmp-target-jit |
| Emit code that is Just-in-Time (JIT) compiled for OpenMP offloading. Embed |
| LLVM-IR for the device code in the object files rather than binary code for the |
| respective target. At runtime, the LLVM-IR is optimized again and compiled for |
| the target device. The optimization level can be set at runtime with |
| `LIBOMPTARGET_JIT_OPT_LEVEL`, for instance, |
| `LIBOMPTARGET_JIT_OPT_LEVEL=3` corresponding to optimizations level `-O3`. |
| See the |
| [OpenMP JIT details](https://openmp.llvm.org/design/Runtimes.html#libomptarget-jit-pre-opt-ir-module) |
| for instructions on extracting the embedded device code before or after the |
| JIT and more. |
| |
| We want to emphasize that JIT for OpenMP offloading is good for debugging as |
| the target IR can be extracted, modified, and injected at runtime. |
| ::: |
| |
| (offload-new-driver)= |
| |
| :::{option} --offload-new-driver |
| Deprecated and accepted as a no-op. The new offloading driver is always used for |
| offloading compilation; the legacy driver has been removed. |
| ::: |
| |
| (offload-link)= |
| |
| :::{option} --offload-link |
| Use the new offloading linker {title-reference}`clang-linker-wrapper` to perform the link job. |
| {title-reference}`clang-linker-wrapper` is the default offloading linker for OpenMP. This option |
| can be used to use the new offloading linker in toolchains that do not automatically |
| use it. It is necessary to enable this option when linking with CUDA or HIP files. |
| ::: |
| |
| (nogpulib)= |
| |
| :::{option} -nogpulib |
| Do not link the device library for CUDA or HIP device compilation. |
| ::: |
| |
| (nogpuinc)= |
| |
| :::{option} -nogpuinc |
| Do not include the default CUDA or HIP headers, and do not add CUDA or HIP |
| include paths. |
| ::: |