Форум программистов, компьютерный форум, киберфорум
Наши страницы
Peoples
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

Подключение OpenCL NVIDIA, QtCreator, MinGW32, Windows

Запись от Peoples размещена 03.08.2019 в 11:35

Подключение OpenCL NVIDIA, QtCreator, MinGW32, Windows


OpenCL (англ. Open Computing Language — открытый язык вычислений) — фреймворк для написания компьютерных программ, связанных с параллельными вычислениями на различных графических и центральных процессорах, а также FPGA.

Процедура установки и настройки OpenCL зависит от производителя вашего GPU/CPU:
Для использования OpenCL на процессорах Intel необходимо скачать и установить Intel SDK for OpenCL Applications https://software.intel.com/en-us/opencl-sdk; Владельцам же AMD понадобится обходимый драйвер.
Я же расскажу про установку для NVIDIA.

Для установки библиотеки OpenCL необходимо скачать NVIDIA CUDA Toolkit https://developer.nvidia.com/cuda-downloads, выбрав необходимые опции.
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 70
Размер:	54.3 Кб
ID:	5491

Далее запускаем установку. Компьютер попросит перезагрузку.

По завершению установки, по указанному вами пути будет создана папка CUDA со всеми исходниками.

Нажмите на изображение для увеличения
Название: Снимок2.PNG
Просмотров: 45
Размер:	101.5 Кб
ID:	5492

Запускаем QtCreator. Создаём консольное приложение.

В .pro-файл добавляем следующие строчки (Они могут немного меняться, в зависимости от того, где у вас установлена папка CUDA:

Код:
INCLUDEPATH += D:/CUDA/nvcc/include
LIBS += -LD:/CUDA/nvcc/lib/Win32 -lOpenCL
Пример моего .pro-файла:

Код:
QT += core
QT -= gui

TARGET = untitled6
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

CONFIG += C++14
QMAKE_CXXFLAGS += -std=c++14

INCLUDEPATH += D:/CUDA/nvcc/include
LIBS += -LD:/CUDA/nvcc/lib/Win32 -lOpenCL
Теперь в файл main.cpp вставим код, для проверки корректности проделанных действий:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <CL/cl.hpp>
 
int main(){
    std::vector<cl::Platform> all_platforms;
    cl::Platform::get(&all_platforms);
    if(all_platforms.size()==0){
        std::cout<<" No platforms found. Check OpenCL installation!\n";
        exit(1);
    }
    cl::Platform default_platform=all_platforms[0];
    std::cout << "Using platform: "<<default_platform.getInfo<CL_PLATFORM_NAME>()<<"\n";
 
    std::vector<cl::Device> all_devices;
    default_platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices);
    if(all_devices.size()==0){
        std::cout<<" No devices found. Check OpenCL installation!\n";
        exit(1);
    }
    cl::Device default_device=all_devices[0];
    std::cout<< "Using device: "<<default_device.getInfo<CL_DEVICE_NAME>()<<"\n";
 
 
    cl::Context context({default_device});
 
    cl::Program::Sources sources;
 
    std::string kernel_code=
            "   void kernel simple_add(global const int* A, global const int* B, global int* C){       "
            "       C[get_global_id(0)]=A[get_global_id(0)]+B[get_global_id(0)];                 "
            "   }                                                                               ";
    sources.push_back({kernel_code.c_str(),kernel_code.length()});
 
    cl::Program program(context,sources);
    if(program.build({default_device})!=CL_SUCCESS){
        std::cout<<" Error building: "<<program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device)<<"\n";
        exit(1);
    }
 
    cl::Buffer buffer_A(context,CL_MEM_READ_WRITE,sizeof(int)*10);
    cl::Buffer buffer_B(context,CL_MEM_READ_WRITE,sizeof(int)*10);
    cl::Buffer buffer_C(context,CL_MEM_READ_WRITE,sizeof(int)*10);
 
    int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int B[] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0};
 
    cl::CommandQueue queue(context,default_device);
 
    queue.enqueueWriteBuffer(buffer_A,CL_TRUE,0,sizeof(int)*10,A);
    queue.enqueueWriteBuffer(buffer_B,CL_TRUE,0,sizeof(int)*10,B);
 
 
    cl::make_kernel<cl::Buffer, cl::Buffer, cl::Buffer> simple_add(cl::Kernel(program, "simple_add"));
    cl::EnqueueArgs eargs(queue, cl::NullRange, cl::NDRange(10), cl::NullRange);
    simple_add(eargs, buffer_A, buffer_B, buffer_C).wait();
 
    int C[10];
 
    queue.enqueueReadBuffer(buffer_C,CL_TRUE,0,sizeof(int)*10,C);
 
    std::cout<<" result: \n";
    for(int i=0;i<10;i++){
        std::cout<<C[i]<<" ";
    }
 
    return 0;
}
Программа выводит:
Нажмите на изображение для увеличения
Название: Снимок3.PNG
Просмотров: 46
Размер:	40.9 Кб
ID:	5493

Значит всё работает корректно.
Размещено в Без категории
Просмотров 159 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru