in src/oclfpga/oclfpga_device.cc [102:155]
int OCLFPGADevice::setup(size_t mem_size, std::string bitstream_file) {
cl_int status;
unsigned int argi;
size_t size;
FILE *binary_file;
unsigned char *binary;
LOG(INFO) << "Using Bitstream: " << bitstream_file;
binary_file = std::fopen(bitstream_file.c_str(), "rb");
CHECK(binary_file) << "Could not open bitstream file for reading";
std::fseek(binary_file, 0, SEEK_END);
size = std::ftell(binary_file);
std::fseek(binary_file, 0, SEEK_SET);
binary = new unsigned char[size];
std::fread(binary, 1, size, binary_file);
std::fclose(binary_file);
_program = clCreateProgramWithBinary(_context, 1, &_device, &size,
const_cast<const unsigned char **>(&binary), NULL, &status);
delete binary;
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to build program";
for (unsigned int i = 0; i < NUM_OCL_KERNELS; i++) {
_kernels[i] = clCreateKernel(_program, kernel_names[i], &status);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to create kernel";
_queues[i] = clCreateCommandQueue(_context, _device, 0, &status);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to create command queue";
}
_mem = clCreateBuffer(_context, CL_MEM_READ_WRITE, mem_size, NULL, &status);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to create buffer mem";
mem_chunk_t init_chunk = {.offset = 0, .size = mem_size, .occupied = false};
_mem_chunks.push_back(init_chunk);
_alignment = std::lcm(VTA_BLOCK_IN * VTA_BLOCK_OUT,
std::lcm(VTA_BLOCK_IN, VTA_BLOCK_OUT * sizeof(int)) * VTA_BATCH);
argi = 2;
status = clSetKernelArg(_kernels[KERNEL_VTA_CORE], argi++, sizeof(cl_mem), &_mem);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to set argument " << argi;
status = clSetKernelArg(_kernels[KERNEL_VTA_CORE], argi++, sizeof(cl_mem), &_mem);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to set argument " << argi;
status = clSetKernelArg(_kernels[KERNEL_VTA_CORE], argi++, sizeof(cl_mem), &_mem);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to set argument " << argi;
status = clSetKernelArg(_kernels[KERNEL_VTA_CORE], argi++, sizeof(cl_mem), &_mem);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to set argument " << argi;
status = clSetKernelArg(_kernels[KERNEL_VTA_CORE], argi++, sizeof(cl_mem), &_mem);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to set argument " << argi;
status = clSetKernelArg(_kernels[KERNEL_VTA_CORE], argi++, sizeof(cl_mem), &_mem);
CHECK(CL_STATUS_SUCCESS(status)) << "Failed to set argument " << argi;
return 0;
}