Tôi cố gắng để sử dụng OpenCL C++ wrapper API cho các chương trình sau đây:OpenCL 1.2 C++ Wrapper - tài liệu tham khảo không xác định để clReleaseDevice
#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <cstdio>
#include <cstdlib>
#include <iostream>
const char helloStr [] = "__kernel void "
"hello(void) "
"{ "
" "
"} ";
int
main(void)
{
cl_int err = CL_SUCCESS;
try {
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
if (platforms.size() == 0) {
std::cout << "Platform size 0\n";
return -1;
}
cl_context_properties properties[] =
{ CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
cl::Context context(CL_DEVICE_TYPE_CPU, properties);
std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
cl::Program::Sources source(1,
std::make_pair(helloStr,strlen(helloStr)));
cl::Program program_ = cl::Program(context, source);
program_.build(devices);
cl::Kernel kernel(program_, "hello", &err);
cl::Event event;
cl::CommandQueue queue(context, devices[0], 0, &err);
queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(4,4),
cl::NullRange,
NULL,
&event);
event.wait();
}
catch (cl::Error err) {
std::cerr
<< "ERROR: "
<< err.what()
<< "("
<< err.err()
<< ")"
<< std::endl;
}
return EXIT_SUCCESS;
}
tôi sử dụng tập tin kernel cùng từ đó bài đăng blog, mà dù sao không phải là vấn đề vì tôi không thể có được quá trình biên dịch.
Tôi đang biên soạn chương trình với lệnh sau:
g++ example.cpp -o example -l OpenCL
và tôi nhận được thông báo lỗi sau: thứ
/tmp/ccbUf7dB.o: In function `cl::detail::ReferenceHandler<_cl_device_id*>::release(_cl_device_id*)':
example.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_[_ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_]+0x14): undefined reference to `clReleaseDevice'
collect2: error: ld returned 1 exit status
Tôi đã đọc về clReleaseDevice không làm việc cho các thiết bị di sản (xem ví dụ this question), nhưng card đồ họa của tôi là khá gần đây (NVidia GTX 660 Ti, hỗ trợ OpenCL 1.2). Tôi có thể đi từ đâu?
Tôi đang chạy ứng dụng này trên Ubuntu 13.04 x64 với nvidia-opencl-dev và opencl-headers được cài đặt từ kho ubuntu.
Thử thêm '-DCL_USE_DEPRECATED_OPENCL_1_1_APIS' vào tệp makefile của bạn. – Thomas
Không thay đổi bất cứ điều gì .. Tôi duyệt tệp CL/cl.hpp và mã đi kèm với xác định này dường như không liên quan đến lệnh gọi hàm này. – levesque
Điều gì sẽ xảy ra nếu bạn đặt '#define CL_USE_DEPRECATED_OPENCL_1_1_APIS; #include "CL/cl.h"; #undef CL_VERSION_1_2; #define __CL_ENABLE_EXCEPTIONS; #include "cl-1.2.hpp" 'Điều đó có hiệu quả không? Tôi đã thử nó trên Amazon AWS nvidia, với ubuntu 14.04, và có vẻ làm việc ok? –