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

Opencl 在任何平台/设备上创建上下文,opencl,Opencl,我目前正在为OpenCL内核编写一些单元测试,需要创建一个上下文。 因为我不追求性能,所以运行内核的设备对我来说并不重要。 因此,我想创建尽可能少限制的上下文,并考虑以下代码: #define __CL_ENABLE_EXCEPTIONS #include <CL/cl.hpp> #include <iostream> int main() { try { cl::Context context(CL_DEVICE_TYPE_ALL); }catch(c

我目前正在为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::Context Context(cl\u device\u 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   
)
巫师只是对基础<代码> CCREATETECTRONFROPE()/<代码>的C++包装器。 此函数允许将空指针作为属性传递,但平台选择取决于实现。在您的情况下,它似乎不是默认的nVIDIA平台

恐怕您必须将一些信息传递给构造函数….

cl::Context Context(cl\u device\u 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   
)
巫师只是对基础<代码> CCREATETECTRONFROPE()/<代码>的C++包装器。 此函数允许将空指针作为属性传递,但平台选择取决于实现。在您的情况下,它似乎不是默认的nVIDIA平台


恐怕您必须将一些信息传递给构造器….

我使用
CL\u DEVICE\u TYPE\u 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]);
//获取所有可用的平台
向量平台;
cl::平台::获取(&platforms);
//选择第一个并获取所有可用设备
std::矢量设备;
平台[0]。获取设备(CL\U设备类型\U所有设备和设备);
//在第一台设备上创建上下文,不管它是什么
cl::上下文上下文(设备[0]);

我尝试了你的代码,使用了
CL\u DEVICE\u TYPE\u 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]);
//获取所有可用的平台
向量平台;
cl::平台::获取(&platforms);
//选择第一个并获取所有可用设备
std::矢量设备;
平台[0]。获取设备(CL\U设备类型\U所有设备和设备);
//在第一台设备上创建上下文,不管它是什么
cl::上下文上下文(设备[0]);

听起来似乎有道理。然而,这有点令人不满意,因为“平台选择”听起来似乎是从可用平台列表中选择平台。这听起来似乎是合理的。然而,这有点令人不满意,因为“平台选择”听起来好像平台将从可用平台列表中选择。如果可用,您可以使用Boost.Compute,这将使其变得像
Boost::Compute::system::default_context()一样简单
@KyleLutz:我不知道Boost.Compute,但它似乎还不是官方的Boost库。因此,这是禁止的。另外:它是否直接映射到OpenCL?我有一些预先存在的内核需要测试,重写是不可行的。虽然还没有正式的boost库,但它只是一个头文件,很容易插入(除了boost头文件和OpenCL之外,没有其他依赖项)。它确实有一个核心API,它是OpenCL C API上非常薄的C++包装器,允许使用现有的OpenCL内核。如果可用,可以使用Booost。Cube,这将使它简单如<代码> Boo:::Cys::St::Debug TraceExtTo()@KyleLutz:我不知道Boost.Compute,但它似乎还不是官方的Boost库。因此,这是禁止的。另外:它是否直接映射到OpenCL?我有一些预先存在的内核需要测试,重写是不可行的。虽然还没有正式的boost库,但它只是一个头文件,很容易插入(除了boost头文件和OpenCL之外,没有其他依赖项)。它确实有一个核心API,它是OpenCL C API上非常薄的C++包装器,允许您使用现有的OpenCL内核。我的代码在你的网站上运行这一事实给了我希望,我只需要重新安装/更新libOpenCL或某些驱动程序就可以重新获得工作状态。正如我在问题中指出的,我希望避免这种情况。我的代码在您的站点上运行的事实给了我希望,我只需要重新安装/更新libOpenCL或某些驱动程序就可以重新获得工作状态。