ATLAS Offline Software
F1X0XRTIntegrationAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "AthenaKernel/Chrono.h"
8 
9 #include <xrt/xrt_bo.h>
10 #include <xrt/xrt_device.h>
11 #include <xrt/xrt_kernel.h>
12 #include <xrt/xrt_uuid.h>
13 
14 #include <algorithm>
15 #include <chrono>
16 #include <cmath>
17 
19 {
20 
21 // small helper for ns accounting
22 static inline uint64_t ns_between(const std::chrono::steady_clock::time_point& a,
23  const std::chrono::steady_clock::time_point& b)
24 {
25  return static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::nanoseconds>(b - a).count());
26 }
27 
29 {
30  ATH_MSG_INFO("Running on the FPGA accelerator (XRT native)");
31 
33  ATH_CHECK(m_chronoSvc.retrieve());
34 
35  // Open device and load xclbin
36  {
37  Athena::Chrono chrono("XRT::device open", m_chronoSvc.get());
38  // TODO: expose as configurable if you need a different board index
39  m_xrtDevice = xrt::device(0);
40  }
41  {
42  Athena::Chrono chrono("XRT::load_xclbin", m_chronoSvc.get());
43  xrt::xclbin xb(m_xclbin);
44  m_xrtUuid = m_xrtDevice.load_xclbin(xb);
45  }
46  ATH_MSG_INFO("loading " << m_xclbin);
47 
52 
53  // Enumerate CUs
54  std::vector<std::string> listofCUs;
55  getListofCUs(listofCUs);
56 
57  // Create kernels (per CU)
58  for (const auto& cuName : listofCUs) {
59  try {
60  if (cuName.find(m_pixelClusterKernelName.value()) != std::string::npos)
61  m_pixelClusteringKernels.emplace_back(xrt::kernel{m_xrtDevice, m_xrtUuid, cuName.c_str()});
62  else if (cuName.find(m_stripClusterKernelName.value()) != std::string::npos)
63  m_stripClusteringKernels.emplace_back(xrt::kernel{m_xrtDevice, m_xrtUuid, cuName.c_str()});
64  else if (!m_doF110 && cuName.find(m_pixelL2GKernelName.value()) != std::string::npos)
65  m_pixelL2GKernels.emplace_back(xrt::kernel{m_xrtDevice, m_xrtUuid, cuName.c_str()});
66  else if (cuName.find(m_stripL2GKernelName.value()) != std::string::npos)
67  m_stripL2GKernels.emplace_back(xrt::kernel{m_xrtDevice, m_xrtUuid, cuName.c_str()});
68  else if (cuName.find(m_pixelEdmKernelName.value()) != std::string::npos)
69  m_pixelEdmPrepKernels.emplace_back(xrt::kernel{m_xrtDevice, m_xrtUuid, cuName.c_str()});
70  else if (cuName.find(m_stripEdmKernelName.value()) != std::string::npos)
71  m_stripEdmPrepKernels.emplace_back(xrt::kernel{m_xrtDevice, m_xrtUuid, cuName.c_str()});
72  else
73  ATH_MSG_WARNING("Do not recognize kernel name: " << cuName);
74  } catch (const std::exception& e) {
75  ATH_MSG_ERROR("Failed to create kernel for CU '" << cuName << "': " << e.what());
76  return StatusCode::FAILURE;
77  }
78  }
79 
80  ATH_MSG_INFO(m_pixelClusterKernelName.value() << " size: " << m_pixelClusteringKernels.size());
81  ATH_MSG_INFO(m_stripClusterKernelName.value() << " size: " << m_stripClusteringKernels.size());
82  ATH_MSG_INFO(m_pixelL2GKernelName.value() << " size: " << m_pixelL2GKernels.size());
83  ATH_MSG_INFO(m_stripL2GKernelName.value() << " size: " << m_stripL2GKernels.size());
84  ATH_MSG_INFO(m_pixelEdmKernelName.value() << " size: " << m_pixelEdmPrepKernels.size());
85  ATH_MSG_INFO(m_stripEdmKernelName.value() << " size: " << m_stripEdmPrepKernels.size());
86 
87  // ---------------------------------------------------------------------------
88  // Allocate BOs per "thread" (slot). Bind each BO to the bank inferred from
89  // the kernel's group_id(argument_index). If kernel vector is empty, fall back to bank 0.
90  // ---------------------------------------------------------------------------
91  unsigned int nthreads = (m_FPGAThreads.value() < 1) ? SG::getNSlots() : m_FPGAThreads.value();
92 
93  auto choose = [](const std::vector<xrt::kernel>& ks) -> const xrt::kernel* {
94  return ks.empty() ? nullptr : &ks.front();
95  };
96 
97  const xrt::kernel* kPC = choose(m_pixelClusteringKernels);
98  const xrt::kernel* kSC = choose(m_stripClusteringKernels);
99  const xrt::kernel* kPL2G = choose(m_pixelL2GKernels);
100  const xrt::kernel* kSL2G = choose(m_stripL2GKernels);
101  const xrt::kernel* kPEDM = choose(m_pixelEdmPrepKernels);
102  const xrt::kernel* kSEDM = choose(m_stripEdmPrepKernels);
103 
104  auto gid = [](const xrt::kernel* k, unsigned arg_index)->unsigned {
105  return k ? k->group_id(arg_index) : 0;
106  };
107 
108  for (unsigned i = 0; i < nthreads; ++i) {
109  // Inputs
110  m_pixelClusterInputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::PIXEL_CONTAINER_INPUT_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kPC, 0)});
111  m_stripClusterInputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::STRIP_CONTAINER_INPUT_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kSC, 0)});
112 
113  // Clustering outputs
114  if (!m_doF110) m_pixelClusterOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::PIXEL_BLOCK_BUF_SIZE * sizeof(uint64_t),xrt::bo::flags::normal, gid(kPC, 1)});
115 
116  m_stripClusterOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::STRIP_BLOCK_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kSC, 1)});
117 
118  // Pixel clustering EDM output: arg index depends on F110 usage
119  m_pixelClusterEDMOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::PIXEL_BLOCK_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kPC, m_doF110 ? 1u : 2u)});
120 
121  m_stripClusterEDMOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::STRIP_BLOCK_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kSC, 2)});
122 
123  // L2G outputs
124  if (!m_doF110) {
125  m_pixelL2GOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::PIXEL_BLOCK_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kPL2G, 2)});
126  m_pixelL2GEDMOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::PIXEL_BLOCK_BUF_SIZE * sizeof(uint64_t),xrt::bo::flags::normal, gid(kPL2G, 3)});
127  }
128  m_stripL2GOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::STRIP_BLOCK_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kSL2G, 2)});
129  m_stripL2GEDMOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::STRIP_BLOCK_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kSL2G, 3)});
130 
131  // Final EDM containers (outputs)
132  // PixelEDM(arg1) and StripEDM(arg1) are the output BOs
133  m_edmPixelOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::PIXEL_CONTAINER_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kPEDM, 1)});
134  m_edmStripOutputBOList.emplace_back(xrt::bo{m_xrtDevice, EFTrackingTransient::STRIP_CONTAINER_BUF_SIZE * sizeof(uint64_t), xrt::bo::flags::normal, gid(kSEDM, 1)});
135  }
136 
137  return StatusCode::SUCCESS;
138 }
139 
140 StatusCode F1X0XRTIntegrationAlg::execute(const EventContext &ctx) const
141 {
142  ATH_MSG_DEBUG("Executing F1X0XRTIntegrationAlg (XRT)");
143  m_numEvents++;
144 
145  // Inputs
146  const std::vector<uint64_t>* pixelInput{nullptr};
147  const std::vector<uint64_t>* stripInput{nullptr};
148  ATH_CHECK(SG::get(pixelInput, m_FPGAPixelRDO, ctx));
149  ATH_CHECK(SG::get(stripInput, m_FPGAStripRDO, ctx));
150 
151 
152  // Thread/buffer index
153  unsigned int nthreads = (m_FPGAThreads.value() < 1) ? SG::getNSlots() : m_FPGAThreads.value();
154  const size_t bufferIndex = ctx.slot() % nthreads;
155 
156  // Kernel indices
157  const size_t pixelClusterIndex = ctx.slot() % m_pixelClusteringKernels.size();
158  const size_t stripClusterIndex = ctx.slot() % m_stripClusteringKernels.size();
159  const size_t stripL2GIndex = ctx.slot() % m_stripL2GKernels.size();
160  const size_t pixelL2GIndex = m_pixelL2GKernels.empty() ? 0 : (ctx.slot() % m_pixelL2GKernels.size());
161  const size_t pixelEDMIndex = m_pixelEdmPrepKernels.empty() ? 0 : (ctx.slot() % m_pixelEdmPrepKernels.size());
162  const size_t stripEDMIndex = m_stripEdmPrepKernels.empty() ? 0 : (ctx.slot() % m_stripEdmPrepKernels.size());
163 
164  ATH_MSG_INFO("Thread number " << ctx.slot()
165  << " running on buffer " << bufferIndex
166  << " pixelClusterIndex: " << pixelClusterIndex
167  << " stripClusterIndex: " << stripClusterIndex
168  << " stripL2GIndex: " << stripL2GIndex
169  << " pixelL2GIndex: " << pixelL2GIndex
170  << " pixelEDMIndex: " << pixelEDMIndex
171  << " stripEDMIndex: " << stripEDMIndex);
172 
173  // BO aliases
174  auto& bo_pix_in = m_pixelClusterInputBOList[bufferIndex];
175  auto& bo_str_in = m_stripClusterInputBOList[bufferIndex];
176 
177  xrt::bo* bo_pix_cl_out = (!m_doF110) ? &m_pixelClusterOutputBOList[bufferIndex] : nullptr;
178  auto& bo_pix_cl_edm = m_pixelClusterEDMOutputBOList[bufferIndex];
179 
180  auto& bo_str_cl = m_stripClusterOutputBOList[bufferIndex];
181  auto& bo_str_cl_edm = m_stripClusterEDMOutputBOList[bufferIndex];
182 
183  xrt::bo* bo_pix_l2g_out = (!m_doF110) ? &m_pixelL2GOutputBOList[bufferIndex] : nullptr;
184  xrt::bo* bo_pix_l2g_edm = (!m_doF110) ? &m_pixelL2GEDMOutputBOList[bufferIndex] : nullptr;
185 
186  auto& bo_str_l2g_out = m_stripL2GOutputBOList[bufferIndex];
187  auto& bo_str_l2g_edm = m_stripL2GEDMOutputBOList[bufferIndex];
188 
189  auto& bo_pix_edm_cont = m_edmPixelOutputBOList[bufferIndex];
190  auto& bo_str_edm_cont = m_edmStripOutputBOList[bufferIndex];
191 
192  // Write inputs (and time them)
193  const auto t_wi0 = std::chrono::steady_clock::now();
194  bo_pix_in.write(pixelInput->data(), pixelInput->size() * sizeof(uint64_t), 0);
195  bo_pix_in.sync(XCL_BO_SYNC_BO_TO_DEVICE);
196  const auto t_wi1 = std::chrono::steady_clock::now();
197  m_pixelInputTime += ns_between(t_wi0, t_wi1);
198  ATH_MSG_DEBUG("Pixel input buffer write time: " << (ns_between(t_wi0, t_wi1) / 1e6) << " ms");
199 
200  const auto t_wi2 = std::chrono::steady_clock::now();
201  bo_str_in.write(stripInput->data(), stripInput->size() * sizeof(uint64_t), 0);
202  bo_str_in.sync(XCL_BO_SYNC_BO_TO_DEVICE);
203  const auto t_wi3 = std::chrono::steady_clock::now();
204  m_stripInputTime += ns_between(t_wi2, t_wi3);
205  ATH_MSG_DEBUG("Strip input buffer write time: " << (ns_between(t_wi2, t_wi3) / 1e6) << " ms");
206 
207  // Launch kernels
208  const auto t_k0 = std::chrono::steady_clock::now();
209 
210  // Pixel clustering
211  auto& k_pix_cl = m_pixelClusteringKernels[pixelClusterIndex];
212  xrt::run r_pix_cl{k_pix_cl};
213  r_pix_cl.set_arg(0, bo_pix_in);
214  if (m_doF110) {
215  r_pix_cl.set_arg(1, bo_pix_cl_edm);
216  } else {
217  r_pix_cl.set_arg(1, *bo_pix_cl_out);
218  r_pix_cl.set_arg(2, bo_pix_cl_edm);
219 
220  // extra size args (bytes), rounded to 256 elements
221  int rounded = static_cast<int>(std::ceil(static_cast<double>(pixelInput->size()) / 256.0)) * 256;
222  uint32_t hit_bytes = static_cast<uint32_t>(sizeof(uint64_t) * rounded);
223  uint32_t cluster_bytes = static_cast<uint32_t>(sizeof(uint64_t) * rounded);
224  uint32_t edm_bytes = static_cast<uint32_t>(sizeof(uint64_t) * rounded * 8);
225  r_pix_cl.set_arg(3, hit_bytes);
226  r_pix_cl.set_arg(4, cluster_bytes);
227  r_pix_cl.set_arg(5, edm_bytes);
228  }
229  const auto t_pc_start = std::chrono::steady_clock::now();
230  r_pix_cl.start();
231  // Strip clustering
232  auto& k_str_cl = m_stripClusteringKernels[stripClusterIndex];
233  xrt::run r_str_cl{k_str_cl};
234  r_str_cl.set_arg(0, bo_str_in);
235  r_str_cl.set_arg(1, bo_str_cl);
236  r_str_cl.set_arg(2, bo_str_cl_edm);
237  r_str_cl.set_arg(3, static_cast<unsigned int>(stripInput->size()));
238  const auto t_sc_start = std::chrono::steady_clock::now();
239  r_str_cl.start();
240 
241  r_pix_cl.wait();
242  const auto t_pc_done = std::chrono::steady_clock::now();
243  m_pixelClusteringTime += ns_between(t_pc_start, t_pc_done);
244  ATH_MSG_DEBUG("Pixel clustering time: " << (ns_between(t_pc_start, t_pc_done) / 1e6) << " ms");
245 
246  r_str_cl.wait();
247  const auto t_sc_done = std::chrono::steady_clock::now();
248  m_stripClusteringTime += ns_between(t_sc_start, t_sc_done);
249  ATH_MSG_DEBUG("Strip clustering time: " << (ns_between(t_sc_start, t_sc_done) / 1e6) << " ms");
250 
251  // Pixel L2G (only for F100)
252  std::chrono::steady_clock::time_point t_pl2g_done = t_pc_done;
253  if (!m_doF110) {
254  auto& k_pix_l2g = m_pixelL2GKernels[pixelL2GIndex];
255  xrt::run r_pix_l2g{k_pix_l2g};
256  r_pix_l2g.set_arg(0, *bo_pix_cl_out);
257  r_pix_l2g.set_arg(1, bo_pix_cl_edm);
258  r_pix_l2g.set_arg(2, *bo_pix_l2g_out);
259  r_pix_l2g.set_arg(3, *bo_pix_l2g_edm);
260  const auto t_pl2g_start = std::chrono::steady_clock::now();
261  r_pix_l2g.start();
262  r_pix_l2g.wait();
263  t_pl2g_done = std::chrono::steady_clock::now();
264  m_pixelL2GTime += ns_between(t_pl2g_start, t_pl2g_done);
265  ATH_MSG_DEBUG("Pixel L2G time: " << (ns_between(t_pl2g_start, t_pl2g_done) / 1e6) << " ms");
266  }
267 
268  // Strip L2G
269  auto& k_str_l2g = m_stripL2GKernels[stripL2GIndex];
270  xrt::run r_str_l2g{k_str_l2g};
271  r_str_l2g.set_arg(0, bo_str_cl);
272  r_str_l2g.set_arg(1, bo_str_cl_edm);
273  r_str_l2g.set_arg(2, bo_str_l2g_out);
274  r_str_l2g.set_arg(3, bo_str_l2g_edm);
275  const auto t_sl2g_start = std::chrono::steady_clock::now();
276  r_str_l2g.start();
277  r_str_l2g.wait();
278  const auto t_sl2g_done = std::chrono::steady_clock::now();
279  m_stripL2GTime += ns_between(t_sl2g_start, t_sl2g_done);
280  ATH_MSG_DEBUG("Strip L2G time: " << (ns_between(t_sl2g_start, t_sl2g_done) / 1e6) << " ms");
281 
282  // EDM Prep (always use PixelEDM and StripEDM kernels)
283  auto& k_pedm = m_pixelEdmPrepKernels[pixelEDMIndex];
284  auto& k_sedm = m_stripEdmPrepKernels[stripEDMIndex];
285 
286  xrt::run r_pedm{k_pedm};
287  r_pedm.set_arg(0, bo_pix_cl_edm);
288  r_pedm.set_arg(1, bo_pix_edm_cont);
289 
290  xrt::run r_sedm{k_sedm};
291  r_sedm.set_arg(0, bo_str_l2g_edm);
292  r_sedm.set_arg(1, bo_str_edm_cont);
293 
294  // Respect dependencies:
295  // - PixelEDM depends on pixel clustering (F110) or pixel L2G (F100)
296  // - StripEDM depends on strip L2G
297  const auto t_pedm_start = std::chrono::steady_clock::now();
298  r_pedm.start();
299 
300  const auto t_sedm_start = std::chrono::steady_clock::now();
301  // already waited for r_str_l2g
302  r_sedm.start();
303 
304  r_pedm.wait();
305  const auto t_pedm_done = std::chrono::steady_clock::now();
306  m_pixelEdmPrepTime += ns_between(t_pedm_start, t_pedm_done);
307  ATH_MSG_DEBUG("PixelEDMPrep time: " << (ns_between(t_pedm_start, t_pedm_done) / 1e6) << " ms");
308 
309  r_sedm.wait();
310  const auto t_sedm_done = std::chrono::steady_clock::now();
311  m_stripEdmPrepTime += ns_between(t_sedm_start, t_sedm_done);
312  ATH_MSG_DEBUG("StripEDMPrep time: " << (ns_between(t_sedm_start, t_sedm_done) / 1e6) << " ms");
313 
314  // Kernel window = [first start, last end]
315  const auto t_kend = std::max(t_pedm_done, t_sedm_done);
316  m_kernelTime += ns_between(t_k0, t_kend);
317  ATH_MSG_DEBUG("Kernel execution time: " << (ns_between(t_k0, t_kend) / 1e6) << " ms");
318 
319  // Output handles and readbacks
321  ATH_CHECK(FPGAPixelOutput.record(std::make_unique<std::vector<uint64_t>>(EFTrackingTransient::PIXEL_CONTAINER_BUF_SIZE, 0)));
322 
324  ATH_CHECK(FPGAStripOutput.record(std::make_unique<std::vector<uint64_t>>(EFTrackingTransient::STRIP_CONTAINER_BUF_SIZE, 0)));
325 
326  const auto t_ro0 = std::chrono::steady_clock::now();
327  bo_pix_edm_cont.sync(XCL_BO_SYNC_BO_FROM_DEVICE);
328  bo_pix_edm_cont.read(FPGAPixelOutput->data(), FPGAPixelOutput->size() * sizeof(uint64_t), 0);
329  const auto t_ro1 = std::chrono::steady_clock::now();
330  m_pixelOutputTime += ns_between(t_ro0, t_ro1);
331  ATH_MSG_DEBUG("Pixel output buffer read time: " << (ns_between(t_ro0, t_ro1) / 1e6) << " ms");
332 
333  const auto t_ro2 = std::chrono::steady_clock::now();
334  bo_str_edm_cont.sync(XCL_BO_SYNC_BO_FROM_DEVICE);
335  bo_str_edm_cont.read(FPGAStripOutput->data(), FPGAStripOutput->size() * sizeof(uint64_t), 0);
336  const auto t_ro3 = std::chrono::steady_clock::now();
337  m_stripOutputTime += ns_between(t_ro2, t_ro3);
338  ATH_MSG_DEBUG("Strip output buffer read time: " << (ns_between(t_ro2, t_ro3) / 1e6) << " ms");
339 
340 
341  if(pixelInput->size() == 6) (*FPGAPixelOutput)[0] = 0; // if no pixel input, set the first element to 0
342  if(stripInput->size() == 6) (*FPGAStripOutput)[0] = 0; // if no strip input, set the first element to 0
343 
344  return StatusCode::SUCCESS;
345 }
346 
348 {
349  ATH_MSG_INFO("Finalizing F1X0XRTIntegrationAlg");
350  ATH_MSG_INFO("Number of events: " << m_numEvents);
351 
352  if (m_numEvents > 0) {
353  ATH_MSG_INFO("Pixel input ave time: " << m_pixelInputTime / m_numEvents / 1e6 << " ms");
354  ATH_MSG_INFO("Strip input ave time: " << m_stripInputTime / m_numEvents / 1e6 << " ms");
355  ATH_MSG_INFO("Pixel clustering ave time: " << m_pixelClusteringTime / m_numEvents / 1e6 << " ms");
356  ATH_MSG_INFO("Strip clustering ave time: " << m_stripClusteringTime / m_numEvents / 1e6 << " ms");
357  if (!m_doF110) {
358  ATH_MSG_INFO("Pixel L2G ave time: " << m_pixelL2GTime / m_numEvents / 1e6 << " ms");
359  }
360  ATH_MSG_INFO("Strip L2G ave time: " << m_stripL2GTime / m_numEvents / 1e6 << " ms");
361  ATH_MSG_INFO("PixelEDMPrep ave time: " << m_pixelEdmPrepTime / m_numEvents / 1e6 << " ms");
362  ATH_MSG_INFO("StripEDMPrep ave time: " << m_stripEdmPrepTime / m_numEvents / 1e6 << " ms");
363  ATH_MSG_INFO("Kernel execution ave time: " << m_kernelTime / m_numEvents / 1e6 << " ms");
364  ATH_MSG_INFO("Pixel output ave time: " << m_pixelOutputTime / m_numEvents / 1e6 << " ms");
365  ATH_MSG_INFO("Strip output ave time: " << m_stripOutputTime / m_numEvents / 1e6 << " ms");
366  }
367 
368  return StatusCode::SUCCESS;
369 }
370 
371 void F1X0XRTIntegrationAlg::getListofCUs(std::vector<std::string>& cuNames)
372 {
373  xrt::xclbin xrt_xclbin(m_xclbin);
374 
375  ATH_MSG_INFO("xsa name: " << xrt_xclbin.get_xsa_name());
376  ATH_MSG_INFO("fpga name: " << xrt_xclbin.get_fpga_device_name());
377  ATH_MSG_INFO("uuid: " << xrt_xclbin.get_uuid().to_string());
378 
379  for (const xrt::xclbin::kernel &kernel : xrt_xclbin.get_kernels()) {
380  const std::string& kernelName = kernel.get_name();
381  ATH_MSG_INFO("kernelName: " << kernelName);
382  for (const xrt::xclbin::ip &computeUnit : kernel.get_cus()) {
383  const std::string& computeUnitName = computeUnit.get_name();
384  const std::string computeUnitIsolatedName = computeUnitName.substr(kernelName.size() + 1);
385  const std::string computeUnitUsableName = kernelName + ":{" + computeUnitIsolatedName + "}";
386  ATH_MSG_INFO("CU name: " << computeUnitUsableName);
387  cuNames.push_back(computeUnitUsableName);
388  }
389  }
390 }
391 
392 } // namespace EFTrackingFPGAIntegration
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_doF110
Gaudi::Property< bool > m_doF110
Boolean to run F110 instead of F100.
Definition: F1X0XRTIntegrationAlg.h:65
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_chronoSvc
ServiceHandle< IChronoSvc > m_chronoSvc
Service for timing the algorithm.
Definition: F1X0XRTIntegrationAlg.h:52
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelClusteringTime
std::atomic< uint64_t > m_pixelClusteringTime
Time for pixel clustering.
Definition: F1X0XRTIntegrationAlg.h:90
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripL2GTime
std::atomic< uint64_t > m_stripL2GTime
Time for strip L2G.
Definition: F1X0XRTIntegrationAlg.h:93
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelOutputTime
std::atomic< uint64_t > m_pixelOutputTime
Time for pixel output buffer read.
Definition: F1X0XRTIntegrationAlg.h:97
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_FPGAPixelRDO
SG::ReadHandleKey< std::vector< uint64_t > > m_FPGAPixelRDO
Definition: F1X0XRTIntegrationAlg.h:54
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_FPGAThreads
Gaudi::Property< int > m_FPGAThreads
Definition: F1X0XRTIntegrationAlg.h:60
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripClusterKernelName
Gaudi::Property< std::string > m_stripClusterKernelName
Definition: F1X0XRTIntegrationAlg.h:77
EFTrackingTransient::PIXEL_CONTAINER_BUF_SIZE
constexpr unsigned long PIXEL_CONTAINER_BUF_SIZE
Definition: EFTrackingTransient.h:36
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_xrtUuid
xrt::uuid m_xrtUuid
Definition: F1X0XRTIntegrationAlg.h:103
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_kernelTime
std::atomic< uint64_t > m_kernelTime
Time window covering kernel execution.
Definition: F1X0XRTIntegrationAlg.h:99
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_xrtDevice
xrt::device m_xrtDevice
Definition: F1X0XRTIntegrationAlg.h:102
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripInputTime
std::atomic< uint64_t > m_stripInputTime
Time for strip input buffer write.
Definition: F1X0XRTIntegrationAlg.h:89
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelL2GTime
std::atomic< uint64_t > m_pixelL2GTime
Time for pixel L2G (F100)
Definition: F1X0XRTIntegrationAlg.h:92
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: SkimmingToolEXOT5.cxx:23
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelInputTime
std::atomic< uint64_t > m_pixelInputTime
Time for pixel input buffer write.
Definition: F1X0XRTIntegrationAlg.h:88
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelEdmKernelName
Gaudi::Property< std::string > m_pixelEdmKernelName
Definition: F1X0XRTIntegrationAlg.h:68
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::getListofCUs
void getListofCUs(std::vector< std::string > &cuNames)
Definition: F1X0XRTIntegrationAlg.cxx:371
run
int run(int argc, char *argv[])
Definition: ttree2hdf5.cxx:28
F1X0XRTIntegrationAlg.h
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override final
Should be overriden by derived classes to perform meaningful work.
Definition: F1X0XRTIntegrationAlg.cxx:140
Chrono.h
Exception-safe IChronoSvc caller.
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelClusterKernelName
Gaudi::Property< std::string > m_pixelClusterKernelName
Definition: F1X0XRTIntegrationAlg.h:74
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_FPGAStripRDO
SG::ReadHandleKey< std::vector< uint64_t > > m_FPGAStripRDO
Definition: F1X0XRTIntegrationAlg.h:55
EFTrackingTransient::PIXEL_BLOCK_BUF_SIZE
constexpr unsigned long PIXEL_BLOCK_BUF_SIZE
Definition: EFTrackingTransient.h:34
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_numEvents
std::atomic< uint64_t > m_numEvents
Number of events processed.
Definition: F1X0XRTIntegrationAlg.h:87
EFTrackingTransient::STRIP_CONTAINER_BUF_SIZE
constexpr unsigned long STRIP_CONTAINER_BUF_SIZE
Definition: EFTrackingTransient.h:37
python.handimod.now
now
Definition: handimod.py:674
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripEdmPrepTime
std::atomic< uint64_t > m_stripEdmPrepTime
Time for strip EDM preparation (F110)
Definition: F1X0XRTIntegrationAlg.h:96
Athena::Chrono
Exception-safe IChronoSvc caller.
Definition: Chrono.h:50
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::finalize
virtual StatusCode finalize() override final
Definition: F1X0XRTIntegrationAlg.cxx:347
lumiFormat.i
int i
Definition: lumiFormat.py:85
SG::get
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition: ReadCondHandle.h:287
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelL2GKernelName
Gaudi::Property< std::string > m_pixelL2GKernelName
Definition: F1X0XRTIntegrationAlg.h:80
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
EFTrackingTransient::PIXEL_CONTAINER_INPUT_BUF_SIZE
constexpr unsigned long PIXEL_CONTAINER_INPUT_BUF_SIZE
Definition: EFTrackingTransient.h:42
calibdata.exception
exception
Definition: calibdata.py:495
find_tgc_unfilled_channelids.ip
ip
Definition: find_tgc_unfilled_channelids.py:3
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
IntegrationBase::precheck
StatusCode precheck(const std::vector< Gaudi::Property< std::string >> &inputs) const
Check if the the desired Gaudi properties are set.
Definition: IntegrationBase.cxx:154
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
EFTrackingFPGAIntegration
The class for enconding RDO to FPGA format.
Definition: BenchmarkAlg.h:28
gid
Acts::GeometryIdentifier gid
Definition: ActsWriteTrackingGeometryTransforms.cxx:30
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_xclbin
Gaudi::Property< std::string > m_xclbin
Path and name of the xclbin file.
Definition: F1X0XRTIntegrationAlg.h:62
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripOutputTime
std::atomic< uint64_t > m_stripOutputTime
Time for strip output buffer read.
Definition: F1X0XRTIntegrationAlg.h:98
EFTrackingTransient::STRIP_CONTAINER_INPUT_BUF_SIZE
constexpr unsigned long STRIP_CONTAINER_INPUT_BUF_SIZE
Definition: EFTrackingTransient.h:43
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::initialize
virtual StatusCode initialize() override final
Detect the OpenCL devices and prepare OpenCL context.
Definition: F1X0XRTIntegrationAlg.cxx:28
DataModelTestDataCommonDict::xb
DMTest::CView::Pers_t xb
Definition: DataModelTestDataCommonDict.h:55
EFTrackingTransient::STRIP_BLOCK_BUF_SIZE
constexpr unsigned long STRIP_BLOCK_BUF_SIZE
Definition: EFTrackingTransient.h:35
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_FPGAPixelOutput
SG::WriteHandleKey< std::vector< uint64_t > > m_FPGAPixelOutput
Definition: F1X0XRTIntegrationAlg.h:57
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
a
TList * a
Definition: liststreamerinfos.cxx:10
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SG::getNSlots
size_t getNSlots()
Return the number of event slots.
Definition: SlotSpecificObj.cxx:64
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripEdmKernelName
Gaudi::Property< std::string > m_stripEdmKernelName
Definition: F1X0XRTIntegrationAlg.h:71
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripL2GKernelName
Gaudi::Property< std::string > m_stripL2GKernelName
Definition: F1X0XRTIntegrationAlg.h:83
SlotSpecificObj.h
Maintain a set of objects, one per slot.
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_pixelEdmPrepTime
std::atomic< uint64_t > m_pixelEdmPrepTime
Time for pixel EDM preparation (F110)
Definition: F1X0XRTIntegrationAlg.h:95
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_FPGAStripOutput
SG::WriteHandleKey< std::vector< uint64_t > > m_FPGAStripOutput
Definition: F1X0XRTIntegrationAlg.h:58
fitman.k
k
Definition: fitman.py:528
EFTrackingFPGAIntegration::F1X0XRTIntegrationAlg::m_stripClusteringTime
std::atomic< uint64_t > m_stripClusteringTime
Time for strip clustering.
Definition: F1X0XRTIntegrationAlg.h:91