在任何平台/设备上创建上下文

时间:2013-12-10 11:06:31

标签: opencl

我目前正在为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

作为辅助节点:在属性中指定平台按预期工作。

2 个答案:

答案 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平台。

你必须将一些信息传递给我害怕的构造函数....