115 int n_inside_out_words = 4 * 1024;
117 ATH_MSG_DEBUG(
"Pixel Clustering TV words = " << n_pixel_words <<
" (64b)");
118 ATH_MSG_DEBUG(
"Pixel GHITZ TV words = " << n_pixel_ghitz_words <<
" (64b)");
119 ATH_MSG_DEBUG(
"Pixel Sliced TV words = " << n_pixel_first_sliced_words <<
" (64b)");
121 uint64_t pixel_cls_input_data[n_pixel_words];
122 uint64_t pixel_ghitz_data[n_pixel_ghitz_words];
123 uint64_t pixel_first_sliced_data[n_pixel_first_sliced_words];
129 std::unique_lock lock(m_fpgaHandleMtx);
132 size_t pixel_size_bytes = n_pixel_words *
sizeof(uint64_t);
133 size_t pixel_ghitz_size_bytes = n_pixel_ghitz_words *
sizeof(uint64_t);
134 size_t pixel_first_sliced_size_bytes = n_pixel_first_sliced_words *
sizeof(uint64_t);
135 size_t inside_out_size_bytes = n_inside_out_words *
sizeof(uint64_t);
138 m_pixelClusterL2GInputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_size_bytes, NULL, &err));
140 m_pixelClusterL2GOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_ghitz_size_bytes, NULL, &err));
142 m_pixelClusterL2GEDMOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_ghitz_size_bytes, NULL, &err));
144 m_pixelFirstStageSlicingInputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_ghitz_size_bytes, NULL, &err));
146 m_pixelFirstStageSlicingOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_first_sliced_size_bytes, NULL, &err));
147 ATH_MSG_DEBUG(
"Allocating Inside PR Input Buffer in Global Memory");
148 m_insideOutInputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, pixel_first_sliced_size_bytes, NULL, &err));
149 ATH_MSG_DEBUG(
"Allocating Inside PR Output Buffer in Global Memory");
150 m_insideOutOutputBufferList.push_back(cl::Buffer(
m_context, CL_MEM_READ_WRITE, inside_out_size_bytes, NULL, &err));
154 m_pixelClusterL2GKernels[0].setArg(0, m_pixelClusterL2GInputBufferList[0]);
156 m_pixelClusterL2GKernels[0].setArg(1, m_pixelClusterL2GOutputBufferList[0]);
158 m_pixelClusterL2GKernels[0].setArg(2, m_pixelClusterL2GEDMOutputBufferList[0]);
161 m_pixelFirstStageSlicingInputKernels[0].setArg(0, m_pixelFirstStageSlicingInputBufferList[0]);
163 m_pixelFirstStageSlicingInputKernels[0].setArg(1, n_pixel_ghitz_words);
166 m_pixelFirstStageSlicingOutputKernels[0].setArg(0, m_pixelFirstStageSlicingOutputBufferList[0]);
168 m_pixelFirstStageSlicingOutputKernels[0].setArg(1, n_pixel_first_sliced_words);
170 ATH_MSG_DEBUG(
"Setting buffer for Input kernel run INSIDE OUT.");
171 m_insideOutInputKernels[0].setArg(0, m_insideOutInputBufferList[0]);
173 ATH_MSG_DEBUG(
"Setting buffer for Output kernel run INSIDE OUT.");
174 m_insideOutOutputKernels[0].setArg(0, m_insideOutOutputBufferList[0]);
178 ATH_MSG_DEBUG(
"Loading input data to pixel clustering kernel...");
179 m_queue.enqueueWriteBuffer(m_pixelClusterL2GInputBufferList[0], CL_TRUE, 0, pixel_size_bytes, &pixel_cls_input_data, NULL, NULL);
182 outputHexData(n_pixel_words, pixel_cls_input_data,
"Pixel Clustering Input");
186 m_queue.enqueueTask(m_pixelClusterL2GKernels[0]);
191 uint64_t cls_out_data[n_pixel_ghitz_words];
192 m_queue.enqueueReadBuffer(m_pixelClusterL2GOutputBufferList[0], CL_TRUE, 0, pixel_ghitz_size_bytes, &cls_out_data);
194 outputHexData(n_pixel_ghitz_words, cls_out_data,
"Real Pixel Clustering Output");
198 uint64_t cls_out_edm_data[n_pixel_ghitz_words];
199 m_queue.enqueueReadBuffer(m_pixelClusterL2GEDMOutputBufferList[0], CL_TRUE, 0, pixel_ghitz_size_bytes, &cls_out_edm_data);
201 outputHexData(n_pixel_ghitz_words, cls_out_edm_data,
"Real Pixel Clustering EDM Output");
205 m_queue.enqueueWriteBuffer(m_pixelFirstStageSlicingInputBufferList[0], CL_TRUE, 0, pixel_ghitz_size_bytes, &pixel_ghitz_data, NULL, NULL);
207 outputHexData(n_pixel_ghitz_words, pixel_ghitz_data,
"Ideal Pixel Clustering Output");
212 ATH_MSG_DEBUG(
"------------------------------------------------------------------------------------------------");
216 m_queue.enqueueTask(m_pixelFirstStageSlicingInputKernels[0]);
218 m_queue.enqueueTask(m_pixelFirstStageSlicingOutputKernels[0]);
222 ATH_MSG_DEBUG(
"Synchronize output buffer data from device global memory");
223 uint64_t se_out_data[n_pixel_first_sliced_words];
224 m_queue.enqueueReadBuffer(m_pixelFirstStageSlicingOutputBufferList[0], CL_TRUE, 0, pixel_first_sliced_size_bytes, &se_out_data);
226 outputHexData(n_pixel_first_sliced_words, se_out_data,
"Slicing Engine Output");
228 ATH_MSG_DEBUG(
"Write SE output to inside out input (cross DDR banks)");
229 m_queue.enqueueWriteBuffer(m_insideOutInputBufferList[0], CL_TRUE, 0, pixel_first_sliced_size_bytes, &pixel_first_sliced_data, NULL, NULL);
232 m_queue.enqueueTask(m_insideOutInputKernels[0]);
235 m_queue.enqueueTask(m_insideOutOutputKernels[0]);
240 ATH_MSG_DEBUG(
"------------------------------------------------------------------------------------------------");
243 return StatusCode::SUCCESS;