Функция Open CL не возвращает управление основному коду - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь запустить пример дизайна для добавления 2 векторов в Accelerator, используя OpenCL и ускоритель xilinx. Я успешно запустил дизайн примера, когда у меня есть весь код в main (). Теперь, когда я попытался поэкспериментировать с созданием функций, я наткнулся на многие проблемы. Я добавляю фрагмент соответствующей части кода и проблемы, с которыми сталкиваюсь.

cl::Context context_global;
cl::CommandQueue q_global;
cl::Program program_global;
cl::Kernel krnl_vadd_global;

void Kernel_Initialise(std::string binaryFile)
{
  auto devices = xcl::get_xil_devices();
  auto device = devices[0];
  OCL_CHECK(err,cl::Context  context(device, NULL, NULL, NULL, &err));
  OCL_CHECK(
      err,cl::CommandQueue q(context, device, CL_QUEUE_PROFILING_ENABLE, &err));

  auto device_name = device.getInfo<CL_DEVICE_NAME>();

  auto fileBuf = xcl::read_binary_file(binaryFile);
  cl::Program::Binaries bins{{fileBuf.data(), fileBuf.size()}};
   devices.resize(1);
   OCL_CHECK(err,cl::Program program (context, devices, bins, NULL, &err));
   OCL_CHECK(err,cl::Kernel krnl_vadd (program, "krnl_vadd_rtl", &err));
   context_global = context;
   q_global = q;
   program_global = program;
   krnl_vadd_global = krnl_vadd;
}

std::vector<int, aligned_allocator<int>> Rest_of_add(std::vector<int, aligned_allocator<int>> source_input1,std::vector<int, aligned_allocator<int>> source_input2)
{

    auto size = DATA_SIZE;
    //Allocate Memory in Host Memory
    auto vector_size_bytes = sizeof(int) * size;

    std::vector<int, aligned_allocator<int>> source_hw_results(size);
    //Allocate Buffer in Global Memory
    OCL_CHECK(err,
              cl::Buffer buffer_r1(context_global,
                                   CL_MEM_USE_HOST_PTR | CL_MEM_READ_ONLY,
                                   vector_size_bytes,
                                   source_input1.data(),
                                   &err));
    OCL_CHECK(err,
              cl::Buffer buffer_r2(context_global,
                                   CL_MEM_USE_HOST_PTR | CL_MEM_READ_ONLY,
                                   vector_size_bytes,
                                   source_input2.data(),
                                   &err));
    OCL_CHECK(err,
              cl::Buffer buffer_w(context_global,
                                  CL_MEM_USE_HOST_PTR | CL_MEM_WRITE_ONLY,
                                  vector_size_bytes,
                                  source_hw_results.data(),
                                  &err));

    //Set the Kernel Arguments
    OCL_CHECK(err, err = krnl_vadd_global.setArg(0, buffer_r1));
    OCL_CHECK(err, err = krnl_vadd_global.setArg(1, buffer_r2));
    OCL_CHECK(err, err = krnl_vadd_global.setArg(2, buffer_w));
    OCL_CHECK(err, err = krnl_vadd_global.setArg(3, size));

    //Copy input data to device global memory
    OCL_CHECK(err,
              err = q_global.enqueueMigrateMemObjects({buffer_r1, buffer_r2},
                                               0 /* 0 means from host*/));

    //Launch the Kernel
    OCL_CHECK(err, err = q_global.enqueueTask(krnl_vadd_global));

    //Copy Result from Device Global Memory to Host Local Memory
    OCL_CHECK(err,
              err = q_global.enqueueMigrateMemObjects({buffer_w},
                                               CL_MIGRATE_MEM_OBJECT_HOST));
    OCL_CHECK(err, err = q_global.finish());

    return source_hw_results;
}

Мой первый вопрос: правильно ли я назначаю локальные объекты opencl, такие как context, q глобальным объектам opencl ??

Моя вторая проблема заключается в следующем: когда я выполнял код в одном куске кода, то есть main (), я не получал это предупреждение. Должен ли я беспокоиться об этом? Warning is in red

Выполнение: основное: нет предупреждений и тестов пройдено

Выполнение: основное -> Kernel_Initialise () -> главное -> Rest_of_add () - -> main: Предупреждение, но тест пройден

Моя третья проблема:

Я объединил обе функции в одну функцию без использования глобальных объектов Opencl. Это должно быть так же, как запуск функций Opencl из основной функции (я экспериментировал с этим, чтобы проверить, исчезнет ли предупреждение). Но, к сожалению, управление из функции никогда не возвращалось к коду main (). Я проверил, что управление достигло конца функции.

Подводя итог:

Выполнение: основное: Нет предупреждений и тестовый пропуск

Выполнение: основное -> Kernel_Initialise () -> main -> Rest_of_add () -> main: предупреждение, но тест пройден

Выполнение: main -> Одна функция, содержащая как Kernel_Initialise (), так и Rest_of_add (): управление не возвращено на главную

...