Developer Guide

FPGA Optimization Guide for Intel® oneAPI Toolkits

ID 767853
Date 3/31/2023
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

FPGA Kernel Attributes

The following table summarizes kernel attributes:

FPGA Kernel Attributes
Attribute Description Example
[[intel::scheduler_target_fmax_mhz(N)]] Determines the pipelining effort the scheduler attempts during the scheduling process.
[[intel::scheduler_target_fmax_mhz(SCHEDULER_TARGET_FMAX)]] {
  for (unsigned i = 0; i < SIZE; i++) {
    accessorRes[0] += accessorIdx[i] * 2;
  }
});
[[intel::max_work_group_size(Z, Y, X)]]

Specifies a maximum or the required work-group size for optimizing hardware use of the SYCL kernel without involving excess logic.

[[intel::max_work_group_size(1,1,MAX_WG_SIZE)]] {
  accessorRes[wiID] = accessorIdx[wiID] * 2;
});
[[intel::max_global_work_dim(0)]]

Omits logic that generates and dispatches global, local, and group IDs into the compiled kernel.

[[intel::max_global_work_dim(0)]] {
  for (unsigned i = 0; i < SIZE; i++) {
    accessorRes[i] = accessorIdx[i] * 2;
  }
}
[[intel::num_simd_work_items(N)]

Specifies the number of work items within a work group that the compiler executes in a SIMD or vectorized manner.

[[intel::num_simd_work_items(NUM_SIMD_WORK_ITEMS),
cl::reqd_work_group_size(1,1,REQD_WORK_GROUP_SIZE)]] {
  accessorRes[wiID] = sqrt(accessorIdx[wiID]);
});
[[intel::no_global_work_offset(1)]]

Omits generating hardware required to support global work offsets.

[[intel::no_global_work_offset(1))]] {
  accessorRes[wiID] = accessorIdx[wiID] * 2;
}
[[intel::kernel_args_restrict]]

Ignores the dependencies between accessor arguments in a SYCL* kernel.

[[intel::kernel_args_restrict]] {
  for (unsigned i = 0; i < size; i++) {
    out_accessor[i] = in_accessor[i];
  }
});
[[intel::use_stall_enable_clusters]]

Reduces the area and latency of your kernel.

h.single_task<class KernelComputeStallFree>( [=]() [[intel::use_stall_enable_clusters]] {
  // The computations in this device kernel uses Stall Enable Clusters
  Work(accessor_vec_a, accessor_vec_b, accessor_res);
});
});