13#include <CL/cl_ext_xilinx.h>
20 std::vector<cl::Platform> platforms;
21 cl_int err = cl::Platform::get(&platforms);
23 if (err == CL_SUCCESS)
25 ATH_MSG_INFO(
"Detected OpenCL platforms: " << platforms.size());
29 ATH_MSG_ERROR(
"Error calling cl::Platform::get. Error code: " << err);
30 return StatusCode::FAILURE;
33 std::vector<cl::Device> allDevices;
36 bool foundAccelerator =
false;
39 for (cl::Platform pf : platforms)
43 ATH_MSG_INFO(
"Platform name: " << pf.getInfo<CL_PLATFORM_NAME>());
44 ATH_MSG_INFO(
"Platform profile: " << pf.getInfo<CL_PLATFORM_PROFILE>());
45 ATH_MSG_INFO(
"Platform vendor: " << pf.getInfo<CL_PLATFORM_VENDOR>());
47 pf.getDevices(CL_DEVICE_TYPE_ALL, &allDevices);
48 ATH_MSG_INFO(
"There are " << allDevices.size() <<
" devices in this platform.");
50 for(
auto device : allDevices)
56 foundAccelerator =
true;
60 if (device.getInfo<CL_DEVICE_TYPE>() == CL_DEVICE_TYPE_ACCELERATOR)
62 std::string deviceBDF =
"";
63 device.getInfo(CL_DEVICE_PCIE_BDF, &deviceBDF);
71 foundAccelerator =
true;
77 ATH_MSG_INFO(
"Using the first found accelerator card: " << device.getInfo<CL_DEVICE_NAME>());
79 foundAccelerator =
true;
88 ATH_MSG_INFO(
"Couldn't find an FPGA accelerator card in this platform");
96 ATH_MSG_ERROR(
"Couldn't find an FPGA accelerator card on any platform");
97 return StatusCode::FAILURE;
100 ATH_MSG_INFO(
"Using device number " << device_id <<
" which is a FPGA accelerator card: " <<
m_accelerator.getInfo<CL_DEVICE_NAME>());
105 return StatusCode::SUCCESS;
112 return StatusCode::SUCCESS;
118 std::ifstream bin_file(xclbin, std::ios_base::binary);
122 return StatusCode::FAILURE;
125 bin_file.seekg(0, bin_file.end);
126 unsigned bin_size = bin_file.tellg();
128 bin_file.seekg(0, bin_file.beg);
130 std::vector<char> buf(bin_size);
131 bin_file.read(buf.data(), bin_size);
135 std::vector<cl_int> binaryStatus;
136 cl::Program::Binaries
bins{{buf.data(), bin_size}};
141 if (err == CL_SUCCESS && binaryStatus.at(0) == CL_SUCCESS)
147 ATH_MSG_ERROR(
"Error loading xclbin file (" << xclbin <<
") into " <<
m_accelerator.getInfo<CL_DEVICE_NAME>() <<
". Error code: " << err);
148 return StatusCode::FAILURE;
151 return StatusCode::SUCCESS;
156 for(
const auto &item : inputs)
160 ATH_MSG_FATAL(item.documentation()<<
" is empty. Please set it to a valid value");
161 return StatusCode::FAILURE;
168 ATH_MSG_WARNING(
"Device BDF is not set. Using the first found accelerator card. Set property 'bdfID' to specify the BDF of the device.");
171 return StatusCode::SUCCESS;
#define ATH_MSG_WARNING(x)
static const std::vector< std::string > bins
StatusCode loadProgram(const std::string &xclbin)
Find the xclbin file and load it into the OpenCL program object.
cl::Program m_program
Program object containing the kernel.
Gaudi::Property< bool > m_doEmulation
virtual StatusCode initialize() override
Detect the OpenCL devices and prepare OpenCL context.
cl::Context m_context
Context object for the application.
StatusCode precheck(const std::vector< Gaudi::Property< std::string > > &inputs) const
Check if the the desired Gaudi properties are set.
Gaudi::Property< std::string > m_deviceBDF
BDF ID of the accelerator card.
cl::Device m_accelerator
Device object for the accelerator card.
virtual StatusCode execute(const EventContext &ctx) const
Should be overriden by derived classes to perform meaningful work.