int OCLFPGADevice::setup()

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;
}