34 const std::vector<std::shared_ptr<xrt::device>> devices =
40 m_kernels[kernelName] = std::make_unique<xrt::kernel>(
42 (devices[0])->get_xclbin_uuid(),
44 xrt::kernel::cu_access_mode::exclusive
50 const std::optional<xrt::bo::flags> mem_flags =
53 if (!mem_flags.has_value()) {
55 "Unable to determine mem_flags for argument with index " <<
57 " in kernel named " <<
59 ". Defaulting to xrt::bo::normal. Good luck!"
62 m_inputBuffers.emplace_back(
65 xrt::bo::flags::normal,
66 m_kernels[kernelName]->group_id(argumentIndex)
70 m_inputBuffers.emplace_back(
74 m_kernels[kernelName]->group_id(argumentIndex)
78 if (!
m_runs.contains(kernelName)) {
79 m_runs[kernelName] = std::make_unique<xrt::run>(*
m_kernels[kernelName]);
83 m_runs[kernelName]->set_arg(argumentIndex, m_inputBuffers.back());
90 " to get input size from " <<
96 const std::vector<std::shared_ptr<xrt::device>> devices =
102 m_kernels[kernelName] = std::make_unique<xrt::kernel>(
104 (devices[0])->get_xclbin_uuid(),
106 xrt::kernel::cu_access_mode::exclusive
112 if (!
m_runs.contains(kernelName)) {
113 m_runs[kernelName] = std::make_unique<xrt::run>(*
m_kernels[kernelName]);
129 const std::vector<std::shared_ptr<xrt::device>> devices =
135 m_kernels[kernelName] = std::make_unique<xrt::kernel>(
137 devices[0]->get_xclbin_uuid(),
139 xrt::kernel::cu_access_mode::exclusive
143 const std::optional<xrt::bo::flags> mem_flags =
146 if (!mem_flags.has_value()) {
148 "Unable to determine mem_flags for argument with index " <<
150 " in kernel named " <<
152 ". Defaulting to xrt::bo::normal. Good luck!"
155 m_outputBuffers.emplace_back(
158 xrt::bo::flags::normal,
159 m_kernels[kernelName]->group_id(argumentIndex)
163 m_outputBuffers.emplace_back(
167 m_kernels[kernelName]->group_id(argumentIndex)
171 if (!
m_runs.contains(kernelName)) {
172 m_runs[kernelName] = std::make_unique<xrt::run>(*
m_kernels[kernelName]);
176 m_runs[kernelName]->set_arg(argumentIndex, m_outputBuffers.back());
179 for (
const auto& [kernelName, argumentIndex, sourceKernelName, sourceArgumentIndex] :
m_sharedInterfaces) {
181 "Setting up shared buffer between " <<
191 const std::vector<std::shared_ptr<xrt::device>> devices =
197 m_kernels[kernelName] = std::make_unique<xrt::kernel>(
199 devices[0]->get_xclbin_uuid(),
201 xrt::kernel::cu_access_mode::exclusive
205 if (!
m_runs.contains(kernelName)) {
206 m_runs[kernelName] = std::make_unique<xrt::run>(*
m_kernels[kernelName]);
211 std::size_t
index = 0;
212 for (
const auto& [outputKernelName, outputStoreGateKey, outputArgumentIndex] :
m_outputInterfaces) {
214 outputKernelName == sourceKernelName &&
215 outputArgumentIndex == sourceArgumentIndex
217 m_runs[kernelName]->set_arg(argumentIndex, m_outputBuffers[
index]);
227 for (
const auto& kernelName : kernelNames) {
228 const std::vector<std::shared_ptr<xrt::device>> devices =
236 m_kernels[kernelName] = std::make_unique<xrt::kernel>(
238 devices[0]->get_xclbin_uuid(),
240 xrt::kernel::cu_access_mode::exclusive
243 if (!
m_runs.contains(kernelName)) {
244 m_runs[kernelName] = std::make_unique<xrt::run>(*
m_kernels[kernelName]);
252 return StatusCode::SUCCESS;
258 std::size_t inputHandleIndex = 0;
265 unsigned long* inputMap = m_inputBuffers.at(inputHandleIndex).map<
unsigned long*>();
269 ATH_MSG_DEBUG(
"Copy " + inputDataStream.
name() +
" from storegate to host side map");
272 "Copy " + inputDataStream.
name() +
" from storegate to host side map",
276 for (std::size_t
index = 0;
index < inputDataStream->size();
index++) {
281 ATH_MSG_DEBUG(
"Copy " + inputDataStream.
name() +
" from host side map to device");
284 "Copy " + inputDataStream.
name() +
" from host side map to device",
288 m_inputBuffers.at(inputHandleIndex).sync(XCL_BO_SYNC_BO_TO_DEVICE);
295 std::size_t vSizeHandleIndex = 0;
301 const auto& [kernelName, storeGateKey, argumentIndex] =
m_vSizeInterfaces[vSizeHandleIndex];
302 ATH_MSG_DEBUG(
"Setting VSize: " << kernelName <<
", " << vSizeDataStream.
name() <<
", " << vSizeDataStream->size());
304 m_runs.at(kernelName)->set_arg(argumentIndex, vSizeDataStream->size());
313 for (
const auto& kernelName : kernelNames) {
315 m_runs.at(kernelName)->start();
318 for (
const auto& kernelName : kernelNames) {
320 m_runs.at(kernelName)->wait();
325 std::size_t outputHandleIndex = 0;
333 ATH_MSG_DEBUG(
"Copy " + outputDataStream.
name() +
" from device to host side map");
336 "Copy " + outputDataStream.
name() +
" from device to host side map",
340 m_outputBuffers.at(outputHandleIndex).sync(XCL_BO_SYNC_BO_FROM_DEVICE);
343 const unsigned long* outputMap = m_outputBuffers.at(outputHandleIndex).map<
unsigned long*>();
344 ATH_MSG_DEBUG(
"Copy " + outputDataStream.
name() +
" from host side map to storegate");
347 "Copy " + outputDataStream.
name() +
" from host side map to storegate",
351 for (std::size_t
index = 0;
index < outputDataStream->size();
index++) {
352 outputDataStream->at(
index) = outputMap[
index];
359 return StatusCode::SUCCESS;
363 const std::unique_ptr<xrt::kernel>& kernel,
364 const std::size_t
index
367 const xrt::xclbin::kernel& kernelMetaData :
368 kernel->get_xclbin().get_kernels()
370 if (kernel->get_name() != kernelMetaData.get_name()) {
374 for (
const xrt::xclbin::arg& arg : kernelMetaData.get_args()) {
375 if (arg.get_index() !=
index) {
379 if (arg.get_mems().size() == 0) {
381 "No mems associated with argument " <<
384 kernel->get_name() <<
385 ". Expect more warnings."
391 if (arg.get_mems()[0].get_tag().find(
"HOST") != std::string::npos) {
392 return xrt::bo::flags::host_only;
395 return xrt::bo::flags::normal;