Skip to content

Commit 0eb3fa5

Browse files
mendell27JoeOsterericlars
authored andcommitted
FPGA Fast recompile (#700)
* ONSAM-1414 Broken Link in Headers (#685) * Update Makefile * Update Makefile * Update Makefile * Update DCT.hpp * Update intrin_ftz_sample.cpp * Update merge_sort.cpp * Update intrin_double_sample.cpp * Update intrin_dot_sample.cpp * Update DCT.cpp * fix deprecation notice (#682) * Improve CMakeLists.txt for FPGA fast_recompile Simplify the 'fpga_emu' target and add a 'report' target. Only the hardware target needs to use the explicit commands. Signed-off-by: Mark Mendell <mark.p.mendell@intel.com> Co-authored-by: JoeOster <52936608+JoeOster@users.noreply.github.com> Co-authored-by: ericlars <eric.larson@intel.com>
1 parent d2d0361 commit 0eb3fa5

File tree

1 file changed

+31
-35
lines changed
  • DirectProgramming/DPC++FPGA/Tutorials/GettingStarted/fast_recompile/src

1 file changed

+31
-35
lines changed

DirectProgramming/DPC++FPGA/Tutorials/GettingStarted/fast_recompile/src/CMakeLists.txt

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,43 @@ if(WIN32)
2020
set(WIN_FLAG "/EHsc")
2121
endif()
2222

23-
set(EMULATOR_COMPILE_FLAGS -Wall ${WIN_FLAG} -fintelfpga -DFPGA_EMULATOR -c)
24-
set(EMULATOR_LINK_FLAGS -fintelfpga)
25-
set(HARDWARE_COMPILE_FLAGS -Wall ${WIN_FLAG} -fintelfpga -c)
26-
set(HARDWARE_LINK_FLAGS -fintelfpga -Xshardware -Xsboard=${FPGA_BOARD} ${USER_HARDWARE_FLAGS})
23+
# A DPC++ ahead-of-time (AoT) compile processes the device code in two stages.
24+
# 1. The "compile" stage compiles the device code to an intermediate representation (SPIR-V).
25+
# 2. The "link" stage invokes the compiler's FPGA backend before linking.
26+
# For this reason, FPGA backend flags must be passed as link flags in CMake.
27+
set(EMULATOR_COMPILE_FLAGS "-Wall ${WIN_FLAG} -fintelfpga -DFPGA_EMULATOR")
28+
set(EMULATOR_LINK_FLAGS "-fintelfpga")
29+
set(HARDWARE_COMPILE_FLAGS "-Wall ${WIN_FLAG} -fintelfpga")
30+
set(HARDWARE_LINK_FLAGS "-fintelfpga -Xshardware -Xsboard=${FPGA_BOARD} ${USER_HARDWARE_FLAGS}")
2731
# use cmake -D USER_HARDWARE_FLAGS=<flags> to set extra flags for FPGA backend compilation
2832

2933
###############################################################################
3034
### FPGA Emulator
3135
###############################################################################
32-
# To compile manually:
33-
# dpcpp -fintelfpga -DFPGA_EMULATOR -c host.cpp -o host_emu.o
34-
# dpcpp -fintelfpga -DFPGA_EMULATOR -c kernel.cpp -o dev_emu.o
35-
# dpcpp -fintelfpga -fsycl-link=image dev_emu.o -o dev_image_emu.a
36-
# dpcpp -fintelfpga host_emu.o dev_image_emu.a -o fast_recompile.fpga
37-
38-
if(WIN32)
39-
set(EMULATOR_TARGET ${EMULATOR_TARGET}.exe)
40-
endif()
36+
# To compile in a single command:
37+
# dpcpp -fintelfpga -DFPGA_EMULATOR host.cpp kernel.cpp -o fast_recompile.fpga_emu
38+
# CMake executes:
39+
# [compile] dpcpp -fintelfpga -DFPGA_EMULATOR -o host.cpp.o -c host.cpp
40+
# [compile] dpcpp -fintelfpga -DFPGA_EMULATOR -o kernel.cpp.o -c kernel.cpp
41+
# [link] dpcpp -fintelfpga host.cpp.o kernel.cpp.o -o fast_recompile.fpga_emu
42+
add_executable(${EMULATOR_TARGET} ${HOST_SOURCE_FILE} ${DEVICE_SOURCE_FILE})
43+
set_target_properties(${EMULATOR_TARGET} PROPERTIES COMPILE_FLAGS "${EMULATOR_COMPILE_FLAGS}")
44+
set_target_properties(${EMULATOR_TARGET} PROPERTIES LINK_FLAGS "${EMULATOR_LINK_FLAGS}")
4145
add_custom_target(fpga_emu DEPENDS ${EMULATOR_TARGET})
42-
set(HOST_EMU_OBJ "host_emu.o")
43-
set(DEVICE_EMU_OBJ "dev_emu.o")
44-
set(DEVICE_IMAGE_EMU_OBJ "dev_image_emu.a")
4546

46-
set(CMAKE_CXX_FLAGS_LIST ${CMAKE_CXX_FLAGS_LIST})
47-
separate_arguments(CMAKE_CXX_FLAGS_LIST)
48-
49-
add_custom_command(OUTPUT ${HOST_EMU_OBJ}
50-
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${EMULATOR_COMPILE_FLAGS}
51-
${CMAKE_CURRENT_SOURCE_DIR}/${HOST_SOURCE_FILE} -o ${HOST_EMU_OBJ}
52-
DEPENDS ${HOST_SOURCE_FILE} ${KERNEL_HEADER_FILE})
53-
54-
add_custom_command(OUTPUT ${DEVICE_EMU_OBJ}
55-
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${EMULATOR_COMPILE_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${DEVICE_SOURCE_FILE} -o ${DEVICE_EMU_OBJ}
56-
DEPENDS ${DEVICE_SOURCE_FILE} ${KERNEL_HEADER_FILE})
57-
58-
add_custom_command(OUTPUT ${DEVICE_IMAGE_EMU_OBJ}
59-
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${EMULATOR_LINK_FLAGS} -fsycl-link=image ${DEVICE_EMU_OBJ} -o ${DEVICE_IMAGE_EMU_OBJ}
60-
DEPENDS ${DEVICE_EMU_OBJ})
47+
###############################################################################
48+
### Generate Report
49+
###############################################################################
50+
# To compile manually:
51+
# dpcpp -fintelfpga -Xshardware -Xsboard=<FPGA_BOARD> -fsycl-link=early host.cpp kernel.cpp -o fast_compile_report.a
52+
set(FPGA_EARLY_IMAGE ${TARGET_NAME}_report.a)
53+
# The compile output is not an executable, but an intermediate compilation result unique to DPC++.
54+
add_executable(${FPGA_EARLY_IMAGE} ${HOST_SOURCE_FILE} ${DEVICE_SOURCE_FILE})
55+
add_custom_target(report DEPENDS ${FPGA_EARLY_IMAGE})
56+
set_target_properties(${FPGA_EARLY_IMAGE} PROPERTIES COMPILE_FLAGS ${HARDWARE_COMPILE_FLAGS})
57+
set_target_properties(${FPGA_EARLY_IMAGE} PROPERTIES LINK_FLAGS "${HARDWARE_LINK_FLAGS} -fsycl-link=early")
58+
# fsycl-link=early stops the compiler after RTL generation, before invoking Quartus®
6159

62-
add_custom_command(OUTPUT ${EMULATOR_TARGET}
63-
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} -fintelfpga ${HOST_EMU_OBJ} ${DEVICE_IMAGE_EMU_OBJ} -o ${CMAKE_BINARY_DIR}/${EMULATOR_TARGET}
64-
DEPENDS ${HOST_EMU_OBJ} ${DEVICE_IMAGE_EMU_OBJ})
6560

6661
###############################################################################
6762
### FPGA Hardware
@@ -83,9 +78,10 @@ set(CMAKE_CXX_FLAGS_LIST "${CMAKE_CXX_FLAGS}")
8378
separate_arguments(CMAKE_CXX_FLAGS_LIST)
8479
set(HARDWARE_LINK_FLAGS_LIST "${HARDWARE_LINK_FLAGS}")
8580
separate_arguments(HARDWARE_LINK_FLAGS_LIST)
81+
8682

8783
add_custom_command(OUTPUT ${HOST_OBJ}
88-
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${HARDWARE_COMPILE_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${HOST_SOURCE_FILE} -o ${HOST_OBJ}
84+
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${HARDWARE_COMPILE_FLAGS} -c ${CMAKE_CURRENT_SOURCE_DIR}/${HOST_SOURCE_FILE} -o ${HOST_OBJ}
8985
DEPENDS ${HOST_SOURCE_FILE} ${KERNEL_HEADER_FILE})
9086

9187
add_custom_command(OUTPUT ${DEVICE_IMAGE_OBJ}

0 commit comments

Comments
 (0)