2016-11-10 9 views
0

Я хочу запустить приложение OpenCL в Windows 10 с использованием моей видеокарты GTX970. Но следующий код не работает = (Запуск OpenCL под Windows 10

#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

Может кто-то пожалуйста, объясните, что случилось с этим фрагментом

заранее спасибо

EDIT:.?! Может кто-нибудь объяснить мне, почему, когда я пытаюсь отлаживать этот код он падает при получении идентификатора платформы, однако, когда я не отлаживаю этот код, который он печатает, что у меня есть две платформы (моя карта графического процессора и целочисленный графический процессор)

+0

Nvidia поддерживает только OpenCL 1.1. Я бы настоятельно предложил получить карту AMD или, по крайней мере, написать какой-то OpenCL 2.0 и запустить его, используя либо процессор AMD, либо Intel (или оба). Также: обязательно посмотрите примеры OpenCL, включенные в SDK Nvidia, часто даже простая инициализация требует обмана. Заключительное примечание: API C++ устарел, поэтому использовать его не рекомендуется. Какова реальная проблема, с которой вы сталкиваетесь, понятия не имею, поэтому это подразумевается как (длинный) комментарий. – rubenvb

+0

Ничего себе, но просмотрщик gpu caps дает мне информацию о том, что моя графическая карта поддерживает OpenCL 1.2. Это имеет значение? – EdZhavoronkov

+0

@Ed может быть 1,2, но все хорошие вещи (что делает OpenCL конкурентоспособным с CUDA) в 2.0. – rubenvb

ответ

0

Возможно, ваш iGPU является Intel (предположим, вы сделали комбо gtx970 + intel cpu для игр), в котором также есть экспериментальная поддержка платформы opencl 2.1, которая может дать ошибку для приложения opencl 1.2 при сборе устройства или выборе платформы (у меня была аналогичная проблема).

Вы должны проверить возвращенные коды ошибок из команд opencl api. Они дают лучшую информацию о том, что произошло.

Например, у моей системы две платформы для Intel, одна из которых является экспериментальной версией 2.1 только для процессора, а одна из них является нормальной для обоих процессоров gpu и CPU.

Чтобы проверить это, запросите версию платформы и проверьте ее 7-е и 9-е значения символов, возвращаемые параметром, против 1 и 2 для 1,2 или 2 и 0 для 2.0. Это должно elliminate экспериментальной 2,1, что дает 2 в 7 полукокса и «1» на 9-м полукокса (где индексация начинается с 0 Ofcourse)

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

CL_PLATFORM_VERSION

Проверить как цифровой клавиатуры номер кодов клавиш и слева номера клавиш.

У Nvidia должна быть поддержка 1.2.

Если я прав, вы можете запросить устройства cpu и иметь 2 от Intel и 1 от Nvidia (если есть) взамен.

+0

thnx для ответа. Да, у меня есть две разные платформы. Я попытался получить устройства только с платформы NVIDIA, но он все еще терпит неудачу – EdZhavoronkov

+0

@EdZhavoronkov, что он вернулся как код ошибки oepncl? Отключите try catch, чтобы проверить, что plz –

+0

падает с ошибкой отладки. Ваше предположение было правильным. У меня было две разные версии поддержки OpenCL. Я попытаюсь отключить Intel один и использовать только NVIDIA – EdZhavoronkov