-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathCMakeLists.txt
192 lines (175 loc) · 10.6 KB
/
CMakeLists.txt
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
cmake_minimum_required(VERSION 3.0)
project(apfp)
set(CMAKE_CXX_STANDARD 17)
# Target options
set(APFP_PLATFORM "xilinx_u250_gen3x16_xdma_3_1_202020_1" CACHE STRING "Platform string for Vitis.")
set(APFP_BITS 1024 CACHE STRING "Number of bits to use for a floating point number, including mantissa, exponent, and sign.")
set(APFP_MULT_BASE_BITS 18 CACHE STRING "Number of bits to bottom out the multiplication at and use native multiplication.")
set(APFP_STREAMING_BASE_BITS 256 CACHE STRING "Bit width where Karatsuba will be implemented as a single pipeline.")
set(APFP_TILE_SIZE_N 32 CACHE STRING "Tile size in the N-dimension when running matrix-matrix multiplication.")
set(APFP_TILE_SIZE_M 32 CACHE STRING "Tile size in the M-dimension when running matrix-matrix multiplication.")
set(APFP_COMPUTE_UNITS 1 CACHE STRING "Number of replications of the kernel to instantiate.")
set(APFP_SEMANTICS "MPFR" CACHE STRING "Which semantics to use for floating point operations [GMP/MPFR].")
set(APFP_DEBUGGING OFF CACHE BOOL "Enable debugging in generated kernels.")
set(APFP_PROFILING OFF CACHE BOOL "Enable profiling in generated kernels.")
set(APFP_SAVE_TEMPS ON CACHE BOOL "Save temporary files from kernel builds.")
set_property(CACHE APFP_SEMANTICS PROPERTY STRINGS GMP MPFR)
# Validation and derived numbers
math(EXPR APFP_ALIGNED "${APFP_BITS} % 512")
if(NOT APFP_ALIGNED EQUAL 0)
message(FATAL_ERROR "Number of bits ${APFP_BITS} must be aligned to the DRAM line size of 512 bits.")
endif()
math(EXPR APFP_MAX_BITS "${APFP_BITS} * 2 + 1")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/hlslib/cmake ${CMAKE_SOURCE_DIR}/cmake)
find_package(Vitis REQUIRED)
find_package(MPFR REQUIRED)
find_package(GMP REQUIRED)
find_package(Threads REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -Wno-unused-label -Wno-class-memaccess -Wno-unknown-pragmas -DAPFP_${APFP_SEMANTICS}_SEMANTICS")
include_directories(${CMAKE_BINARY_DIR} include SYSTEM hlslib/include ${Vitis_INCLUDE_DIRS} )
configure_file(include/Config.h.in Config.h)
set(APFP_KERNEL_FILES device/MatrixMultiplication.cpp
device/ArithmeticOperations.cpp)
# Mapping to DDR ports
set(APFP_PORT_MAPPING MatrixMultiplication_1.m_axi_a:DDR[1]
MatrixMultiplication_1.m_axi_b:DDR[1]
MatrixMultiplication_1.m_axi_c_read:DDR[1]
MatrixMultiplication_1.m_axi_c_write:DDR[1])
set(APFP_CONNECTIVITY MatrixMultiplication_1.a_to_kernel:FreeRunningMultiplication_1.a_to_kernel
MatrixMultiplication_1.b_to_kernel:FreeRunningMultiplication_1.b_to_kernel
FreeRunningMultiplication_1.ab_from_kernel:MatrixMultiplication_1.ab_from_kernel)
if(${APFP_COMPUTE_UNITS} GREATER 1)
set(APFP_PORT_MAPPING ${APFP_PORT_MAPPING}
MatrixMultiplication_2.m_axi_a:DDR[0]
MatrixMultiplication_2.m_axi_b:DDR[0]
MatrixMultiplication_2.m_axi_c_read:DDR[0]
MatrixMultiplication_2.m_axi_c_write:DDR[0])
set(APFP_CONNECTIVITY ${APFP_CONNECTIVITY}
MatrixMultiplication_2.a_to_kernel:FreeRunningMultiplication_2.a_to_kernel
MatrixMultiplication_2.b_to_kernel:FreeRunningMultiplication_2.b_to_kernel
FreeRunningMultiplication_2.ab_from_kernel:MatrixMultiplication_2.ab_from_kernel)
endif()
if(${APFP_COMPUTE_UNITS} GREATER 2)
set(APFP_PORT_MAPPING ${APFP_PORT_MAPPING}
MatrixMultiplication_3.m_axi_a:DDR[2]
MatrixMultiplication_3.m_axi_b:DDR[2]
MatrixMultiplication_3.m_axi_c_read:DDR[2]
MatrixMultiplication_3.m_axi_c_write:DDR[2])
set(APFP_CONNECTIVITY ${APFP_CONNECTIVITY}
MatrixMultiplication_3.a_to_kernel:FreeRunningMultiplication_3.a_to_kernel
MatrixMultiplication_3.b_to_kernel:FreeRunningMultiplication_3.b_to_kernel
FreeRunningMultiplication_3.ab_from_kernel:MatrixMultiplication_3.ab_from_kernel)
endif()
if(${APFP_COMPUTE_UNITS} GREATER 3)
set(APFP_PORT_MAPPING ${APFP_PORT_MAPPING}
MatrixMultiplication_4.m_axi_a:DDR[3]
MatrixMultiplication_4.m_axi_b:DDR[3]
MatrixMultiplication_4.m_axi_c_read:DDR[3]
MatrixMultiplication_4.m_axi_c_write:DDR[3])
set(APFP_CONNECTIVITY ${APFP_CONNECTIVITY}
MatrixMultiplication_4.a_to_kernel:FreeRunningMultiplication_4.a_to_kernel
MatrixMultiplication_4.b_to_kernel:FreeRunningMultiplication_4.b_to_kernel
FreeRunningMultiplication_4.ab_from_kernel:MatrixMultiplication_4.ab_from_kernel)
endif()
if(${APFP_COMPUTE_UNITS} GREATER 4)
set(APFP_PORT_MAPPING ${APFP_PORT_MAPPING}
MatrixMultiplication_5.m_axi_a:DDR[1]
MatrixMultiplication_5.m_axi_b:DDR[1]
MatrixMultiplication_5.m_axi_c_read:DDR[1]
MatrixMultiplication_5.m_axi_c_write:DDR[1])
set(APFP_CONNECTIVITY ${APFP_CONNECTIVITY}
MatrixMultiplication_5.a_to_kernel:FreeRunningMultiplication_5.a_to_kernel
MatrixMultiplication_5.b_to_kernel:FreeRunningMultiplication_5.b_to_kernel
FreeRunningMultiplication_5.ab_from_kernel:MatrixMultiplication_5.ab_from_kernel)
endif()
if(${APFP_COMPUTE_UNITS} GREATER 5)
set(APFP_PORT_MAPPING ${APFP_PORT_MAPPING}
MatrixMultiplication_6.m_axi_a:DDR[0]
MatrixMultiplication_6.m_axi_b:DDR[0]
MatrixMultiplication_6.m_axi_c_read:DDR[0]
MatrixMultiplication_6.m_axi_c_write:DDR[0])
set(APFP_CONNECTIVITY ${APFP_CONNECTIVITY}
MatrixMultiplication_6.a_to_kernel:FreeRunningMultiplication_6.a_to_kernel
MatrixMultiplication_6.b_to_kernel:FreeRunningMultiplication_6.b_to_kernel
FreeRunningMultiplication_6.ab_from_kernel:MatrixMultiplication_6.ab_from_kernel)
endif()
if(${APFP_COMPUTE_UNITS} GREATER 6)
set(APFP_PORT_MAPPING ${APFP_PORT_MAPPING}
MatrixMultiplication_7.m_axi_a:DDR[2]
MatrixMultiplication_7.m_axi_b:DDR[2]
MatrixMultiplication_7.m_axi_c_read:DDR[2]
MatrixMultiplication_7.m_axi_c_write:DDR[2])
set(APFP_CONNECTIVITY ${APFP_CONNECTIVITY}
MatrixMultiplication_7.a_to_kernel:FreeRunningMultiplication_7.a_to_kernel
MatrixMultiplication_7.b_to_kernel:FreeRunningMultiplication_7.b_to_kernel
FreeRunningMultiplication_7.ab_from_kernel:MatrixMultiplication_7.ab_from_kernel)
endif()
if(${APFP_COMPUTE_UNITS} GREATER 7)
set(APFP_PORT_MAPPING ${APFP_PORT_MAPPING}
MatrixMultiplication_8.m_axi_a:DDR[3]
MatrixMultiplication_8.m_axi_b:DDR[3]
MatrixMultiplication_8.m_axi_c_read:DDR[3]
MatrixMultiplication_8.m_axi_c_write:DDR[3])
set(APFP_CONNECTIVITY ${APFP_CONNECTIVITY}
MatrixMultiplication_8.a_to_kernel:FreeRunningMultiplication_8.a_to_kernel
MatrixMultiplication_8.b_to_kernel:FreeRunningMultiplication_8.b_to_kernel
FreeRunningMultiplication_8.ab_from_kernel:MatrixMultiplication_8.ab_from_kernel)
endif()
if(${APFP_COMPUTE_UNITS} GREATER 8)
message(FATAL_ERROR "More than 8 compute units is not supported.")
endif()
# Setup FPGA kernel targets
set(APFP_HLS_FLAGS "-DAP_INT_MAX_W=${APFP_MAX_BITS} -DAPFP_${APFP_SEMANTICS}_SEMANTICS")
set(APFP_HLS_CONFIG "config_compile -pipeline_style frp\nconfig_dataflow -fifo_depth 16")
set(APFP_INCLUDE_DIRS include hlslib/include ${CMAKE_BINARY_DIR})
set(APFP_DEPENDS ${CMAKE_BINARY_DIR}/Config.h
include/ArithmeticOperations.h
include/DeviceTypes.h
include/Karatsuba.h
include/MatrixMultiplication.h
include/PackedFloat.h
include/PipelinedAdd.h)
add_vitis_kernel(MatrixMultiplication FILES ${APFP_KERNEL_FILES}
COMPUTE_UNITS ${APFP_COMPUTE_UNITS}
INCLUDE_DIRS ${APFP_INCLUDE_DIRS}
HLS_FLAGS ${APFP_HLS_FLAGS}
HLS_CONFIG ${APFP_HLS_CONFIG}
DEPENDS ${APFP_DEPENDS}
PORT_MAPPING ${APFP_PORT_MAPPING})
add_vitis_kernel(FreeRunningMultiplication FILES ${APFP_KERNEL_FILES}
COMPUTE_UNITS ${APFP_COMPUTE_UNITS}
INCLUDE_DIRS ${APFP_INCLUDE_DIRS}
HLS_FLAGS ${APFP_HLS_FLAGS}
HLS_CONFIG ${APFP_HLS_CONFIG}
DEPENDS ${APFP_DEPENDS})
add_vitis_program(MatrixMultiplication ${APFP_PLATFORM}
KERNELS MatrixMultiplication FreeRunningMultiplication
CONNECTIVITY ${APFP_CONNECTIVITY}
PROFILING ${APFP_PROFILING}
DEBUGGING ${APFP_DEBUGGING}
SAVE_TEMPS ${APFP_SAVE_TEMPS})
# Internal library
add_library(apfp host/Random.cpp host/MatrixMultiplicationReference.cpp)
target_link_libraries(apfp ${GMP_LIBRARIES} ${MPFR_LIBRARIES})
# Library necessary to run in simulation mode
add_library(simulation ${APFP_KERNEL_FILES})
target_compile_options(simulation PRIVATE -DAP_INT_MAX_W=${APFP_MAX_BITS})
target_link_libraries(simulation ${CMAKE_THREAD_LIBS_INIT})
add_library(ApfpHostlib SHARED interface/Apfp.cpp)
target_link_libraries(ApfpHostlib ${Vitis_LIBRARIES} ${GMP_LIBRARIES})
target_compile_definitions(ApfpHostlib PRIVATE HLSLIB_SIMULATE_OPENCL)
# Executable used to run in simulation mode, calling the kernel as a C++ function directly
add_executable(TestSimulation host/TestProgram.cpp)
target_link_libraries(TestSimulation apfp simulation ${Vitis_LIBRARIES} ${GMP_LIBRARIES} ${MPFR_LIBRARIES})
target_compile_definitions(TestSimulation PRIVATE HLSLIB_SIMULATE_OPENCL)
# Executable used to run from an xclbin binary
add_executable(TestHardware host/TestProgram.cpp)
target_link_libraries(TestHardware apfp simulation ${Vitis_LIBRARIES} ${GMP_LIBRARIES} ${MPFR_LIBRARIES})
# Testing
enable_testing()
add_test(TestSimulation TestSimulation 4 4 4)
add_library(Catch host/Catch.cpp)
add_executable(UnitTests host/UnitTests.cpp)
target_link_libraries(UnitTests Catch ${GMP_LIBRARIES} ${MPFR_LIBRARIES} apfp simulation)
add_test(UnitTests UnitTests)
install(TARGETS ApfpHostlib)