我目前正在为OpenCL内核编写一些单元测试,需要创建一个上下文。 由于我没有在性能之后,对我来说哪个设备运行内核并不重要。 所以我想用尽可能少的限制创建上下文并想到这段代码:
#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <iostream>
int main() {
try {
cl::Context context(CL_DEVICE_TYPE_ALL);
}catch(const cl::Error &err) {
std::cerr << "Caught cl::Error (" << err.what() << "): " << err.err() << "\n";
}
}
返回
抓住cl ::错误(clCreateContextFromType): - 32
-32是CL_INVALID_PLATFORM,clCreateContextFromType的文档说:
CL_INVALID_PLATFORM如果属性为NULL且无法选择平台或者属性中指定的平台值不是有效平台。
由于我没有提供任何属性,因此它们当然是NULL。 为什么不能选择任何平台?
我也尝试了CL_DEVICE_TYPE_DEFAULT
同样的结果。
以下是我检测到的平台和设备列表:
NVIDIA CUDA
(GPU) GeForce GTX 560
作为辅助节点:在属性中指定平台按预期工作。
答案 0 :(得分:1)
我使用CL_DEVICE_TYPE_ALL
尝试了您的代码,它可用于我的设置。我不确定为什么它不适用于你...
作为一种解决方法,也许你可以这样做:
// Get all available platforms
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
// Pick the first and get all available devices
std::vector<cl::Device> devices;
platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &devices);
// Create a context on the first device, whatever it is
cl::Context context(devices[0]);
答案 1 :(得分:0)
cl::Context context(cl_device_type)
使用默认参数调用完整构造函数:
cl::Context::Context(cl_device_type type,
cl_context_properties * properties = NULL,
void(CL_CALLBACK *notifyFptr)(const char *,const void *,::size_t,void *) = NULL,
void * data = NULL,
cl_int * err = NULL
)
Witch只是底层clCreateContextFromType()
的C ++包装器。
此函数允许将NULL指针作为属性传递,但随后,平台选择依赖于实现。在您的情况下,它看起来并不默认为nVIDIA平台。
你必须将一些信息传递给我害怕的构造函数....