Visible to Intel only — GUID: GUID-4D6AC431-1E13-481D-A43A-5F861C6AEB44
FPGA Optimization Guide for Intel® oneAPI Toolkits
Introduction To FPGA Design Concepts
Analyze Your Design
Optimize Your Design
FPGA Optimization Flags, Attributes, Pragmas, and Extensions
Quick Reference
Additional Information
Document Revision History for the FPGA Optimization Guide for Intel® oneAPI Toolkits
Refactor the Loop-Carried Data Dependency
Relax Loop-Carried Dependency
Transfer Loop-Carried Dependency to Local Memory
Minimize the Memory Dependencies for Loop Pipelining
Unroll Loops
Fuse Loops to Reduce Overhead and Improve Performance
Optimize Loops With Loop Speculation
Remove Loop Bottlenecks
Shannonization to Improve FMAX/II
Optimize Inner Loop Throughput
Improve Loop Performance by Caching On-Chip Memory
Global Memory Bandwidth Use Calculation
Manual Partition of Global Memory
Partitioning Buffers Across Different Memory Types (Heterogeneous Memory)
Partitioning Buffers Across Memory Channels of the Same Memory Type
Ignoring Dependencies Between Accessor Arguments
Contiguous Memory Accesses
Static Memory Coalescing
Specify Schedule FMAX Target for Kernels (-Xsclock=<clock target>)
Disable Burst-Interleaving of Global Memory (-Xsno-interleaving=<global_memory_type>)
Force Ring Interconnect for Global Memory (-Xsglobal-ring)
Force a Single Store Ring to Reduce Area (-Xsforce-single-store-ring)
Force Fewer Read Data Reorder Units to Reduce Area (-Xsnum-reorder)
Disable Hardware Kernel Invocation Queue (-Xsno-hardware-kernel-invocation-queue)
Modify the Handshaking Protocol Between Clusters (-Xshyper-optimized-handshaking)
Disable Automatic Fusion of Loops (-Xsdisable-auto-loop-fusion)
Fuse Adjacent Loops With Unequal Trip Counts (-Xsenable-unequal-tc-fusion)
Pipeline Loops in Non-task Kernels (-Xsauto-pipeline)
Control Semantics of Floating-Point Operations (-fp-model=<value>)
Modify the Rounding Mode of Floating-point Operations (-Xsrounding=<rounding_type>)
Global Control of Exit FIFO Latency of Stall-free Clusters (-Xssfc-exit-fifo-type=<value>)
Enable the Read-Only Cache for Read-Only Accessors (-Xsread-only-cache-size=<N>)
Control Hardware Implementation of the Supported Data Types and Math Operations (-Xsdsp-mode=<option>)
Visible to Intel only — GUID: GUID-4D6AC431-1E13-481D-A43A-5F861C6AEB44
Specify a Workgroup Size
Specify a maximum or the required workgroup size whenever possible. The Intel® oneAPI DPC++/C++ Compiler relies on this specification to optimize hardware use of the SYCL* kernel without involving excess logic.
- If you do not specify the [[intel::max_work_group_size(Z, Y, X)]] or [[sycl::reqd_work_group_size(Z, Y, X)]] attribute in your kernel, the workgroup size assumes a default value depending on compilation time and runtime constraints.
- If your kernel contains a barrier, the Intel® oneAPI DPC++/C++ Compiler sets a default maximum scalarized work-group size of 128 work-items.
- If your kernel does not query any SYCL intrinsic that allow different threads to behave differently (that is, local or global thread IDs, or work-group ID), the Intel® oneAPI DPC++/C++ Compiler infers a single-threaded execution mode and sets the maximum work-group size to (1, 1, 1). In this case, the SYCL runtime also enforces a global enqueue size of (1, 1, 1), and loop pipelining optimizations are enabled within the Intel® oneAPI DPC++/C++ Compiler.
Deprecation Notice:
The [[cl::reqd_work_group_size(Z, Y, X)]] attribute is deprecated. Use the [[sycl::reqd_work_group_size(Z, Y, X)]] attribute.
To specify the work-group size, modify your kernel code in the following manner:
- To specify the maximum number of work-items that the compiler provisions for a work-group in a kernel, insert the [[intel::max_work_group_size(Z, Y, X)]] attribute in your kernel source code.
For example:
constexpr unsigned MAX_WG_SIZE = 4; ... cgh.parallel_for<class kernelCompute>( nd_range<1>(range<1>(N), range<1>(wg_size)), [=] (nd_item<id> it) [[intel::max_work_group_size(1, 1, MAX_WG_SIZE)]] { auto gid = it.get_global_id(0); accessorRes[gid] = accessorIdx[gid] * 2; });
- To specify the required number of work-items that the Intel® oneAPI DPC++/C++ Compiler provisions for a work-group in a kernel, insert the [[sycl::reqd_work_group_size(Z, Y, X)]] attribute in your kernel source code.
For example:
constexpr unsigned REQD_WG_SIZE = 4; ... cgh.parallel_for<class kernelCompute>( nd_range<1>(range<1>(N), range<1>(wg_size)), [=] (nd_item<id> it) [[sycl::reqd_work_group_size(1, 1, REQD_WG_SIZE)]] { auto gid = it.get_global_id(0); accessorRes[gid] = accessorIdx[gid] * 2; });
Parent topic: Kernel Attributes