33 options.
add_options()(
"help,h",
"produce help message")(
34 "xclbin,x",
"the input xclbin path", cxxopts::value<std::string>())(
35 "kernel,k",
"the kernel name in the XCLBIN (for instance PP_PRE_FD)",
36 cxxopts::value<std::string>())(
"verbosity,v",
37 "the verbosity of the output",
38 cxxopts::value<int>()->default_value(
"0"))(
40 "path of file containing userspace instructions sent to the NPU",
41 cxxopts::value<std::string>())(
42 "verify",
"whether to verify the AIE computed output",
43 cxxopts::value<bool>()->default_value(
"true"))(
44 "iters",
"number of iterations",
45 cxxopts::value<int>()->default_value(
"1"))(
46 "warmup",
"number of warmup iterations",
47 cxxopts::value<int>()->default_value(
"0"))(
48 "trace_sz,t",
"trace size", cxxopts::value<int>()->default_value(
"0"))(
49 "trace_file",
"where to store trace output",
50 cxxopts::value<std::string>()->default_value(
"trace.txt"));
82 std::ifstream instr_file(instr_path);
84 std::vector<uint32_t> instr_v;
85 while (std::getline(instr_file, line)) {
86 std::istringstream iss(line);
88 if (!(iss >> std::hex >> a)) {
89 throw std::runtime_error(
"Unable to parse instruction file\n");
98 std::ifstream instr_file(instr_path, std::ios::binary);
99 if (!instr_file.is_open()) {
100 throw std::runtime_error(
"Unable to open instruction file\n");
104 instr_file.seekg(0, std::ios::end);
105 std::streamsize size = instr_file.tellg();
106 instr_file.seekg(0, std::ios::beg);
110 throw std::runtime_error(
"File size is not a multiple of 4 bytes\n");
114 std::vector<uint32_t> instr_v(size / 4);
115 if (!instr_file.read(
reinterpret_cast<char *
>(instr_v.data()), size)) {
116 throw std::runtime_error(
"Failed to read instruction file\n");
125 int verbosity, std::string xclbinFileName,
126 std::string kernelNameInXclbin) {
128 unsigned int device_index = 0;
129 device = xrt::device(device_index);
133 std::cout <<
"Loading xclbin: " << xclbinFileName <<
"\n";
134 auto xclbin = xrt::xclbin(xclbinFileName);
137 std::cout <<
"Kernel opcode: " << kernelNameInXclbin <<
"\n";
140 auto xkernels = xclbin.get_kernels();
142 *std::find_if(xkernels.begin(), xkernels.end(),
143 [kernelNameInXclbin, verbosity](xrt::xclbin::kernel &k) {
144 auto name = k.get_name();
145 if (verbosity >= 1) {
146 std::cout <<
"Name: " << name << std::endl;
148 return name.rfind(kernelNameInXclbin, 0) == 0;
150 auto kernelName = xkernel.get_name();
153 std::cout <<
"Registering xclbin: " << xclbinFileName <<
"\n";
155 device.register_xclbin(xclbin);
159 std::cout <<
"Getting hardware context.\n";
160 xrt::hw_context context(device, xclbin.get_uuid());
164 std::cout <<
"Getting handle to kernel:" << kernelName <<
"\n";
165 kernel = xrt::kernel(context, kernelName);