Ahead of Time Compilation

Ahead of Time (AOT) Compilation is a helpful feature for your development lifecycle or distribution time. The AOT feature provides the following benefits when you know beforehand what your target device is going to be at application execution time:

A program built with AOT compilation for specific target device(s) will not run on different device(s). You must detect the proper target device at runtime and report an error if the targeted device is not present. The use of exception handling with an asynchronous exception handler is recommended.

SYCL supports AOT compilation for the following targets: Intel® CPUs, Intel® Processor Graphics, and Intel® FPGA. For details on AOT compilation for Intel FPGAs, refer to the Intel® oneAPI FPGA Handbook.

OpenMP supports AOT compilation for the following targets: Intel® Processor Graphics.

Prerequisites

To target a GPU with the AOT feature, you must have the OpenCL™ Offline Compiler (OCLOC) tool installed. OCLOC can generate binaries that use OpenCL™ (SYCL only) or the Intel® oneAPI Level Zero (Level Zero) backend.

OCLOC is not packaged with the compiler and must be installed separately. To install OCLOC, you need to install the GPU drivers (whether or not you have an Intel GPU on your system). Refer to the Installation Guides for instructions.

Windows

OCLOC is packaged with the Windows version of Intel® oneAPI DPC++/C++ Compiler.

Requirements for Accelerators

GPUs:

AOT Compilation Supported Options for OpenMP

Use the following options to target a specific device for AOT compilation:

-Xs or -Xopenmp-target-backend=spir64_gen allow you to specify a general device target option.

When using Ahead of Time (AOT) compilation, the options passed with -Xs are not compiler options, but rather options to pass to OCLOC.

AOT Compilation Supported Options for SYCL

Use the following options to target a specific device for AOT compilation:

-Xs is a general device target option. If there are multiple targets desired (example: -fsycl-targets=spir64_gen,spir64_x86_64) the options specified with -Xs apply to all targets. This is not desired for multiple targets. You can use -Xsycl-target-backend=spir64_gen <option> and -Xsycl-target-backend=spir64_x86_64 <option> to add specificity.

When using Ahead of Time (AOT) compilation, the options passed with -Xs are not compiler options.

To see a list of the options you can pass with -Xs when using AOT, specify -fsycl-help=gen, -fsycl-help=x86_64, or -fsycl-help=fpga on the command line.

Use AOT for the Target Device (Intel® CPUs)

Note

SYCL compilation is only available from the C/C++ compiler. However, you can link SYCL-generated objects with the Fortran compiler. The use of -fsycl with ifx allows this (it is restricted to spir64, spir64_gen, and spir64_x86_64).

Use the following option arguments to specify Intel® CPUs as the target device for AOT compilation:

The following examples tell the compiler to generate code that uses Intel® AVX2 instructions:

Linux

icpx -fsycl -fsycl-targets=spir64_x86_64 -Xs "-march=avx2" main.cpp
Windows
icx -fsycl /EHsc -fsycl-targets=spir64_x86_64 -Xs "-march=avx2" main.cpp

Build an Application with Multiple Source Files for CPU Targeting

Note

This section is for SYCL only.

Compile your normal files (with no SYCL kernels) to create host objects. Then compile the file with the kernel code and link it with the rest of the application.

Linux

  1. icpx -fsycl -fsycl-targets=spir64_gen -Xs "-device *"-c main.cpp 
  2. icpx -fsycl -fsycl-targets=spir64_x86_64 -Xs "-march=avx2" mandel.cpp main.o  
Windows
  1. icx -fsycl /EHsc -fsycl-targets=spir64_gen -Xs "-device *" -c main.cpp 
  2. icx -fsycl /EHsc -fsycl-targets=spir64_x86_64 -Xs "-march=avx2" mandel.cpp main.obj

Use AOT for Integrated Graphics (Intel® GPU)

Use the following option arguments to specify Intel® GPU as the target device for AOT compilation:

OpenMP and SYCL

Use of -Xs is a general-purpose option, any arguments supplied with -Xs will be applied to all offline compilation invocations.

OpenMP

SYCL

To see the complete list of supported target device types for your installed version of OCLOC, run:

ocloc compile --help

To find supported devices look for -device <device_type> in the help.

If multiple target devices are listed in the compile command, the Intel® oneAPI DPC++/C++ Compiler compiles for each of these targets and creates a fat-binary that contains all the device binaries produced this way.

Examples of supported -device patterns:

OpenMP for Linux

SYCL for Linux

Windows

Build an Application with Multiple Source Files for GPU Targeting

Compile your normal files (with no SYCL kernels) to create host objects. Then compile the file with the kernel code and link it with the rest of the application.

Linux

  1. icpx -fsycl -fsycl-targets=spir64_gen -c main.cpp 
  2. icpx -fsycl -fsycl-targets=spir64_gen -Xs "-device *" mandel.cpp main.o

    or

    icpx -fsycl -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen "-device *" mandel.cpp main.o
Windows
  1. icx -fsycl -fsycl-targets=spir64_gen -c -EHsc main.cpp 
  2. icx -fsycl /EHsc -fsycl-targets=spir64_gen -Xs "-device *" mandel.cpp main.obj

    or

    icx -fsycl /EHsc -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen "-device *" mandel.cpp main.obj

Use AOT in Microsoft Visual Studio

Note

This section is for SYCL only.

You can use Microsoft Visual Studio for compiling and linking. Set the following flags to use AOT compilation for CPU or GPU:

CPU:

GPU:

Available GPU Platforms

Device Platform
acm-g10 dg2-g10 Alchemist, Arctic Sound
acm-g11 dg2-g11 Alchemist, Arctic Sound
adl-n Alder Lake
adl-p Alder Lake
adl-s Alder Lake
aml Amber Lake
apl bxt Apollo Lake, Broxton
cfl Coffee Lake
cml Comet Lake
dg1 DG1
ehl jsl Elkhart Lake, Jasper Lake
glk Gemini Lake
icllp Ice Lake
kbl Kaby Lake
rkl Rocket Lake
rpl-s Raptor Lake
skl Intel® microarchitecture code name Skylake
tgllp Tiger Lake
whl Whiskey Lake

See Also