2015-11-23 3 views
0

Только что начал изучать OpenCL и настроить проект Visual Studio с использованием VS2015. Так или иначе, код может найти только одну платформу (я думаю, это должен быть процессор) и не может найти устройство GPU. Кто-то может помочь? Подробная информация выглядит следующим образом:OpenCL не может найти устройство GPU: NVIDIA GPU (Quadro K4000) + Visual Studio 2015

  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-битной системы)

    Установщик создал t wo "CUDA_PATH" и "CUDA_PATH_V7_5". Оба они указывают на указанное место.

  3. В Visual Studio, проект создан как

    "Свойства проекта" -> "C/C++" -> "Additional Include Directories" -> " $(CUDA_PATH)\include "

    " Свойства проекта "->" Linker "->" Дополнительные каталоги библиотек "->" $(CUDA_PATH)\lib\Win32 "

    " Свойства проекта "->" Linker "->" ввода "->" Дополнительные зависимости "->" 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 <NULL>. В чем проблема? Спасибо за помощь.

ответ

3

Это не то, как вы используете OpenCL API.

Вам необходимо получить действительный объект cl_platform_id, который необходимо использовать для извлечения cl_device_id. Вы всегда проходите NULL, это не сработает.

В первый раз, когда вы вызываете clGetPlatformIds, вы делаете это, чтобы получить количество платформ в системе.После чем вам нужно вызвать метод снова, чтобы получить фактический cl_platform_id S:

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

Однако, если вы уже знаете, там будет только одна платформа в системе, то вы можете сделать SpeedUp вещи, как следует, но не забудьте проверить на наличие ошибок:

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);