【问题标题】:OpenCL cannot find GPU device: NVIDIA GPU (Quadro K4000) + Visual Studio 2015OpenCL 找不到 GPU 设备:NVIDIA GPU (Quadro K4000) + Visual Studio 2015
【发布时间】:2016-02-26 05:09:02
【问题描述】:

刚开始学习 OpenCL 并使用 VS2015 设置 Visual Studio 项目。不知何故,代码只能找到1个平台(我猜应该是CPU),找不到GPU设备。有人可以帮忙吗?详细信息如下:

  1. GPU:Nvidia Quadro K4000
  2. CUDA 安装

    CUDA 位于:“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5

    OpenCL相关文件位于“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include\CL”和“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\Win32”(假设32位系统)

    安装程序创建了两个环境变量“CUDA_PATH”和“CUDA_PATH_V7_5”。它们都指向上述位置。

  3. 在 Visual Studio 中,项目设置为

    项目属性” -> “C/C++” -> “其他包含目录” -> “$(CUDA_PATH)\include

    项目属性”->“链接器”->“其他库目录”->“$(CUDA_PATH)\lib\Win32

    项目属性” -> “链接器” -> “输入” -> “其他依赖项 " -> "OpenCL.lib"

代码很简单:

#include "stdafx.h"
#include <iostream>
#include <CL/cl.h>
using namespace std;

int main()
{
    cl_int err;
    cl_uint numPlatforms;

    err = clGetPlatformIDs(0, NULL, &numPlatforms);

    if (CL_SUCCESS == err)
        cout << "Detected OpenCL platforms: " << numPlatforms  << endl;
    else
        cout << "Error calling clGetPlatformIDs. Error code:" << err << endl;


    cl_device_id device = NULL;
    err = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
    if (err == CL_SUCCESS)
        cout << device << endl;

    return 0;
}

代码可以编译运行,但不能在 GPU 设备上运行。具体来说,变量device的返回值为device = 0x00000000 &lt;NULL&gt;。会有什么问题?感谢您的帮助。

【问题讨论】:

    标签: opencl gpu gpgpu nvidia


    【解决方案1】:

    这不是您使用 OpenCL API 的方式。

    您需要获得一个有效的cl_platform_id 对象,该对象需要用于检索cl_device_id。你总是在传递NULL,这是行不通的。

    第一次调用clGetPlatformIds,是为了获取系统中的平台数量。之后,您需要再次调用该方法以检索实际的cl_platform_ids:

    size_t numPlatforms;
    err = clGetPlatformIDs(0, NULL, &numPlatforms);
    assert(numPlatforms > 0);
    cl_platform_id platform_ids[numPlatforms];
    err = clGetPlatformIDs(numPlatforms, platform_ids, NULL);
    

    但是,如果您已经知道系统中只有一个平台,那么您可以执行以下加速操作,但请务必检查错误:

    cl_platform_id platform_id;
    err = clGetPlatformIDs(1, &platform_id, NULL);
    assert(err == CL_SUCCESS);
    

    获得平台后,您需要按照相同的过程首先获取设备数量,然后检索 OpenCL 设备列表(然后您需要构建一个cl_context,队列...):

    // Note: this has to be done for each `cl_platform_id`
    // until you find the device you were looking for
    size_t numDevices;
    err = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);
    assert(numDevices > 0);
    cl_device_id devices[numDevices];
    err = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
    

    我猜你现在明白这个过程了。如果像上面一样,你已经知道系统中只有1个GPU设备,你可以直接得到它的cl_device_id,如下:

    cl_device_id device;
    err = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
    assert(err == CL_SUCCESS);
    

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多