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;