Я видел в каком-то коде, что в библиотеке 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, и если да, то как его вызывать.
1 ответ
Вам нужно определить __CL_ENABLE_EXCEPTIONS
или, если вы используете более новую версию #include <CL/cl2.hpp>
, вам нужно CL_HPP_ENABLE_EXCEPTIONS
.
Определение должно быть до того, как вы включите заголовок opencl.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
#define __CL_ENABLE_EXCEPTIONS
в<CL/cl.hpp>
я снова получил ту же ошибку. Ничего не изменилось.