Я видел в каком-то коде, что в библиотеке OpenCL есть класс с именем cl::Error, с помощью которого можно отловить ошибку и тип ошибки в коде OpenCL. Но когда я добавил в свой код, вот так

#include <CL/cl.hpp>
#include <fstream>
#include <iostream>
#include <cassert>
#include <exception>
#define __CL_ENABLE_EXCEPTIONS

int main()
{
  std::vector<cl::Platform> platforms;
  cl::Platform::get(&platforms);

  assert(platforms.size() > 0);

  auto myPlatform = platforms.front();
  std::cout << "Using platform: " << myPlatform.getInfo<CL_PLATFORM_NAME>() << std::endl;

  std::vector<cl::Device> devices;
  myPlatform.getDevices(CL_DEVICE_TYPE_GPU, &devices);

  auto myDevice = devices.front();
  std::cout<< "Using device: "<< myDevice.getInfo<CL_DEVICE_NAME>() << std::endl;

  std::ifstream helloworldfile("helloWorldKernel.cl");
  std::string src(std::istreambuf_iterator<char>(helloworldfile), (std::istreambuf_iterator<char>()));

  cl::Program::Sources source(1,std::make_pair(src.c_str(), src.length() + 1));

  cl::Context context(myDevice);
  cl::Program program(context,source);

  cl::CommandQueue queue(context,myDevice);

  try
  {
    program.build("-cl-std=CL1.2");
  } catch(cl::Error& e)
  {
    std::cout << e.what() << std::cout;
  }

  int err;
  int szChar = 16;
  char  buf[szChar];

  cl::Buffer memBuf(context, CL_MEM_READ_WRITE, sizeof(char) * szChar);

  cl::Kernel kernel(program, "helloWorld", &err);

  if(err != CL_SUCCESS)
  {
    std::cout<<" Error in creating kernel, error: "<< err << std::endl;
    exit(1);
  } 


  kernel.setArg(0,memBuf);

  queue.enqueueTask(kernel);

  err =  queue.enqueueReadBuffer(memBuf,CL_TRUE, 0, sizeof(buf), buf);

  if(err != CL_SUCCESS)
  {
    std::cout<<" Error in reading from device, error: "<< err << std::endl;
    exit(1);
  }

  std::cout << buf;
  std::cin.get();

  return 0;

}

Я получил ошибку, что

helloWorld.cc:46:12: error: expected type-specifier
   } catch (cl::Error& e)
            ^
helloWorld.cc:46:21: error: expected unqualified-id before ‘&’ token
   } catch (cl::Error& e)
                     ^
helloWorld.cc:46:21: error: expected ‘)’ before ‘&’ token
helloWorld.cc:46:21: error: expected ‘{’ before ‘&’ token
helloWorld.cc:46:23: error: ‘e’ was not declared in this scope
   } catch (cl::Error& e)
                       ^
helloWorld.cc:46:24: error: expected ‘;’ before ‘)’ token
   } catch (cl::Error& e)

Мне было интересно, существует ли класс или, по крайней мере, существует ли он в конкретной версии библиотеки OpenCL, и если да, то как его вызывать.

2
Pejvak 7 Дек 2019 в 11:19

1 ответ

Вам нужно определить __CL_ENABLE_EXCEPTIONS или, если вы используете более новую версию #include <CL/cl2.hpp>, вам нужно CL_HPP_ENABLE_EXCEPTIONS.

Определение должно быть до того, как вы включите заголовок opencl.

6
Alan Birtles 17 Янв 2022 в 09:39
К #define __CL_ENABLE_EXCEPTIONS в <CL/cl.hpp> я снова получил ту же ошибку. Ничего не изменилось.
 – 
Pejvak
7 Дек 2019 в 12:38
Пожалуйста, отредактируйте свой вопрос, чтобы точно показать, что вы пытались
 – 
Alan Birtles
7 Дек 2019 в 12:52
Я сделал вопрос простым, но теперь я загрузил полный пример кода, в котором я упомянул ошибку.
 – 
Pejvak
7 Дек 2019 в 13:14
1
Вам нужно поставить определение перед включением opencl, в идеале поставить в настройках компилятора
 – 
Alan Birtles
7 Дек 2019 в 13:19
Спасибо за точку. Это работает, но не могли бы вы сказать мне, почему я должен определить его перед включением.
 – 
Pejvak
7 Дек 2019 в 13:25