Closed enes1994 closed 2 months ago
Can you check if the first argument to tapa::task::invoke()
is the task function? I think it is a tapa::mmap
right now.
I actually forgot to write the name of the function in one of invoke in device code. It is fine now. Thank you.
But now it gives me this error:
[ 66%] Building CXX object CMakeFiles/vadd.dir/host.cpp.o
[ 75%] Linking CXX executable vadd
/usr/bin/ld: src/libsrc.a(HlsMVexecutor.cpp.o): in function `HlsGeneralMVmultiplication<double>::exec_kernel(cl::Device const&, std::vector<double, JueStream::AlignedAllocator<double> > const&)':
/mnt/data/work/sti/benchmark/xilinx/mv_pc28_u280/src/HlsGeneralMVmultiplication.cpp:74: undefined reference to `VecAdd(tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double const>, tapa::mmap<double>, int, int, int)'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/vadd.dir/build.make:113: vadd] Error 1
make[2]: *** [CMakeFiles/Makefile2:238: CMakeFiles/vadd.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:191: CMakeFiles/vadd-hw.dir/rule] Error 2
make: *** [Makefile:157: vadd-hw] Error 2
I actually declared the function VecAdd like:
void VecAdd(tapa::mmap<const double> array1,tapa::mmap<const double> array2,tapa::mmap<const double> array3,tapa::mmap<const double> array4,tapa::mmap<const double> array5,
tapa::mmap<const double> array6,tapa::mmap<const double> array7,tapa::mmap<const double> array8,tapa::mmap<const double> array9,tapa::mmap<const double> array10,
tapa::mmap<const double> array11,tapa::mmap<const double> array12,tapa::mmap<const double> array13,tapa::mmap<const double> array14,tapa::mmap<const double> array15,
tapa::mmap<const double> array16,tapa::mmap<const double> array17,tapa::mmap<const double> array18,tapa::mmap<const double> array19,tapa::mmap<const double> array20,
tapa::mmap<const double> array21,tapa::mmap<const double> array22,tapa::mmap<const double> array23,tapa::mmap<const double> array24,tapa::mmap<const double> array25,
tapa::mmap<const double> array26,tapa::mmap<const double> array27,tapa::mmap<const double> array28,tapa::mmap<const double> arrayin, tapa::mmap<double> arrayout,int rows,int cols,
int repeat);
And then I used it in a function like this:
template<typename T>
std::vector<T, JueStream::AlignedAllocator<T>> HlsGeneralMVmultiplication<T>::exec_kernel(const cl::Device &device,const std::vector<T, JueStream::AlignedAllocator<T>> &input_vector) {
std::filesystem::path bitstream (
std::filesystem::path(BIN_DIR)/("vadd." + device.getInfo<CL_DEVICE_NAME>() + ".hw.xclbin"));
this->output_vector.resize(rows_stride);
// Compute
// std::cout << "Compute " << std::endl;
printf("start kernel\n");
auto start = std::chrono::steady_clock::now();
int64_t kernel_time_ns = tapa::invoke(
VecAdd, bitstream.filename(),
tapa::read_only_mmap<const double>(this->sub_matrices[0].data),
tapa::read_only_mmap<const double>(this->sub_matrices[1].data),
tapa::read_only_mmap<const double>(this->sub_matrices[2].data),
tapa::read_only_mmap<const double>(this->sub_matrices[3].data),
tapa::read_only_mmap<const double>(this->sub_matrices[4].data),
tapa::read_only_mmap<const double>(this->sub_matrices[5].data),
tapa::read_only_mmap<const double>(this->sub_matrices[6].data),
tapa::read_only_mmap<const double>(this->sub_matrices[7].data),
tapa::read_only_mmap<const double>(this->sub_matrices[8].data),
tapa::read_only_mmap<const double>(this->sub_matrices[9].data),
tapa::read_only_mmap<const double>(this->sub_matrices[10].data),
tapa::read_only_mmap<const double>(this->sub_matrices[11].data),
tapa::read_only_mmap<const double>(this->sub_matrices[12].data),
tapa::read_only_mmap<const double>(this->sub_matrices[13].data),
tapa::read_only_mmap<const double>(this->sub_matrices[14].data),
tapa::read_only_mmap<const double>(this->sub_matrices[15].data),
tapa::read_only_mmap<const double>(this->sub_matrices[16].data),
tapa::read_only_mmap<const double>(this->sub_matrices[17].data),
tapa::read_only_mmap<const double>(this->sub_matrices[18].data),
tapa::read_only_mmap<const double>(this->sub_matrices[19].data),
tapa::read_only_mmap<const double>(this->sub_matrices[20].data),
tapa::read_only_mmap<const double>(this->sub_matrices[21].data),
tapa::read_only_mmap<const double>(this->sub_matrices[22].data),
tapa::read_only_mmap<const double>(this->sub_matrices[23].data),
tapa::read_only_mmap<const double>(this->sub_matrices[24].data),
tapa::read_only_mmap<const double>(this->sub_matrices[25].data),
tapa::read_only_mmap<const double>(this->sub_matrices[26].data),
tapa::read_only_mmap<const double>(this->sub_matrices[27].data),
tapa::read_only_mmap<const double>(input_vector),
tapa::write_only_mmap<double>(this->output_vector),
rows_stride,cols_stride,repeat_num);
......
decleration of VecAdd function and tapa::invoke is as I showed at up. They both are in the same cpp file. I am kind of stuck and cant find a solution. And that is quite urgent now for my thesis :S
Did you link the kernel function with the host? This is required to run C simulation. If you don't want to link the kernel with the host, you can use the OpenCL APIs directly, or use the libfrt API (which is used to implement the TAPA invoke API).
add_tapa_target(
vadd-hw-xo
INPUT ${CMAKE_CURRENT_SOURCE_DIR}/vadd.cpp
TOP VecAdd
CONNECTIVITY ${CMAKE_CURRENT_SOURCE_DIR}/connectivity.ini
CONSTRAINT ${CMAKE_CURRENT_BINARY_DIR}/constraint.tcl
PLATFORM ${PLATFORM})
Here is a a snipped code from my toplevel cmakelists.txt file. vadd.cpp is the device code. and I define VecAdd as the top level function in it. But I am calling tapa.invoke from a different file in a different directory other than where main function is. Is this the problem? If it is how can I fix it?
int64_t kernel_time_ns = tapa::invoke( VecAdd, bitstream.filename(), tapa::read_only_mmap
(this->sub_matrices[0].data), tapa::read_only_mmap (this->sub_matrices[1].data), tapa::read_only_mmap (this->sub_matrices[2].data), tapa::read_only_mmap (this->sub_matrices[3].data), tapa::read_only_mmap (this->sub_matrices[4].data), tapa::read_only_mmap (this->sub_matrices[5].data), tapa::read_only_mmap (this->sub_matrices[6].data), tapa::read_only_mmap (this->sub_matrices[7].data), tapa::read_only_mmap (this->sub_matrices[8].data), tapa::read_only_mmap (this->sub_matrices[9].data), tapa::read_only_mmap (this->sub_matrices[10].data), tapa::read_only_mmap (this->sub_matrices[11].data), tapa::read_only_mmap (this->sub_matrices[12].data), tapa::read_only_mmap (this->sub_matrices[13].data), tapa::read_only_mmap (this->sub_matrices[14].data), tapa::read_only_mmap (this->sub_matrices[15].data), tapa::read_only_mmap (this->sub_matrices[16].data), tapa::read_only_mmap (this->sub_matrices[17].data), tapa::read_only_mmap (this->sub_matrices[18].data), tapa::read_only_mmap (this->sub_matrices[19].data), tapa::read_only_mmap (this->sub_matrices[20].data), tapa::read_only_mmap (this->sub_matrices[21].data), tapa::read_only_mmap (this->sub_matrices[22].data), tapa::read_only_mmap (this->sub_matrices[23].data), tapa::read_only_mmap (this->sub_matrices[24].data), tapa::read_only_mmap (this->sub_matrices[25].data), tapa::read_only_mmap (this->sub_matrices[26].data), tapa::read_only_mmap (this->sub_matrices[27].data), tapa::read_only_mmap (input_vector), tapa::write_only_mmap (this->output_vector), rows_stride,cols_stride,repeat_num);
The add_tapa_target
function only handles the .hw.xo
target and is unrelated to the linking error. You need to make sure vadd.cpp
is linked into the host executable. Would you mind posting the whole CMakeLists.txt
?
This one is the top level cmake file:
cmake_minimum_required(VERSION 3.16.3)
set(CMAKE_CXX_STANDARD 17)
project(vadd)
set(PLATFORM
xilinx_u280_xdma_201920_3
CACHE STRING "Target FPGA platform")
set(TOP vadd)
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -Wno-write-strings")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package(gflags REQUIRED)
find_package(Vitis)
include(${CMAKE_CURRENT_SOURCE_DIR}/tapa/cmake/apps.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/tapa/cmake/TAPACCConfig.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/tapa/cmake/FindSphinx.cmake)
add_subdirectory(src)
find_package(TAPA REQUIRED)
find_package(SDx REQUIRED)
add_executable(vadd)
target_sources(vadd PRIVATE host.cpp)
target_link_libraries(vadd PRIVATE ${TAPA} gflags src)
target_link_libraries(vadd PRIVATE tapa::tapa)
target_include_directories(src PRIVATE ${Vitis_INCLUDE_DIRS})
include(cmake/CMakeXilinx.cmake)
add_tapa_target(
vadd-hw-xo
INPUT ${CMAKE_CURRENT_SOURCE_DIR}/src/vadd.cpp
TOP VecAdd
CONNECTIVITY ${CMAKE_CURRENT_SOURCE_DIR}/connectivity.ini
CONSTRAINT ${CMAKE_CURRENT_BINARY_DIR}/constraint.tcl
PLATFORM ${PLATFORM})
add_xocc_hw_link_targets(
${CMAKE_CURRENT_BINARY_DIR}
--config=${CMAKE_CURRENT_SOURCE_DIR}/connectivity.ini
--vivado.synth.jobs 8
--vivado.prop=run.impl_1.STEPS.PHYS_OPT_DESIGN.IS_ENABLED=1
--vivado.prop=run.impl_1.STEPS.OPT_DESIGN.ARGS.DIRECTIVE=Explore
--vivado.prop run.impl_1.STEPS.PLACE_DESIGN.ARGS.DIRECTIVE=EarlyBlockPlacement
--vivado.prop=run.impl_1.STEPS.PHYS_OPT_DESIGN.ARGS.DIRECTIVE=Explore
--vivado.prop run.impl_1.STEPS.ROUTE_DESIGN.ARGS.DIRECTIVE=Explore
--vivado.prop=run.impl_1.STEPS.OPT_DESIGN.TCL.PRE=${CMAKE_CURRENT_BINARY_DIR}/constraint.tcl
INPUT vadd-hw-xo
HW_EMU_XCLBIN hw_emu_xclbin
HW_XCLBIN hw_xclbin)
add_custom_target(
vadd-cosim
COMMAND $<TARGET_FILE:vadd>
DEPENDS vadd ${hw_emu_xclbin}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_custom_target(
vadd-hw
COMMAND $<TARGET_FILE:vadd>
DEPENDS vadd ${hw_xclbin}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
I actually tried to follow vadd example. I cant see what I am doing different than that. Only thing coming to my mind is instead of providing binary as: --bitstream=$<TARGET_PROPERTY:${hw_emu_xclbin},FILE_NAME> as an argument to main function, I am trying to read it with:
std::filesystem::path bitstream (
std::filesystem::path(BIN_DIR)/("vadd." + device.getInfo<CL_DEVICE_NAME>() + ".hw.xclbin"));
then pass "bitstream" as an argument to tapa::invoke as follows:
int64_t kernel_time_ns = tapa::invoke( VecAdd, bitstream.filename(), tapa::read_only_mmap
(this->sub_matrices[0].data), tapa::read_only_mmap (this->sub_matrices[1].data), tapa::read_only_mmap (this->sub_matrices[2].data), tapa::read_only_mmap (this->sub_matrices[3].data), tapa::read_only_mmap (this->sub_matrices[4].data), tapa::read_only_mmap (this->sub_matrices[5].data), tapa::read_only_mmap (this->sub_matrices[6].data), tapa::read_only_mmap (this->sub_matrices[7].data), tapa::read_only_mmap (this->sub_matrices[8].data), tapa::read_only_mmap (this->sub_matrices[9].data), tapa::read_only_mmap (this->sub_matrices[10].data), tapa::read_only_mmap (this->sub_matrices[11].data), tapa::read_only_mmap (this->sub_matrices[12].data), tapa::read_only_mmap (this->sub_matrices[13].data), tapa::read_only_mmap (this->sub_matrices[14].data), tapa::read_only_mmap (this->sub_matrices[15].data), tapa::read_only_mmap (this->sub_matrices[16].data), tapa::read_only_mmap (this->sub_matrices[17].data), tapa::read_only_mmap (this->sub_matrices[18].data), tapa::read_only_mmap (this->sub_matrices[19].data), tapa::read_only_mmap (this->sub_matrices[20].data), tapa::read_only_mmap (this->sub_matrices[21].data), tapa::read_only_mmap (this->sub_matrices[22].data), tapa::read_only_mmap (this->sub_matrices[23].data), tapa::read_only_mmap (this->sub_matrices[24].data), tapa::read_only_mmap (this->sub_matrices[25].data), tapa::read_only_mmap (this->sub_matrices[26].data), tapa::read_only_mmap (this->sub_matrices[27].data), tapa::read_only_mmap (input_vector), tapa::write_only_mmap (this->output_vector), rows_stride,cols_stride,repeat_num);
Is this the source to the main problem?
target_sources(vadd PRIVATE host.cpp)
This line needs to be
target_sources(vadd PRIVATE vadd.cpp host.cpp)
it is unfortunately still the same. Undefined reference error. Still missing sth. I really cant figure it out. also during the sythesis I keep getting failed to get a valid floorplanning. Arguments are seen as read and write both even if I specify them as either read only or write only as follows:
function(add_tapa_target target_name)
# Generate Xilinx object file from TAPA C++.
#
# The added target will have the following properties:
#
# * FILE_NAME
# * TARGET
# * KERNEL
# * PLATFORM
#
# Positional Arguments:
#
# * target_name: Name of the added cmake target.
#
# Required Named Arguments:
#
# * INPUT: Input filename.
# * TOP: Name of the top-level task, which will be used the kernel name.
# * PLATFORM: SDAccel platform name or path.
#
# Optional Named Arguments:
#
# * OUTPUT: Optional, output filename, default to ${TOP}.${PLATFORM}.hw.xo
# * TAPA_CLI: Optional, path to the tapa executable.
# * TAPACC: Optional, path to the tapacc executable.
# * TAPA_CLANG: Optional, path to the tapa-clang executable.
# * CFLAGS: Optional, cflags for kernel, space separated.
# * FRT_INTERFACE: Optional, output FRT interface filename.
# * CLOCK_PERIOD: Optional, override the clock period.
# * PART_NUM: Optional, override the part number.
# * DIRECTIVE: Optional, apply partitioning directives.
# * CONNECTIVITY: Optional, specifies DRAM connections using Xilinx's ini.
# * CONSTRAINT: Optional if DIRECTIVE is not set, generate partitioning
# constraints.
cmake_parse_arguments(
TAPA
""
"OUTPUT;INPUT;TOP;PLATFORM;TAPA_CLI;TAPACC;TAPA_CLANG;CFLAGS;FRT_INTERFACE;CLOCK_PERIOD;PART_NUM;DIRECTIVE;CONNECTIVITY;CONSTRAINT"
""
${ARGN})
if(NOT TAPA_INPUT)
message(FATAL_ERROR "INPUT not specified")
endif()
if(NOT TAPA_PLATFORM)
message(FATAL_ERROR "PLATFORM not specified")
endif()
if(NOT TAPA_TOP)
message(FATAL_ERROR "TOP not specified")
endif()
if(NOT TAPA_OUTPUT)
set(TAPA_OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/${TAPA_TOP}.${TAPA_PLATFORM}.hw.xo)
endif()
get_filename_component(TAPA_INPUT ${TAPA_INPUT} ABSOLUTE)
get_filename_component(TAPA_OUTPUT ${TAPA_OUTPUT} ABSOLUTE)
if(TAPA_TAPA_CLI)
set(TAPA_CLI ${TAPA_TAPA_CLI})
endif()
if(NOT TAPA_CLI)
find_program(TAPA_CLI tapa PATHS $ENV{HOME}/.local/bin)
endif()
if(NOT TAPA_CLI)
message(FATAL_ERROR "cannot find tapa")
endif()
if(TAPA_TAPACC)
set(TAPACC ${TAPA_TAPACC})
endif()
if(NOT TAPACC)
find_program(TAPACC tapacc)
endif()
if(NOT TAPACC)
message(FATAL_ERROR "cannot find tapacc")
endif()
if(TAPA_TAPA_CLANG)
set(TAPA_CLANG ${TAPA_TAPA_CLANG})
endif()
if(NOT TAPA_CLANG)
find_program(TAPA_CLANG tapa-clang)
endif()
if(NOT TAPA_CLANG)
message(FATAL_ERROR "cannot find tapa-clang")
endif()
set(A0 "A0")
set(A1 "A1")
set(A2 "A2")
set(A3 "A3")
set(A4 "A4")
set(A5 "A5")
set(A6 "A6")
set(A7 "A7")
set(A8 "A8")
set(A9 "A9")
set(A10 "A10")
set(A11 "A11")
set(A12 "A12")
set(A13 "A13")
set(A14 "A14")
set(A15 "A15")
set(A16 "A16")
set(A17 "A17")
set(A18 "A18")
set(A19 "A19")
set(A20 "A20")
set(A21 "A21")
set(A22 "A22")
set(A23 "A23")
set(A24 "A24")
set(A25 "A25")
set(A26 "A26")
set(A27 "A27")
set(x "x")
set(y "y")
set(arg0 --read-only-args ${A0})
set(arg1 --read-only-args ${A1})
set(arg2 --read-only-args ${A2})
set(arg3 --read-only-args ${A3})
set(arg4 --read-only-args ${A4})
set(arg5 --read-only-args ${A5})
set(arg6 --read-only-args ${A6})
set(arg7 --read-only-args ${A7})
set(arg8 --read-only-args ${A8})
set(arg9 --read-only-args ${A9})
set(arg10 --read-only-args ${A10})
set(arg11 --read-only-args ${A11})
set(arg12 --read-only-args ${A12})
set(arg13 --read-only-args ${A13})
set(arg14 --read-only-args ${A14})
set(arg15 --read-only-args ${A15})
set(arg16 --read-only-args ${A16})
set(arg17 --read-only-args ${A17})
set(arg18 --read-only-args ${A18})
set(arg19 --read-only-args ${A19})
set(arg20 --read-only-args ${A20})
set(arg21 --read-only-args ${A21})
set(arg22 --read-only-args ${A22})
set(arg23 --read-only-args ${A23})
set(arg24 --read-only-args ${A24})
set(arg25 --read-only-args ${A25})
set(arg26 --read-only-args ${A26})
set(arg27 --read-only-args ${A27})
set(arg29 --read-only-args ${x})
set(arg30 --write-only-args ${y})
set(tapa_cmd ${TAPA_CLI} --work-dir ${TAPA_OUTPUT}.tapa)
list(APPEND tapa_cmd analyze)
list(APPEND tapa_cmd -f ${TAPA_INPUT})
list(APPEND tapa_cmd --top ${TAPA_TOP})
list(APPEND tapa_cmd --tapacc ${TAPACC})
list(APPEND tapa_cmd --tapa-clang ${TAPA_CLANG})
if(TAPA_CFLAGS)
list(APPEND tapa_cmd --cflags ${TAPA_CFLAGS})
endif()
list(APPEND tapa_cmd synth)
list(APPEND tapa_cmd --platform ${TAPA_PLATFORM})
if(TAPA_CLOCK_PERIOD)
list(APPEND tapa_cmd --clock-period ${TAPA_CLOCK_PERIOD})
endif()
if(TAPA_PART_NUM)
list(APPEND tapa_cmd --part-num ${TAPA_PART_NUM})
endif()
if(TAPA_CONNECTIVITY AND TAPA_CONSTRAINT)
list(APPEND tapa_cmd optimize-floorplan)
list(APPEND tapa_cmd --connectivity ${TAPA_CONNECTIVITY})
endif()
list(APPEND tapa_cmd ${arg0})
list(APPEND tapa_cmd ${arg1})
list(APPEND tapa_cmd ${arg2})
list(APPEND tapa_cmd ${arg3})
list(APPEND tapa_cmd ${arg4})
list(APPEND tapa_cmd ${arg5})
list(APPEND tapa_cmd ${arg6})
list(APPEND tapa_cmd ${arg7})
list(APPEND tapa_cmd ${arg8})
list(APPEND tapa_cmd ${arg9})
list(APPEND tapa_cmd ${arg10})
list(APPEND tapa_cmd ${arg11})
list(APPEND tapa_cmd ${arg12})
list(APPEND tapa_cmd ${arg13})
list(APPEND tapa_cmd ${arg14})
list(APPEND tapa_cmd ${arg15})
list(APPEND tapa_cmd ${arg16})
list(APPEND tapa_cmd ${arg17})
list(APPEND tapa_cmd ${arg18})
list(APPEND tapa_cmd ${arg19})
list(APPEND tapa_cmd ${arg20})
list(APPEND tapa_cmd ${arg21})
list(APPEND tapa_cmd ${arg22})
list(APPEND tapa_cmd ${arg23})
list(APPEND tapa_cmd ${arg24})
list(APPEND tapa_cmd ${arg25})
list(APPEND tapa_cmd ${arg26})
list(APPEND tapa_cmd ${arg27})
list(APPEND tapa_cmd ${arg28})
list(APPEND tapa_cmd ${arg29})
list(APPEND tapa_cmd ${arg30})
# If we have to put unparsed arguments somewhere, this is the best place; most
# additional arguments are for `tapa synth` and `tapa optimize-floorplan`.
list(APPEND tapa_cmd ${TAPA_UNPARSED_ARGUMENTS})
list(APPEND tapa_cmd link)
if(TAPA_CONNECTIVITY AND TAPA_CONSTRAINT)
list(APPEND tapa_cmd --floorplan-output ${TAPA_CONSTRAINT})
endif()
list(APPEND tapa_cmd pack)
list(APPEND tapa_cmd --output ${TAPA_OUTPUT})
add_custom_command(
OUTPUT ${TAPA_OUTPUT}
COMMAND ${tapa_cmd}
DEPENDS ${TAPA_INPUT}
VERBATIM)
add_custom_target(${target_name} DEPENDS ${TAPA_OUTPUT})
set_target_properties(
${target_name}
PROPERTIES FILE_NAME ${TAPA_OUTPUT} TARGET hw KERNEL ${TAPA_TOP}
PLATFORM ${TAPA_PLATFORM} DRAM_MAPPING "")
endfunction()
I have changed TAPACCConfig file to fit my problem.
int64_t kernel_time_ns = tapa::invoke( VecAdd, bitstream.filename(), tapa::read_only_mmap
(this->sub_matrices[0].data), tapa::read_only_mmap (this->sub_matrices[1].data), tapa::read_only_mmap (this->sub_matrices[2].data), tapa::read_only_mmap (this->sub_matrices[3].data), tapa::read_only_mmap (this->sub_matrices[4].data), tapa::read_only_mmap (this->sub_matrices[5].data), tapa::read_only_mmap (this->sub_matrices[6].data), tapa::read_only_mmap (this->sub_matrices[7].data), tapa::read_only_mmap (this->sub_matrices[8].data), tapa::read_only_mmap (this->sub_matrices[9].data), tapa::read_only_mmap (this->sub_matrices[10].data), tapa::read_only_mmap (this->sub_matrices[11].data), tapa::read_only_mmap (this->sub_matrices[12].data), tapa::read_only_mmap (this->sub_matrices[13].data), tapa::read_only_mmap (this->sub_matrices[14].data), tapa::read_only_mmap (this->sub_matrices[15].data), tapa::read_only_mmap (this->sub_matrices[16].data), tapa::read_only_mmap (this->sub_matrices[17].data), tapa::read_only_mmap (this->sub_matrices[18].data), tapa::read_only_mmap (this->sub_matrices[19].data), tapa::read_only_mmap (this->sub_matrices[20].data), tapa::read_only_mmap (this->sub_matrices[21].data), tapa::read_only_mmap (this->sub_matrices[22].data), tapa::read_only_mmap (this->sub_matrices[23].data), tapa::read_only_mmap (this->sub_matrices[24].data), tapa::read_only_mmap (this->sub_matrices[25].data), tapa::read_only_mmap (this->sub_matrices[26].data), tapa::read_only_mmap (this->sub_matrices[27].data), tapa::read_only_mmap (input_vector), tapa::write_only_mmap (this->output_vector), rows_stride,cols_stride,repeat_num);
you can see here also I specify them as read_only or write only. As I understood tapa_cmd is tapa compiler. But cant set the arguments as read or write only. Here is top level function in device code:
void VecAdd(
tapa::mmap<const ap_uint<512>> A0,
tapa::mmap<const ap_uint<512>> A1,
tapa::mmap<const ap_uint<512>> A2,
tapa::mmap<const ap_uint<512>> A3,
tapa::mmap<const ap_uint<512>> A4,
tapa::mmap<const ap_uint<512>> A5,
tapa::mmap<const ap_uint<512>> A6,
tapa::mmap<const ap_uint<512>> A7,
tapa::mmap<const ap_uint<512>> A8,
tapa::mmap<const ap_uint<512>> A9,
tapa::mmap<const ap_uint<512>> A10,
tapa::mmap<const ap_uint<512>> A11,
tapa::mmap<const ap_uint<512>> A12,
tapa::mmap<const ap_uint<512>> A13,
tapa::mmap<const ap_uint<512>> A14,
tapa::mmap<const ap_uint<512>> A15,
tapa::mmap<const ap_uint<512>> A16,
tapa::mmap<const ap_uint<512>> A17,
tapa::mmap<const ap_uint<512>> A18,
tapa::mmap<const ap_uint<512>> A19,
tapa::mmap<const ap_uint<512>> A20,
tapa::mmap<const ap_uint<512>> A21,
tapa::mmap<const ap_uint<512>> A22,
tapa::mmap<const ap_uint<512>> A23,
tapa::mmap<const ap_uint<512>> A24,
tapa::mmap<const ap_uint<512>> A25,
tapa::mmap<const ap_uint<512>> A26,
tapa::mmap<const ap_uint<512>> A27,
tapa::mmap<const ap_uint<512>> x,
tapa::mmap<ap_uint<512>> y,
int rows_stride,
int cols_stride,
int repeat_num
) {
it is unfortunately still the same. Undefined reference error.
That doesn't make any sense. Did you put the definition and declaration in different linkages, i.e., did you use extern "C"
? If so, can you check if you are using it consistently for both the definition and declaration?
I have changed TAPACCConfig file to fit my problem.
Changes to TAPACCConfig.cmake
won't be effective unless you build TAPA from source. If you just want to specify additional arguments to the TAPA target, please do the following:
add_tapa_target(
vadd-hw-xo
--read-only-args=A
--read-only-args=x
--write-only-args=y
INPUT ${CMAKE_CURRENT_SOURCE_DIR}/vadd.cpp
TOP VecAdd
CONNECTIVITY ${CMAKE_CURRENT_SOURCE_DIR}/connectivity.ini
CONSTRAINT ${CMAKE_CURRENT_BINARY_DIR}/constraint.tcl
PLATFORM ${PLATFORM})
Note that this requries TAPA 0.0.20221113.1.
Thank you very much @Blaok . There is another issue while I am running the Floorplanning. Here is .ini file I am using:
[connectivity]
sp=VecAdd.x:HBM[16]
sp=VecAdd.y:HBM[17]
sp=VecAdd.A0:HBM[0]
sp=VecAdd.A1:HBM[1]
sp=VecAdd.A2:HBM[2]
sp=VecAdd.A3:HBM[3]
sp=VecAdd.A4:HBM[4]
sp=VecAdd.A5:HBM[5]
sp=VecAdd.A6:HBM[6]
sp=VecAdd.A7:HBM[7]
sp=VecAdd.A8:HBM[8]
sp=VecAdd.A9:HBM[9]
sp=VecAdd.A10:HBM[10]
sp=VecAdd.A11:HBM[11]
sp=VecAdd.A12:HBM[12]
sp=VecAdd.A13:HBM[13]
sp=VecAdd.A14:HBM[14]
sp=VecAdd.A15:HBM[15]
A0 to A15 is actually the matrix splitted to 16 HBMs. and x is the input and y is the output vector.
W1123 10:04:45.539 tapa.floorplan:263] failed to get a valid floorplanning
I1123 10:04:45.539 tapa.steps.common:92] writing TAPA settings to json `/mnt/data/work/sti/benchmark/xilinx/mv_pc28_u280/build/VecAdd.xilinx_u280_xdma_201920_3.hw.xo.tapa/settings.json`.
I1123 10:04:45.540 tapa.steps.common:46] reusing TAPA settings from upstream flows.
I1123 10:04:45.540 tapa.floorplan:77] generate the floorplan constraint at /mnt/data/work/sti/benchmark/xilinx/mv_pc28_u280/build/constraint.tcl
W1123 10:04:45.540 tapa.core:391] generate top rtl without floorplanning
I cant understand why it can not find a suitable floorplan. I dont have Gurobi solver and it shows some warnings. Is it related to that or because the arguments to top function are all read and write type?
I cant understand why it can not find a suitable floorplan.
My personal experience is that floorplanning can be very tricky. There are something you could try, but it's hard to say what would work. Two common reasons for floorplanning failures: 1) Some tasks are too large to fit in a single slot. It is generally helpful to break large tasks into smaller ones; 2) The total resource usage is too high. There is no good solution if this is the case, unless you can reduce the resource usage.
I dont have Gurobi solver and it shows some warnings. Is it related to that or because the arguments to top function are all read and write type?
I'm not seeing enough evidence regarding whether Gurobi solver would be helpful, but I'm pretty sure specifying --read/write-only-args
won't be harmful (unless they are incorrect).
The log will print out in which file the detailed debug messages are saved, could you take a look at that file? autobridge-[timestamp].log
Floorplanning is replaced with RapidStream. Closing this issue as it is out-dated. Please feel free to reopen if you have any questions regarding the current TAPA version.
Environment
Generating VecAdd.xilinx_u280_xdma_201920_3.hw.xo gives me the error below:
This is an implementation of mine to create an effective matrix vector multiplication with TAPA with dataflow manner. Am I doing something wrong. I actually cant get what is the problem exactly.