在Windows 10下运行OpenCL

时间:2016-11-10 20:10:48

标签: c++ windows opencl

我想使用我的GTX970显卡在Windows 10下运行OpenCL应用程序。但是下面的代码不起作用=(

#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <CL/cl.h>

#include <vector>
#include <fstream>
#include <iostream>
#include <iomanip>

int main() {
    std::vector<cl::Platform> platforms;
    std::vector<cl::Device> devices;

    try
    {
        cl::Platform::get(&platforms);

        std::cout << platforms.size() << std::endl;

        for (cl_uint i = 0; i < platforms.size(); ++i)
        {
            platforms[i].getDevices(CL_DEVICE_TYPE_GPU, &devices);
        }

        std::cout << devices.size() << std::endl;

    }
    catch (cl::Error e) {
        std::cout << std::endl << e.what() << " : " << e.err() << std::endl;
    }

    return 0;
}

它给出了错误代码-1。我正在使用Visual Studio 2015 Community Edition通过已安装的NVIDIA CUDA SDK v8.0和已配置的路径启动它,因此编译器和链接器了解SDK。

有人可以解释这个片段有什么问题吗?

提前致谢!

编辑:有人也可以解释一下,为什么当我尝试调试这个代码时它会获得平台ID,但是,当我不调试这个代码时它打印出我有2个平台(我的GPU卡和集成GPU)

1 个答案:

答案 0 :(得分:0)

可能你的iGPU是英特尔(我假设你做了一个gtx970 +用于游戏的intel cpu的组合),它还有一些实验性opencl 2.1平台支持,可能会给设备上的opencl 1.2应用程序带来错误采摘或平台采摘(我有类似的问题)。

您应该检查opencl api命令中返回的错误代码。那些提供了更好的信息。

例如,我的系统有两个用于Intel的平台,一个是针对cpu的实验2.1,另一个是针对gpu和cpu的正常1.2。

要检查,查询平台版本并检查其参数返回的第7和第9个字符值,针对1和2表示1.2或2和0表示2.0。这应该消除实验2.1,它在第7个字符处给出2和&#34; 1&#34;在第9个字符处(索引从0开始)

https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetPlatformInfo.html

CL_PLATFORM_VERSION

检查小键盘数字键码和左侧数字键码。

Nvidia必须已经有1.2支持。

如果我是对的,你可以查询cpu设备并获得2个来自英特尔和1个来自Nvidia(如果有的话)作为回报。