From b6cebfad5ebe43e0313400391207708b0400f722 Mon Sep 17 00:00:00 2001 From: Audrey Kertesz Date: Thu, 20 Aug 2020 21:55:02 -0400 Subject: [PATCH] Add fpga_reg and loop_unroll tutorials, with Linux support only Signed-off-by: Audrey Kertesz --- .../Features/fpga_reg/CMakeLists.txt | 11 + .../Tutorials/Features/fpga_reg/License.txt | 7 + .../Tutorials/Features/fpga_reg/README.md | 188 +++++++++++++++ .../Tutorials/Features/fpga_reg/fpga_reg.png | Bin 0 -> 94859 bytes .../Features/fpga_reg/no_fpga_reg.png | Bin 0 -> 84191 bytes .../Tutorials/Features/fpga_reg/sample.json | 34 +++ .../Features/fpga_reg/src/CMakeLists.txt | 111 +++++++++ .../Features/fpga_reg/src/fpga_reg.cpp | 216 ++++++++++++++++++ .../Features/loop_unroll/CMakeLists.txt | 11 + .../Features/loop_unroll/License.txt | 7 + .../Tutorials/Features/loop_unroll/README.md | 188 +++++++++++++++ .../Features/loop_unroll/sample.json | 34 +++ .../Features/loop_unroll/src/CMakeLists.txt | 89 ++++++++ .../Features/loop_unroll/src/loop_unroll.cpp | 138 +++++++++++ 14 files changed, 1034 insertions(+) create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/CMakeLists.txt create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/License.txt create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/README.md create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/fpga_reg.png create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/no_fpga_reg.png create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/sample.json create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/CMakeLists.txt create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/fpga_reg.cpp create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/CMakeLists.txt create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/License.txt create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/README.md create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/sample.json create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/CMakeLists.txt create mode 100755 DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/loop_unroll.cpp diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/CMakeLists.txt b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/CMakeLists.txt new file mode 100755 index 0000000000..325cc3fa42 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/CMakeLists.txt @@ -0,0 +1,11 @@ +set(CMAKE_CXX_COMPILER "dpcpp") + +cmake_minimum_required (VERSION 2.8) + +project(FPGARegister) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + +add_subdirectory (src) diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/License.txt b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/License.txt new file mode 100755 index 0000000000..e63c6e13dc --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/License.txt @@ -0,0 +1,7 @@ +Copyright Intel Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/README.md b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/README.md new file mode 100755 index 0000000000..18e2a1f244 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/README.md @@ -0,0 +1,188 @@ +# Explicit Pipeline Register Insertion with `fpga_reg` + +This FPGA tutorial demonstrates how a power user can apply the DPC++ extension `intel::fpga_reg` to tweak the hardware generated by the compiler. + +***Documentation***: The [oneAPI DPC++ FPGA Optimization Guide](https://software.intel.com/content/www/us/en/develop/documentation/oneapi-fpga-optimization-guide) provides comprehensive instructions for targeting FPGAs through DPC++. The [oneAPI Programming Guide](https://software.intel.com/en-us/oneapi-programming-guide) is a general resource for target-independent DPC++ programming. + +| Optimized for | Description +--- |--- +| OS | Linux* Ubuntu* 18.04 +| Hardware | Intel® Programmable Acceleration Card (PAC) with Intel Arria® 10 GX FPGA;
Intel® Programmable Acceleration Card (PAC) with Intel Stratix® 10 SX FPGA +| Software | Intel® oneAPI DPC++ Compiler (Beta)
Intel® FPGA Add-On for oneAPI Base Toolkit +| What you will learn | How to use the `intel::fpga_reg` extension
How `intel::fpga_reg` can be used to re-structure the compiler-generated hardware
Situations in which applying `intel::fpga_reg` might be beneficial +| Time to complete | 20 minutes + +_Notice: This code sample is not yet supported in Windows*_ + +## Purpose + +This FPGA tutorial demonstrates an example of using the `intel::fpga_reg` extension to: + +* Help reduce the fanout of specific signals in the DPC++ design +* Improve the overall fMAX of the generated hardware + +Note that this is an advanced tutorial for FPGA power users. + +### Simple Code Example + +The signature of `intel::fpga_reg` is as follows: + +```cpp +template +T intel::fpga_reg(T input) +``` + +To use this function in your code, you must include the following header: + +```cpp +#include +``` + +When you use this function on any value in your code, the compiler will insert at least one register stage between the input and output of `intel::fpga_reg` function. For example: + +```cpp +int func (int input) { + int output = intel::fpga_reg(input) + return output; +} +``` + +This forces the compiler to insert a register between the input and output. You can observe this in the optimization report's System Viewer. + +### Understanding the Tutorial Design + +The basic function performed by the tutorial kernel is a vector dot product with a pre-adder. The loop is unrolled so that the core part of the algorithm is a feed-forward datapath. The coefficient array is implemented as a circular shift register and rotates by one for each iteration of the outer loop. + +The optimization applied in this tutorial impacts the system fMAX or the maximum frequency that the design can run at. Since the compiler implements all kernels in a common clock domain, fMAX is a global system parameter. To see the impact of the `intel::fpga_reg` optimization in this tutorial, you will need to compile the design twice. + +Part 1 compiles the kernel code without setting the `USE_FPGA_REG` macro, whereas Part 2 compiles the kernel while setting this macro. This chooses between two code segments that are functionally equivalent, but the latter version makes use of `intel::fpga_reg`. In the `USE_FPGA_REG` version of the code, the compiler is guaranteed to insert at least one register stage between the input and output of each of the calls to `intel::fpga_reg` function. + +#### Part 1: Without `USE_FPGA_REG` + +The compiler will generate the following hardware for Part 1. The diagram below has been simplified for illustration. + +Part 1 + +Note the following: + +* The compiler automatically infers a tree structure for the series of adders. +* There is a large fanout (of up to 4 in this simplified example) from `val` to each of the adders. + +The fanout grows linearly with the unroll factor in this tutorial. In FPGA designs, signals with large fanout can sometimes degrade system fMAX. This happens because the FPGA placement algorithm cannot place *all* of the fanout logic elements physically close to the fanout source, leading to longer wires. In this situation, it can be helpful to add explicit fanout control in your DPC++ code via `intel::fpga_reg`. This is an advanced optimization for FPGA power-users. + +#### Part 2: with `USE_FPGA_REG` + +In this part, we added two sets of `intel::fpga_reg` within the unrolled loop. The first is added to pipeline `val` once per iteration. This reduce the fanout of `val` from 4 in the example in Part 1 to just 2. The second `intel::fpga_reg` is inserted between accumulation into the `acc` value. This generates the following structure in hardware. + +Part 2 + +In this version, the adder tree has been transformed into a vine-like structure. This increases latency, but it helps us achieve our goal of reducing the fanout and improving fMAX. +Since the outer loop in this tutorial is pipelined and has a high trip count, the increased latency of the inner loop has negligible impact on throughput. The tradeoff pays off, as the fMAX improvement yields a higher performing design. + +## Key Concepts + +* How to use the `intel::fpga_reg` extension +* How `intel::fpga_reg` can be used to re-structure the compiler-generated hardware +* Situations in which applying `intel::fpga_reg` might be beneficial + +## License + +This code sample is licensed under MIT license. + +## Building the `fpga_reg` Design + +### Include Files + +The included header `dpc_common.hpp` is located at `%ONEAPI_ROOT%\dev-utilities\latest\include` on your development system. + +### Running Samples in DevCloud + +If running a sample in the Intel DevCloud, remember that you must specify the compute node (fpga_compile or fpga_runtime) as well as whether to run in batch or interactive mode. For more information see the Intel® oneAPI Base Toolkit Get Started Guide ([https://devcloud.intel.com/oneapi/get-started/base-toolkit/](https://devcloud.intel.com/oneapi/get-started/base-toolkit/)). + +When compiling for FPGA hardware, it is recommended to increase the job timeout to 12h. + +### On a Linux* System + +1. Install the design in `build` directory from the design directory by running `cmake`: + + ```bash + mkdir build + cd build + ``` + + If you are compiling for the Intel® PAC with Intel Arria® 10 GX FPGA, run `cmake` using the command: + + ```bash + cmake .. + ``` + + Alternatively, to compile for the Intel® PAC with Intel Stratix® 10 SX FPGA, run `cmake` using the command: + + ```bash + cmake .. -DFPGA_BOARD=intel_s10sx_pac:pac_s10 + ``` + +2. Compile the design using the generated `Makefile`. The following four build targets are provided that match the recommended development flow: + + * Compile and run for emulation (fast compile time, targets emulates an FPGA device) using: + + ```bash + make fpga_emu + ``` + + * Generate HTML optimization reports using: + + ```bash + make report + ``` + + * Compile and run on FPGA hardware (longer compile time, targets an FPGA device) using: + + ```bash + make fpga + ``` + +3. (Optional) As the above hardware compile may take several hours to complete, an Intel® PAC with Intel Arria® 10 GX FPGA pre-compiled binary can be downloaded here. + + +### In Third-Party Integrated Development Environments (IDEs) + +You can compile and run this tutorial in the Eclipse* IDE (in Linux*). +For instructions, refer to the following link: [Intel® oneAPI DPC++ FPGA Workflows on Third-Party IDEs](https://software.intel.com/en-us/articles/intel-oneapi-dpcpp-fpga-workflow-on-ide) + +## Examining the Reports + +Locate the pair of `report.html` files in either: + +* **Report-only compile**: `fpga_reg_report.prj` and `fpga_reg_registered_report.prj` +* **FPGA hardware compile**: `fpga_reg.prj` and `fpga_reg_registered.prj` + +Open the reports in any of Chrome*, Firefox*, Edge*, or Internet Explorer*. Observe the structure of the design in the optimization report's System Viewer and notice the changes within `Cluster 2` of the `SimpleMath.B1` block. You can notice that in the report for Part 1, the viewer shows a much more shallow graph as compared to the one in Part 2. This is because the operations are performed much closer to one another in Part 1 as compared to Part 2. By transforming the code in Part 2, with more register stages, the compiler was able to achieve an higher fMAX. + +>**NOTE**: Only the report generated after the FPGA hardware compile will reflect the performance benefit of using the `fpga_reg` extension. The difference is *not* apparent in the reports generated by `make report` because a design's fMAX cannot be predicted. The final achieved fMAX can be found in `fpga_reg.prj/reports/report.html` and `fpga_reg_registered.prj/reports/report.html` (after `make fpga` completes). + +## Running the Sample + +1. Run the sample on the FPGA emulator (the kernel executes on the CPU): + + ```bash + ./fpga_reg.fpga_emu # Linux + ``` + +2. Run the sample on the FPGA device + + ```bash + ./fpga_reg.fpga # Linux + ./fpga_reg_registered.fpga # Linux + ``` + +### Example of Output + +```txt +Throughput for kernel with input size 1000000 and coefficient array size 64: 2.819272 GFlops +PASSED: Results are correct. +``` + +### Discussion of Results + +You will be able to observe the improvement in the throughput going from Part 1 to Part 2. You will also note that the fMAX of Part 2 is significantly larger than of Part 1. diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/fpga_reg.png b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/fpga_reg.png new file mode 100755 index 0000000000000000000000000000000000000000..fe3391693963381bfc785093ac6d9117107e8e2b GIT binary patch literal 94859 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

X4(P207Ne@GIFLP8!TDsM?r6xVipaplg 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 literal 0 HcmV?d00001 diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/no_fpga_reg.png b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/no_fpga_reg.png new file mode 100755 index 0000000000000000000000000000000000000000..5383063625313f5dc4e163d60a4b8c65cb212459 GIT binary patch literal 84191 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 literal 0 HcmV?d00001 diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/sample.json b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/sample.json new file mode 100755 index 0000000000..57573588f4 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/sample.json @@ -0,0 +1,34 @@ +{ + "guid": "D661A5C2-5FE0-40F2-BFE7-70E3BA60F088", + "name": "Explicit Pipeline Register Insertion with fpga_reg", + "categories": ["Toolkit/Intel® oneAPI Base Toolkit/FPGA/Tutorials"], + "description": "FPGA advanced tutorial demonstrating how to apply the DPC++ extension intel::fpga_reg", + "toolchain": ["dpcpp"], + "os": ["linux"], + "targetDevice": ["FPGA"], + "builder": ["cmake"], + "languages": [{"cpp":{}}], + "ciTests": { + "linux": [ + { + "id": "fpga_emu", + "steps": [ + "mkdir build", + "cd build", + "cmake ..", + "make fpga_emu", + "./fpga_reg.fpga_emu" + ] + }, + { + "id": "report", + "steps": [ + "mkdir build", + "cd build", + "cmake ..", + "make report" + ] + } + ] + } +} diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/CMakeLists.txt b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/CMakeLists.txt new file mode 100755 index 0000000000..2880b9dcf9 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/CMakeLists.txt @@ -0,0 +1,111 @@ +set(SOURCE_FILE fpga_reg.cpp) +set(TARGET_NAME fpga_reg) +set(TARGET_NAME_REG fpga_reg_registered) +set(EMULATOR_TARGET ${TARGET_NAME}.fpga_emu) +set(FPGA_TARGET ${TARGET_NAME}.fpga) +set(FPGA_TARGET_REG ${TARGET_NAME_REG}.fpga) + +# Intel supported FPGA Boards and their names +set(A10_PAC_BOARD_NAME "intel_a10gx_pac:pac_a10") +set(S10_PAC_BOARD_NAME "intel_s10sx_pac:pac_s10") + +# Assume target is the Intel(R) PAC with Intel Arria(R) 10 GX FPGA +SET(_FPGA_BOARD ${A10_PAC_BOARD_NAME}) + +# Check if target is the Intel(R) PAC with Intel Stratix(R) 10 SX FPGA +IF (NOT DEFINED FPGA_BOARD) + MESSAGE(STATUS "\tFPGA_BOARD was not specified. Configuring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Arria(R) 10 GX FPGA. Please refer to the README for more information on how to run the design on the Intel(R) PAC with Intel Stratix(R) 10 SX FPGA.") + +ELSEIF(FPGA_BOARD STREQUAL ${A10_PAC_BOARD_NAME}) + MESSAGE(STATUS "\tConfiguring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Arria(R) 10 GX FPGA.") + +ELSEIF(FPGA_BOARD STREQUAL ${S10_PAC_BOARD_NAME}) + MESSAGE(STATUS "\tConfiguring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Stratix(R) 10 SX FPGA.") + SET(_FPGA_BOARD ${S10_PAC_BOARD_NAME}) + +ELSE() + MESSAGE(STATUS "\tAn invalid board name was passed in using the FPGA_BOARD flag. Configuring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Arria(R) 10 GX FPGA. Please refer to the README for the list of valid board names.") +ENDIF() + +set(HARDWARE_COMPILE_FLAGS "-fintelfpga") + +# use cmake -D USER_HARDWARE_FLAGS= to set extra flags for FPGA backend compilation +set(HARDWARE_LINK_FLAGS "-fintelfpga -Xshardware -Xsboard=${_FPGA_BOARD} ${USER_HARDWARE_FLAGS}") + +set(EMULATOR_COMPILE_FLAGS "-fintelfpga -DFPGA_EMULATOR") +set(EMULATOR_LINK_FLAGS "-fintelfpga") + +# fpga emulator +if(WIN32) + set(WIN_EMULATOR_TARGET ${EMULATOR_TARGET}.exe) + add_custom_target(fpga_emu DEPENDS ${WIN_EMULATOR_TARGET}) + separate_arguments(WIN_EMULATOR_COMPILE_FLAGS WINDOWS_COMMAND "${EMULATOR_COMPILE_FLAGS}") + add_custom_command(OUTPUT ${WIN_EMULATOR_TARGET} + COMMAND ${CMAKE_CXX_COMPILER} ${WIN_EMULATOR_COMPILE_FLAGS} /GX ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${WIN_EMULATOR_TARGET} + DEPENDS ${SOURCE_FILE}) + +else() + add_executable(${EMULATOR_TARGET} ${SOURCE_FILE}) + add_custom_target(fpga_emu DEPENDS ${EMULATOR_TARGET}) + set_target_properties(${EMULATOR_TARGET} PROPERTIES COMPILE_FLAGS ${EMULATOR_COMPILE_FLAGS}) + set_target_properties(${EMULATOR_TARGET} PROPERTIES LINK_FLAGS ${EMULATOR_LINK_FLAGS}) +endif() + +# fpga +if(WIN32) + add_custom_target(fpga + COMMAND echo "FPGA hardware flow is not supported in Windows") +else() + add_executable(${FPGA_TARGET} EXCLUDE_FROM_ALL ${SOURCE_FILE}) + add_executable(${FPGA_TARGET_REG} EXCLUDE_FROM_ALL ${SOURCE_FILE}) + add_custom_target(fpga DEPENDS ${FPGA_TARGET} ${FPGA_TARGET_REG}) + + set_target_properties(${FPGA_TARGET} PROPERTIES COMPILE_FLAGS ${HARDWARE_COMPILE_FLAGS}) + set_target_properties(${FPGA_TARGET} PROPERTIES LINK_FLAGS ${HARDWARE_LINK_FLAGS}) + + set_target_properties(${FPGA_TARGET_REG} PROPERTIES COMPILE_FLAGS "${HARDWARE_COMPILE_FLAGS} -DUSE_FPGA_REG") + set_target_properties(${FPGA_TARGET_REG} PROPERTIES LINK_FLAGS ${HARDWARE_LINK_FLAGS}) +endif() + +# report +if(WIN32) + set(REPORT ${TARGET_NAME}_report.a) + set(REPORT_REG ${TARGET_NAME_REG}_report.a) + + add_custom_target(report DEPENDS ${REPORT} ${REPORT_REG}) + + separate_arguments(HARDWARE_LINK_FLAGS_LIST WINDOWS_COMMAND "${HARDWARE_LINK_FLAGS}") + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} ${CMAKE_BINARY_DIR}/${TARGET_NAME}/${SOURCE_FILE} COPYONLY) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} ${CMAKE_BINARY_DIR}/${TARGET_NAME_REG}/${SOURCE_FILE} COPYONLY) + + add_custom_command(OUTPUT ${REPORT} + COMMAND ${CMAKE_CXX_COMPILER} /EHsc ${CMAKE_CXX_FLAGS} ${HARDWARE_LINK_FLAGS_LIST} -fsycl-link ${CMAKE_BINARY_DIR}/${TARGET_NAME}/${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${REPORT} + DEPENDS ${SOURCE_FILE}) + + add_custom_command(OUTPUT ${REPORT_REG} + COMMAND ${CMAKE_CXX_COMPILER} /EHsc ${CMAKE_CXX_FLAGS} ${HARDWARE_LINK_FLAGS_LIST} -DUSE_FPGA_REG -fsycl-link ${CMAKE_BINARY_DIR}/${TARGET_NAME_REG}/${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${REPORT_REG} + DEPENDS ${SOURCE_FILE}) + +else() + set(REPORT ${TARGET_NAME}_report.a) + set(REPORT_REG ${TARGET_NAME_REG}_report.a) + + add_custom_target(report DEPENDS ${REPORT} ${REPORT_REG}) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} ${SOURCE_FILE} COPYONLY) + + separate_arguments(HARDWARE_LINK_FLAGS_LIST UNIX_COMMAND "${HARDWARE_LINK_FLAGS}") + add_custom_command(OUTPUT ${REPORT} + COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${HARDWARE_LINK_FLAGS_LIST} -fsycl-link ${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${REPORT} + DEPENDS ${SOURCE_FILE}) + + add_custom_command(OUTPUT ${REPORT_REG} + COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${HARDWARE_LINK_FLAGS_LIST} -DUSE_FPGA_REG -fsycl-link ${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${REPORT_REG} + DEPENDS ${SOURCE_FILE}) +endif() + +# run +add_custom_target(run + COMMAND ../${TARGET_NAME}.fpga_emu + DEPENDS ${TARGET_NAME}.fpga_emu) diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/fpga_reg.cpp b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/fpga_reg.cpp new file mode 100755 index 0000000000..c15255631b --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/fpga_reg/src/fpga_reg.cpp @@ -0,0 +1,216 @@ +//============================================================== +// Copyright Intel Corporation +// +// SPDX-License-Identifier: MIT +// ============================================================= +#include +#include +#include +#include +#include +#include "dpc_common.hpp" + +using namespace sycl; +using namespace std; + +// Artificial coefficient and offset data for our math function +constexpr size_t kSize = 64; +constexpr std::array kCoeff = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64}; +constexpr std::array kOffset = { + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; + +// The function our kernel will compute +// The "golden result" will be computed on the host to check the kernel result. +vector GoldenResult(vector vec) { + + // The coefficients will be modified with each iteration of the outer loop. + std::array coeff = kCoeff; + + for (int &val : vec) { + // Do some arithmetic + int acc = 0; + for (size_t i = 0; i < kSize; i++) { + acc += coeff[i] * (val + kOffset[i]); + } + + // Update coeff by rotating the values of the array + int tmp = coeff[0]; + for (size_t i = 0; i < kSize - 1; i++) { + coeff[i] = coeff[i + 1]; + } + coeff[kSize - 1] = tmp; + + // Result + val = acc; + } + + return vec; +} + +// Forward declaration of the kernel name +// (This will become unnecessary in a future compiler version.) +class SimpleMath; + +void RunKernel(const device_selector &selector, + const std::vector &vec_a, + std::vector &vec_r) { + + size_t input_size = vec_a.size(); + + try { + queue q(selector, dpc_common::exception_handler, + property::queue::enable_profiling{}); + + buffer device_a(vec_a); + // Use verbose SYCL 1.2 syntax for the output buffer. + // (This will become unnecessary in a future compiler version.) + buffer device_r(vec_r.data(), input_size); + + event e = q.submit([&](handler &h) { + auto a = device_a.get_access(h); + auto r = device_r.get_access(h); + + // FPGA-optimized kernel + // Using kernel_args_restrict tells the compiler that the input + // and output buffers won't alias. + h.single_task([=]() [[intel::kernel_args_restrict]] { + + // Force the compiler to implement the coefficient array in FPGA + // pipeline registers rather than in on-chip memory. + [[intelfpga::register]] std::array coeff = kCoeff; + + // The compiler will pipeline the outer loop. + for (size_t i = 0; i < input_size; ++i) { + int acc = 0; + int val = a[i]; + + // Fully unroll the accumulator loop. + // All of the unrolled operations can be freely scheduled by the + // DPC++ compiler's FPGA backend as part of a common data pipeline. + #pragma unroll + for (size_t j = 0; j < kSize; j++) { +#ifdef USE_FPGA_REG + // Use fpga_reg to insert a register between the copy of val used + // in each unrolled iteration. + val = intel::fpga_reg(val); + // Since val is held constant across the kSize unrolled iterations, + // the FPGA hardware structure of val's distribution changes from a + // kSize-way fanout (without fpga_reg) to a chain of of registers + // with intermediate tap offs. Refer to the diagram in the README. + + // Use fpga_reg to insert a register between each step in the acc + // adder chain. + acc = intel::fpga_reg(acc) + (coeff[j] * (val + kOffset[j])); + // This transforms a compiler-inferred adder tree into an adder + // chain, altering the structure of the pipeline. Refer to the + // diagram in the README. +#else + // Without fpga_reg, the compiler schedules the operations here + // according to its default optimization heuristics. + acc += (coeff[j] * (val + kOffset[j])); +#endif + } + + // Rotate the values of the coefficient array. + // The loop is fully unrolled. This is a cannonical code structure; + // the DPC++ compiler's FPGA backend infers a shift register here. + int tmp = coeff[0]; + #pragma unroll + for (size_t j = 0; j < kSize - 1; j++) { + coeff[j] = coeff[j + 1]; + } + coeff[kSize - 1] = tmp; + + // Result + r[i] = acc; + } + }); + }); + + // Measure kernel execution time + double start = e.get_profiling_info(); + double end = e.get_profiling_info(); + // Convert from nanoseconds to milliseconds. + double kernel_time = (end - start) * 1e-6; + + // Kernel consists of two nested loops with 3 operations in the innermost + // loop: 2 additions and 1 multiplication operation. + size_t num_ops_per_kernel = input_size * kSize * 3; + cout << "Throughput for kernel with input size " << input_size + << " and coefficient array size " << kSize << ": "; + cout << std::fixed << std::setprecision(6) + << ((double)num_ops_per_kernel / kernel_time) / 1.0e6 << " GFlops\n"; + + } catch (sycl::exception const &e) { + // Catches exceptions in the host code + std::cout << "Caught a SYCL host exception:\n" << e.what() << "\n"; + + // Most likely the runtime couldn't find FPGA hardware! + if (e.get_cl_code() == CL_DEVICE_NOT_FOUND) { + std::cout << "If you are targeting an FPGA, please ensure that your " + "system has a correctly configured FPGA board.\n"; + std::cout << "If you are targeting the FPGA emulator, compile with " + "-DFPGA_EMULATOR.\n"; + } + std::terminate(); + } +} + +int main(int argc, char *argv[]) { + size_t input_size = 1e6; + + // Optional command line override of default input size + if (argc > 1) { + string option(argv[1]); + if (option == "-h" || option == "--help") { + cout << "Usage: \n \n\nFAILED\n"; + return 1; + } else { + input_size = stoi(option); + } + } + + // Initialize input vector + constexpr int max_val = 1<<10; // Conservative max to avoid integer overflow + vector vec_a(input_size); + for (size_t i = 0; i < input_size; i++) { + vec_a[i] = rand() % max_val; + } + // Kernel result vector + vector vec_r(input_size); + + // Run the kernel on either the FPGA emulator, or FPGA +#if defined(FPGA_EMULATOR) + intel::fpga_emulator_selector selector; +#else + intel::fpga_selector selector; +#endif + RunKernel(selector, vec_a, vec_r); + + // Test the results. + vector golden_ref = GoldenResult(vec_a); + bool correct = true; + for (size_t i = 0; i < input_size; i++) { + if (vec_r[i] != golden_ref[i]) { + cout << "Found mismatch at " << i << ", " + << vec_r[i] << " != " << golden_ref[i] << "\n"; + correct = false; + } + } + + if (correct) { + cout << "PASSED: Results are correct.\n"; + } else { + cout << "FAILED: Results are incorrect.\n"; + return 1; + } + + return 0; +} diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/CMakeLists.txt b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/CMakeLists.txt new file mode 100755 index 0000000000..a94ffc91b3 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/CMakeLists.txt @@ -0,0 +1,11 @@ +set(CMAKE_CXX_COMPILER "dpcpp") + +cmake_minimum_required (VERSION 2.8) + +project(LoopUnroll) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + +add_subdirectory (src) diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/License.txt b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/License.txt new file mode 100755 index 0000000000..e63c6e13dc --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/License.txt @@ -0,0 +1,7 @@ +Copyright Intel Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/README.md b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/README.md new file mode 100755 index 0000000000..5c2528eeb0 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/README.md @@ -0,0 +1,188 @@ + +# Unrolling Loops +This FPGA tutorial demonstrates a simple example of unrolling loops to improve the throughput of a DPC++ FPGA program. + +***Documentation***: The [oneAPI DPC++ FPGA Optimization Guide](https://software.intel.com/content/www/us/en/develop/documentation/oneapi-fpga-optimization-guide) provides comprehensive instructions for targeting FPGAs through DPC++. The [oneAPI Programming Guide](https://software.intel.com/en-us/oneapi-programming-guide) is a general resource for target-independent DPC++ programming. + +| Optimized for | Description +--- |--- +| OS | Linux* Ubuntu* 18.04 +| Hardware | Intel® Programmable Acceleration Card (PAC) with Intel Arria® 10 GX FPGA;
Intel® Programmable Acceleration Card (PAC) with Intel Stratix® 10 SX FPGA +| Software | Intel® oneAPI DPC++ Compiler (Beta)
Intel® FPGA Add-On for oneAPI Base Toolkit +| What you will learn | Basics of loop unrolling
How to unroll loops in your program
Determining the optimal unroll factor for your program +| Time to complete | 15 minutes + +_Notice: This code sample is not yet supported in Windows*_ + +## Purpose + +The loop unrolling mechanism is used to increase program parallelism by duplicating the compute logic within a loop. The number of times the loop logic is duplicated is called the *unroll factor*. Depending on whether the *unroll factor* is equal to the number of loop iterations or not, loop unroll methods can be categorized as *full-loop unrolling* and *partial-loop unrolling*. + +### Example: Full-Loop Unrolling +```c++ +// Before unrolling loop +#pragma unroll +for(i = 0 ; i < 5; i++){ + a[i] += 1; +} + +// Equivalent code after unrolling +// There is no longer any loop +a[0] += 1; +a[1] += 1; +a[2] += 1; +a[3] += 1; +a[4] += 1; +``` +A full unroll is a special case where the unroll factor is equal to the number of loop iterations. Here, the the Intel® oneAPI DPC++ Compiler for FPGA instantiates five adders instead of the one adder. + +### Example: Partial-Loop Unrolling + +```c++ +// Before unrolling loop +#pragma unroll 4 +for(i = 0 ; i < 20; i++){ + a[i] += 1; +} + +// Equivalent code after unrolling by a factor of 4 +// The resulting loop has five (20 / 4) iterations +for(i = 0 ; i < 5; i++){ + a[i * 4] += 1; + a[i * 4 + 1] += 1; + a[i * 4 + 2] += 1; + a[i * 4 + 3] += 1; +} +``` +Each loop iteration in the "equivalent code" contains four unrolled invocations of the first. The Intel® oneAPI DPC++ Compiler (Beta) for FPGA instantiates four adders instead of one adder. Because there is no data dependency between iterations in the loop in this case, the compiler schedules all four adds in parallel. + +### Determining the optimal unroll factor +In an FPGA design, unrolling loops is a common strategy to directly trade off on-chip resources for increased throughput. When selecting the unroll factor for specific loop, the intent is to improve throughput while minimizing resource utilization. It is also important to be mindful of other throughput constraints in your system, such as memory bandwidth. + +### Tutorial design +This tutorial demonstrates this trade-off with a simple vector add kernel. The tutorial shows how increasing the unroll factor on a loop increases throughput... until another bottleneck is encountered. This example is constructed to run up against global memory bandwidth constraints. + +The memory bandwidth on an Intel® Programmable Acceleration Card with Intel Arria® 10 GX FPGA system is about 6 GB/s. The tutorial design will likely run at around 300 MHz. In this design, the FPGA design processes a new iterations every cycle in a pipeline-parallel fashion. The theoretical computation limit for 1 adder is: + +**GFlops**: 300 MHz \* 1 float = 0.3 GFlops + +**Computation Bandwidth**: 300 MHz \* 1 float * 4 Bytes = 1.2 GB/s + +You repeat this back-of-the-envelope calculation for different unroll factors: + +Unroll Factor | GFlops (GB/s) | Compuation Bandwidth (GB/s) +------------- | ------------- | ----------------------- +1 | 0.3 | 1.2 +2 | 0.6 | 2.4 +4 | 1.2 | 4.8 +8 | 2.4 | 9.6 +16 | 4.8 | 19.2 + +On an Intel® Programmable Acceleration Card with Intel Arria® 10 GX FPGA, it is reasonable to predict that this program will become memory-bandwidth limited when unroll factor grows from 4 to 8. Check this prediction by running the design following the instructions below. + + +## Key Concepts +* Basics of loop unrolling. +* How to unroll loops in your program. +* Determining the optimal unroll factor for your program. + +## License +This code sample is licensed under MIT license. + + +## Building the `loop_unroll` Tutorial + +### Include Files +The included header `dpc_common.hpp` is located at `%ONEAPI_ROOT%\dev-utilities\latest\include` on your development system. + +### Running Samples in DevCloud +If running a sample in the Intel DevCloud, remember that you must specify the compute node (fpga_compile or fpga_runtime) as well as whether to run in batch or interactive mode. For more information see the Intel® oneAPI Base Toolkit Get Started Guide ([https://devcloud.intel.com/oneapi/get-started/base-toolkit/](https://devcloud.intel.com/oneapi/get-started/base-toolkit/)). + +When compiling for FPGA hardware, it is recommended to increase the job timeout to 12h. + +### On a Linux* System + +1. Generate the `Makefile` by running `cmake`. + ``` + mkdir build + cd build + ``` + To compile for the Intel® PAC with Intel Arria® 10 GX FPGA, run `cmake` using the command: + ``` + cmake .. + ``` + Alternatively, to compile for the Intel® PAC with Intel Stratix® 10 SX FPGA, run `cmake` using the command: + + ``` + cmake .. -DFPGA_BOARD=intel_s10sx_pac:pac_s10 + ``` + +2. Compile the design through the generated `Makefile`. The following build targets are provided, matching the recommended development flow: + + * Compile for emulation (fast compile time, targets emulated FPGA device): + ``` + make fpga_emu + ``` + * Generate the optimization report: + ``` + make report + ``` + * Compile for FPGA hardware (longer compile time, targets FPGA device): + ``` + make fpga + ``` +3. (Optional) As the above hardware compile may take several hours to complete, an Intel® PAC with Intel Arria® 10 GX FPGA precompiled binary can be downloaded
here. + + + ### In Third-Party Integrated Development Environments (IDEs) + +You can compile and run this tutorial in the Eclipse* IDE (in Linux*). For instructions, refer to the following link: [Intel® oneAPI DPC++ FPGA Workflows on Third-Party IDEs](https://software.intel.com/en-us/articles/intel-oneapi-dpcpp-fpga-workflow-on-ide) + +## Examining the Reports +Locate `report.html` in the `loop_unroll_report.prj/reports/` or `loop_unroll_s10_pac_report.prj/reports/` directory. Open the report in any of Chrome*, Firefox*, Edge*, or Internet Explorer*. + +Navigate to the Area Report and compare the FPGA resource utilization of the kernels with unroll factors of 1, 2, 4, 8, and 16. In particular, check the number of DSP resources consumed. You should see the area grow roughly linearly with the unroll factor. + +You can also check the achieved system fMAX in order to verify the earlier calculations. + +## Running the Sample + + 1. Run the sample on the FPGA emulator (the kernel executes on the CPU): + ``` + ./loop_unroll.fpga_emu (Linux) + ``` +2. Run the sample on the FPGA device: + ``` + ./loop_unroll.fpga (Linux) + ``` + +### Example of Output +``` +Input Array Size: 67108864 +UnrollFactor 1 kernel time : 255.749 ms +Throughput for kernel with UnrollFactor 1: 0.262 GFlops +UnrollFactor 2 kernel time : 140.285 ms +Throughput for kernel with UnrollFactor 2: 0.478 GFlops +UnrollFactor 4 kernel time : 68.296 ms +Throughput for kernel with UnrollFactor 4: 0.983 GFlops +UnrollFactor 8 kernel time : 44.567 ms +Throughput for kernel with UnrollFactor 8: 1.506 GFlops +UnrollFactor 16 kernel time : 39.175 ms +Throughput for kernel with UnrollFactor 16: 1.713 GFlops +PASSED: The results are correct +``` + +### Discussion of Results +The following table summarizes the execution time (in ms), throughput (in GFlops), and number of DSPs used for unroll factors of 1, 2, 4, 8, and 16 for a default input array size of 64M floats (2 ^ 26 floats) on Intel® Programmable Acceleration Card with Intel® Arria® 10 GX FPGA: + +Unroll Factor | Kernel Time (ms) | Throughput (GFlops) | Num of DSPs +------------- | ------------- | -----------------------| ------- +1 | 242 | 0.277 | 1 +2 | 127 | 0.528 | 2 +4 | 63 | 1.065 | 4 +8 | 46 | 1.459 | 8 +16 | 44 | 1.525 | 16 + +Notice that when the unroll factor increases from 1 to 2 and from 2 to 4, the kernel execution time decreases by a factor of two. Correspondingly, the kernel throughput doubles. However, when the unroll factor is increase from 4 to 8 and from 8 to 16, the throughput does no longer scales by a factor of two at each step. The design is now bound by memory bandwidth limitations instead of compute unit limitations even though the hardware is replicated. + +These performance differences will be apparent only when running on FPGA hardware. The emulator, while useful for verifying functionality, will generally not reflect differences in performance. diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/sample.json b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/sample.json new file mode 100755 index 0000000000..3863df9d59 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/sample.json @@ -0,0 +1,34 @@ +{ + "guid": "2760C1B6-25E5-4280-9F8F-34CA8DDEDA7C", + "name": "Unrolling Loops", + "categories": ["Toolkit/Intel® oneAPI Base Toolkit/FPGA/Tutorials"], + "description": "FPGA tutorial design demonstrating the loop_unroll pragma", + "toolchain": ["dpcpp"], + "os": ["linux"], + "targetDevice": ["FPGA"], + "builder": ["cmake"], + "languages": [{"cpp":{}}], + "ciTests": { + "linux": [ + { + "id": "fpga_emu", + "steps": [ + "mkdir build", + "cd build", + "cmake ..", + "make fpga_emu", + "./loop_unroll.fpga_emu" + ] + }, + { + "id": "report", + "steps": [ + "mkdir build", + "cd build", + "cmake ..", + "make report" + ] + } + ] + } +} diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/CMakeLists.txt b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/CMakeLists.txt new file mode 100755 index 0000000000..3ca0487ff3 --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/CMakeLists.txt @@ -0,0 +1,89 @@ +set(SOURCE_FILE loop_unroll.cpp) +set(TARGET_NAME loop_unroll) + +set(EMULATOR_TARGET ${TARGET_NAME}.fpga_emu) +set(FPGA_TARGET ${TARGET_NAME}.fpga) + +# Intel supported FPGA Boards and their names +set(A10_PAC_BOARD_NAME "intel_a10gx_pac:pac_a10") +set(S10_PAC_BOARD_NAME "intel_s10sx_pac:pac_s10") + +# Assume target is the Intel(R) PAC with Intel Arria(R) 10 GX FPGA +SET(_FPGA_BOARD ${A10_PAC_BOARD_NAME}) + +# Check if target is the Intel(R) PAC with Intel Stratix(R) 10 SX FPGA +IF (NOT DEFINED FPGA_BOARD) + MESSAGE(STATUS "\tFPGA_BOARD was not specified. Configuring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Arria(R) 10 GX FPGA. Please refer to the README for more information on how to run the design on the Intel(R) PAC with Intel Stratix(R) 10 SX FPGA.") + +ELSEIF(FPGA_BOARD STREQUAL ${A10_PAC_BOARD_NAME}) + MESSAGE(STATUS "\tConfiguring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Arria(R) 10 GX FPGA.") + +ELSEIF(FPGA_BOARD STREQUAL ${S10_PAC_BOARD_NAME}) + MESSAGE(STATUS "\tConfiguring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Stratix(R) 10 SX FPGA.") + SET(_FPGA_BOARD ${S10_PAC_BOARD_NAME}) + +ELSE() + MESSAGE(STATUS "\tAn invalid board name was passed in using the FPGA_BOARD flag. Configuring the design to run on the Intel(R) Programmable Acceleration Card (PAC) with Intel Arria(R) 10 GX FPGA. Please refer to the README for the list of valid board names.") +ENDIF() + +set(HARDWARE_COMPILE_FLAGS "-fintelfpga") + +# use cmake -D USER_HARDWARE_FLAGS= to set extra flags for FPGA backend compilation +set(HARDWARE_LINK_FLAGS "-fintelfpga -Xshardware -Xsboard=${_FPGA_BOARD} ${USER_HARDWARE_FLAGS}") + +set(EMULATOR_COMPILE_FLAGS "-fintelfpga -DFPGA_EMULATOR") +set(EMULATOR_LINK_FLAGS "-fintelfpga") + +# fpga emulator +if(WIN32) + set(WIN_EMULATOR_TARGET ${EMULATOR_TARGET}.exe) + add_custom_target(fpga_emu DEPENDS ${WIN_EMULATOR_TARGET}) + separate_arguments(WIN_EMULATOR_COMPILE_FLAGS WINDOWS_COMMAND "${EMULATOR_COMPILE_FLAGS}") + add_custom_command(OUTPUT ${WIN_EMULATOR_TARGET} + COMMAND ${CMAKE_CXX_COMPILER} ${WIN_EMULATOR_COMPILE_FLAGS} /GX ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${WIN_EMULATOR_TARGET} + DEPENDS ${SOURCE_FILE}) +else() + add_executable(${EMULATOR_TARGET} ${SOURCE_FILE}) + add_custom_target(fpga_emu DEPENDS ${EMULATOR_TARGET}) + set_target_properties(${EMULATOR_TARGET} PROPERTIES COMPILE_FLAGS ${EMULATOR_COMPILE_FLAGS}) + set_target_properties(${EMULATOR_TARGET} PROPERTIES LINK_FLAGS ${EMULATOR_LINK_FLAGS}) +endif() + + +# fpga +if(WIN32) + add_custom_target(fpga + COMMAND echo "FPGA hardware flow is not supported in Windows") +else() + add_executable(${FPGA_TARGET} EXCLUDE_FROM_ALL ${SOURCE_FILE}) + add_custom_target(fpga DEPENDS ${FPGA_TARGET}) + set_target_properties(${FPGA_TARGET} PROPERTIES COMPILE_FLAGS ${HARDWARE_COMPILE_FLAGS}) + set_target_properties(${FPGA_TARGET} PROPERTIES LINK_FLAGS ${HARDWARE_LINK_FLAGS}) +endif() + +# generate report +if(WIN32) + set(DEVICE_OBJ_FILE ${TARGET_NAME}_report.a) + add_custom_target(report DEPENDS ${DEVICE_OBJ_FILE}) + + separate_arguments(HARDWARE_LINK_FLAGS_LIST WINDOWS_COMMAND "${HARDWARE_LINK_FLAGS}") + add_custom_command(OUTPUT ${DEVICE_OBJ_FILE} + COMMAND ${CMAKE_CXX_COMPILER} /EHsc ${CMAKE_CXX_FLAGS} ${HARDWARE_LINK_FLAGS_LIST} -fsycl-link ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${DEVICE_OBJ_FILE} + DEPENDS ${SOURCE_FILE}) + +else() + set(DEVICE_OBJ_FILE ${TARGET_NAME}_report.a) + add_custom_target(report DEPENDS ${DEVICE_OBJ_FILE}) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} ${SOURCE_FILE} COPYONLY) + + separate_arguments(HARDWARE_LINK_FLAGS_LIST UNIX_COMMAND "${HARDWARE_LINK_FLAGS}") + add_custom_command(OUTPUT ${DEVICE_OBJ_FILE} + COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${HARDWARE_LINK_FLAGS_LIST} -fsycl-link ${SOURCE_FILE} -o ${CMAKE_BINARY_DIR}/${DEVICE_OBJ_FILE} + DEPENDS ${SOURCE_FILE}) +endif() + +# run +add_custom_target(run + COMMAND ../${TARGET_NAME}.fpga_emu + DEPENDS ${TARGET_NAME}.fpga_emu) diff --git a/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/loop_unroll.cpp b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/loop_unroll.cpp new file mode 100755 index 0000000000..bab7954bea --- /dev/null +++ b/DirectProgramming/DPC++FPGA/Tutorials/Features/loop_unroll/src/loop_unroll.cpp @@ -0,0 +1,138 @@ +//============================================================== +// Copyright Intel Corporation +// +// SPDX-License-Identifier: MIT +// ============================================================= +#include +#include +#include +#include +#include +#include "dpc_common.hpp" + +using namespace sycl; + +template class VAdd; + +// This function instantiates the vector add kernel, which contains +// a loop that adds up the two summand arrays and stores the result +// into sum. This loop will be unrolled by the specified unroll_factor. +template +void VecAdd(const std::vector &summands1, + const std::vector &summands2, std::vector &sum, + size_t array_size) { + + +#if defined(FPGA_EMULATOR) + intel::fpga_emulator_selector device_selector; +#else + intel::fpga_selector device_selector; +#endif + + try { + queue q(device_selector, dpc_common::exception_handler, + property::queue::enable_profiling{}); + + buffer buffer_summands1(summands1); + buffer buffer_summands2(summands2); + // Use verbose SYCL 1.2 syntax for the output buffer. + // (This will become unnecessary in a future compiler version.) + buffer buffer_sum(sum.data(), array_size); + + event e = q.submit([&](handler &h) { + auto acc_summands1 = buffer_summands1.get_access(h); + auto acc_summands2 = buffer_summands2.get_access(h); + auto acc_sum = buffer_sum.get_access(h); + + h.single_task>([=]() + [[intel::kernel_args_restrict]] { + // Unroll the loop fully or partially, depending on unroll_factor + #pragma unroll unroll_factor + for (size_t i = 0; i < array_size; i++) { + acc_sum[i] = acc_summands1[i] + acc_summands2[i]; + } + }); + }); + + double start = e.get_profiling_info(); + double end = e.get_profiling_info(); + // convert from nanoseconds to ms + double kernel_time = (double)(end - start) * 1e-6; + + std::cout << "unroll_factor " << unroll_factor + << " kernel time : " << kernel_time << " ms\n"; + std::cout << "Throughput for kernel with unroll_factor " << unroll_factor + << ": "; + std::cout << std::fixed << std::setprecision(3) + << ((double)array_size / kernel_time) / 1e6f << " GFlops\n"; + + } catch (sycl::exception const &e) { + // Catches exceptions in the host code + std::cout << "Caught a SYCL host exception:\n" << e.what() << "\n"; + + // Most likely the runtime couldn't find FPGA hardware! + if (e.get_cl_code() == CL_DEVICE_NOT_FOUND) { + std::cout << "If you are targeting an FPGA, please ensure that your " + "system has a correctly configured FPGA board.\n"; + std::cout << "If you are targeting the FPGA emulator, compile with " + "-DFPGA_EMULATOR.\n"; + } + std::terminate(); + } +} + +int main(int argc, char *argv[]) { + size_t array_size = 1 << 26; + + if (argc > 1) { + std::string option(argv[1]); + if (option == "-h" || option == "--help") { + std::cout << "Usage: \n \n\nFAILED\n"; + return 1; + } else { + array_size = std::stoi(option); + } + } + + std::vector summands1(array_size); + std::vector summands2(array_size); + + std::vector sum_unrollx1(array_size); + std::vector sum_unrollx2(array_size); + std::vector sum_unrollx4(array_size); + std::vector sum_unrollx8(array_size); + std::vector sum_unrollx16(array_size); + + // Initialize the two summand arrays (arrays to be added to each other) to + // 1:N and N:1, so that the sum of all elements is N + 1 + for (size_t i = 0; i < array_size; i++) { + summands1[i] = static_cast(i + 1); + summands2[i] = static_cast(array_size - i); + } + + std::cout << "Input Array Size: " << array_size << "\n"; + + // Instantiate VecAdd kernel with different unroll factors: 1, 2, 4, 8, 16 + // The VecAdd kernel contains a loop that adds up the two summand arrays. + // This loop will be unrolled by the specified unroll factor. + // The sum array is expected to be identical, regardless of the unroll factor. + VecAdd<1>(summands1, summands2, sum_unrollx1, array_size); + VecAdd<2>(summands1, summands2, sum_unrollx2, array_size); + VecAdd<4>(summands1, summands2, sum_unrollx4, array_size); + VecAdd<8>(summands1, summands2, sum_unrollx8, array_size); + VecAdd<16>(summands1, summands2, sum_unrollx16, array_size); + + // Verify that the output data is the same for every unroll factor + for (size_t i = 0; i < array_size; i++) { + if (sum_unrollx1[i] != summands1[i] + summands2[i] || + sum_unrollx1[i] != sum_unrollx2[i] || + sum_unrollx1[i] != sum_unrollx4[i] || + sum_unrollx1[i] != sum_unrollx8[i] || + sum_unrollx1[i] != sum_unrollx16[i]) { + std::cout << "FAILED: The results are incorrect\n"; + return 1; + } + } + std::cout << "PASSED: The results are correct\n"; + return 0; +}