13 std::string full_cu_name = kernel_name +
":{" + kernel_name +
"_" +
std::to_string(cu) +
"}";
20 for (
size_t i = 0;
i < dataLen;
i++) {
47 cl_int
err = CL_SUCCESS;
56 for (
int i = 0;
i < 1; ++
i) {
67 if (
err != CL_SUCCESS) {
68 return StatusCode::FAILURE;
76 return StatusCode::SUCCESS;
83 size = std::filesystem::file_size(filepath);
90 std::ifstream file_in;
91 std::string line_in =
"";
96 file_in.open(filepath);
97 if (file_in.is_open()) {
99 std::getline (file_in, line_in);
100 data[
i] = std::stoul(line_in.c_str(), NULL, 16);
103 ATH_MSG_INFO(
"ERROR! Unable to open data file: " + filepath);
116 int n_inside_out_words = 4 * 1024;
118 ATH_MSG_DEBUG(
"Pixel Clustering TV words = " << n_pixel_words <<
" (64b)");
119 ATH_MSG_DEBUG(
"Pixel GHITZ TV words = " << n_pixel_ghitz_words <<
" (64b)");
120 ATH_MSG_DEBUG(
"Pixel Sliced TV words = " << n_pixel_first_sliced_words <<
" (64b)");
122 uint64_t pixel_cls_input_data[n_pixel_words];
123 uint64_t pixel_ghitz_data[n_pixel_ghitz_words];
124 uint64_t pixel_first_sliced_data[n_pixel_first_sliced_words];
130 std::unique_lock
lock(m_fpgaHandleMtx);
133 size_t pixel_size_bytes = n_pixel_words *
sizeof(
uint64_t);
134 size_t pixel_ghitz_size_bytes = n_pixel_ghitz_words *
sizeof(
uint64_t);
135 size_t pixel_first_sliced_size_bytes = n_pixel_first_sliced_words *
sizeof(
uint64_t);
136 size_t inside_out_size_bytes = n_inside_out_words *
sizeof(
uint64_t);
139 m_pixelClusterL2GInputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_size_bytes, NULL, &
err));
141 m_pixelClusterL2GOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_ghitz_size_bytes, NULL, &
err));
143 m_pixelClusterL2GEDMOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_ghitz_size_bytes, NULL, &
err));
145 m_pixelFirstStageSlicingInputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_ghitz_size_bytes, NULL, &
err));
147 m_pixelFirstStageSlicingOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_first_sliced_size_bytes, NULL, &
err));
148 ATH_MSG_DEBUG(
"Allocating Inside PR Input Buffer in Global Memory");
149 m_insideOutInputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_first_sliced_size_bytes, NULL, &
err));
150 ATH_MSG_DEBUG(
"Allocating Inside PR Output Buffer in Global Memory");
151 m_insideOutOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, inside_out_size_bytes, NULL, &
err));
155 m_pixelClusterL2GKernels[0].setArg(0, m_pixelClusterL2GInputBufferList[0]);
157 m_pixelClusterL2GKernels[0].setArg(1, m_pixelClusterL2GOutputBufferList[0]);
159 m_pixelClusterL2GKernels[0].setArg(2, m_pixelClusterL2GEDMOutputBufferList[0]);
162 m_pixelFirstStageSlicingInputKernels[0].setArg(0, m_pixelFirstStageSlicingInputBufferList[0]);
164 m_pixelFirstStageSlicingInputKernels[0].setArg(1, n_pixel_ghitz_words);
167 m_pixelFirstStageSlicingOutputKernels[0].setArg(0, m_pixelFirstStageSlicingOutputBufferList[0]);
169 m_pixelFirstStageSlicingOutputKernels[0].setArg(1, n_pixel_first_sliced_words);
171 ATH_MSG_DEBUG(
"Setting buffer for Input kernel run INSIDE OUT.");
172 m_insideOutInputKernels[0].setArg(0, m_insideOutInputBufferList[0]);
174 ATH_MSG_DEBUG(
"Setting buffer for Output kernel run INSIDE OUT.");
175 m_insideOutOutputKernels[0].setArg(0, m_insideOutOutputBufferList[0]);
179 ATH_MSG_DEBUG(
"Loading input data to pixel clustering kernel...");
180 m_queue.enqueueWriteBuffer(m_pixelClusterL2GInputBufferList[0], CL_TRUE, 0, pixel_size_bytes, &pixel_cls_input_data, NULL, NULL);
183 outputHexData(n_pixel_words, pixel_cls_input_data,
"Pixel Clustering Input");
187 m_queue.enqueueTask(m_pixelClusterL2GKernels[0]);
192 uint64_t cls_out_data[n_pixel_ghitz_words];
193 m_queue.enqueueReadBuffer(m_pixelClusterL2GOutputBufferList[0], CL_TRUE, 0, pixel_ghitz_size_bytes, &cls_out_data);
195 outputHexData(n_pixel_ghitz_words, cls_out_data,
"Real Pixel Clustering Output");
199 uint64_t cls_out_edm_data[n_pixel_ghitz_words];
200 m_queue.enqueueReadBuffer(m_pixelClusterL2GEDMOutputBufferList[0], CL_TRUE, 0, pixel_ghitz_size_bytes, &cls_out_edm_data);
202 outputHexData(n_pixel_ghitz_words, cls_out_edm_data,
"Real Pixel Clustering EDM Output");
206 m_queue.enqueueWriteBuffer(m_pixelFirstStageSlicingInputBufferList[0], CL_TRUE, 0, pixel_ghitz_size_bytes, &pixel_ghitz_data, NULL, NULL);
208 outputHexData(n_pixel_ghitz_words, pixel_ghitz_data,
"Ideal Pixel Clustering Output");
213 ATH_MSG_DEBUG(
"------------------------------------------------------------------------------------------------");
217 m_queue.enqueueTask(m_pixelFirstStageSlicingInputKernels[0]);
219 m_queue.enqueueTask(m_pixelFirstStageSlicingOutputKernels[0]);
223 ATH_MSG_DEBUG(
"Synchronize output buffer data from device global memory");
224 uint64_t se_out_data[n_pixel_first_sliced_words];
225 m_queue.enqueueReadBuffer(m_pixelFirstStageSlicingOutputBufferList[0], CL_TRUE, 0, pixel_first_sliced_size_bytes, &se_out_data);
227 outputHexData(n_pixel_first_sliced_words, se_out_data,
"Slicing Engine Output");
229 ATH_MSG_DEBUG(
"Write SE output to inside out input (cross DDR banks)");
230 m_queue.enqueueWriteBuffer(m_insideOutInputBufferList[0], CL_TRUE, 0, pixel_first_sliced_size_bytes, &pixel_first_sliced_data, NULL, NULL);
233 m_queue.enqueueTask(m_insideOutInputKernels[0]);
236 m_queue.enqueueTask(m_insideOutOutputKernels[0]);
241 ATH_MSG_DEBUG(
"------------------------------------------------------------------------------------------------");
244 return StatusCode::SUCCESS;
250 return StatusCode::SUCCESS;