Загрузка...
Linux
Новости, статьи, обсуждения, - все что связано с GNU Linux, FreeBSD, OpenBSD, Sun Solaris, Mac OS X и другими системами. Если вы интересуетесь данной темой - добро пожаловать в сообщество.
     

CUDA в Qt проекте

07.03.11, 18:57
Автор ggg

Недавно возникла необходимость скрестить две технологии CUDA и Qt, а именно - ускорить работу программы за счет переноса некоторых математических вычислений с CPU на GPU. Как выглядит "скрещивание"?

В проект добавляется .cu файл, в котором объявлено ядро и функция запуска данного ядра на GPU. Данный файл компилируется с помощью nvcc и линкуется с основной программой, что позволяет использовать функцию запуска ядра в коде Qt проекта. Реализовать такое поведение можно с помощью фишки, которая называется QMAKE_EXTRA_COMPILERS - средства, которое позволяет обрабатывать заданные файлы некоторым образом.

Добавим в файл проекта следующие строки:

 

CUDASOURCES = gpu_processor.cu
LIBS += -L/usr/local/cuda/lib64 -lcudart

cu.output = ${QMAKE_FILE_BASE}.o
cu.commands = /usr/local/cuda/bin/nvcc -c ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
cu.input = CUDASOURCES
cu.CONFIG += no_link
cu.variable_out = OBJECTS

QMAKE_EXTRA_COMPILERS += cu

 

.cu-файлы, которые нужно обработать с помощью nvcc добавляем в список CUDASOURCES. Вот и все. По-прежнему достаточно остро стоит вопрос отладки CUDA + Qt приложений, но до этого руки еще не дошли.

P.s. если вы решили скрестить CUDA и Qt в Windows - используйте Visual Studio и компилятор от Microsoft либо устанавливайте Ubuntu. Использование MinGW и QtCreator может привести к существенным проблемам при попытке добавить CUDA в проект, решение которых выходит далеко за рамки данной статьи.

ключевые слова

Комментарии

аноним 21 марта 2011, 23:47
0

большое спасибо за пост, буду ждать дальнейших прорівов в єтой области)

могу еще несколько статей написать по этой теме, главное чтобы это было кому-то интересно :)

очень интересно, был бы просто оооооооооооооооочень признателен.
пишу диплом по CUDA, поэтому просто огромная необходимость в нормально настроенном под куду QT…

что именно интересует?

  • выбор IDE
  • скрипты для компиляции
  • как сделать CUDA функцию в рамках класса с поддеркой Q_OBJECT
  • что-то еще
    ?

если можно то 3 вариант пожалуйста!))))) Очень нужно визов функций Cuda спорягать з класами, как ето сделать?

сделайте cuda-функцию в отдельном файле, а в классе просто вызывайте ее и все, это как printf

аноним 1 июня 2011, 17:03
0

А можно пример рабочего проекта? Типа hello world. А то вроде все правильно сделал, а компилятор ругается на модификатор global: expected constructor, destructor, or type conversion before ‘void’.

описываемый вами симптом – признак того, что вы поместили cuda-функции не в cu-файл или же неправильно настроили сборку cu-файлов, т.е. сейчас у вас то, что должно обрабатываться nvcc обрабатывает g++

аноним 1 июня 2011, 17:51
0

Расширение файла cu. Я тоже думаю что дело в неправильной настройке сборки. Только где именно ошибся не знаю. Я заметил что файл .o создается. Вот консоль сборки:
/usr/local/cuda/bin/nvcc -c ../cuda_qt/kernel.cu -o kernel.o

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../cuda_qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../cuda_qt -I. -o main.o ../cuda_qt/main.cpp

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../cuda_qt -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I../cuda_qt -I. -o mainwindow.o ../cuda_qt/mainwindow.cpp

In file included from ../cuda_qt/mainwindow.cpp:3:
../cuda_qt/kernel.cu:1: error: expected initializer before ‘void’
То есть сначала nvcc обрабатывает kernel.cu, затем g++ обрабатывает main.cpp и mainwindow.cpp, но в mainwindow.cpp включен kernel.cu и g++ начинает обрабатывать его. Как этого избежать?

очень просто, не подключать в файле mainwindow.cpp файл kernel.cu: сделайте доп. функцию в kernel.cu которая будет вызывать ядро и вынесите ее определение в отдельный .h файл и в mainwindow.cpp подключайте этот .h файл

если не понятно – пишите – объясню подробнее

аноним 2 июня 2011, 14:02
0

Теперь все компилируется, ехешник создается, но не запускается. Пишет:
error while loading shared libraries: libcudart.so.3: cannot open shared object file: No such file or directory
Из командной строки запускал. Написал сначала:
export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH
А потом
./cuda_qt
И заработало. Причем даже результаты правильные.
Хотелось бы настроить так чтобы не приходилось через командную строку запускать.
В файле pro:
CUDASOURCES = kernel.cu
LIBS += -L/usr/local/cuda/lib -lcudart
cu.output = ${QMAKE_FILE_BASE}.o
cu.commands = /usr/local/cuda/bin/nvcc -c ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
cu.input = CUDASOURCES
cu.CONFIG += no_link
cu.variable_out = OBJECTS
QMAKE_EXTRA_COMPILERS += cu

все из-за того, что QtCreator (или что там) на находит либу. Можно пойти следующими путями:

  • прописать LD_LIBRARY_PATH в .bashrc
  • прописать доп. пути в QtCreator-е
  • сделать символьную ссылку в /usr/lib на файл из /usr/local/cuda/lib
аноним 4 июня 2011, 23:10
0

Спасибо. Ваши советы помогли. Только вот если я на другом компе захочу программу запустить мне тоже придется путь прописывать? Я скопировал libcudart.so.3 в каталог программы, но он все равно не находится. Можно ли как нибудь сделать чтобы библиотеки искались в каталоге программы? Или deb пакет делать придется? Или есть третий вариант?

можно сделать shell-скрипт который будет прописывать необходимые пути и запускать программу. Добавьте в LD_LIBRARY_PATH текущий каталог (т.е. как-то так: ./) может получится
но вообще это неправильный путь подкидывать cuda библиотеки вместе с программой, правильным будет распространять программу в deb-пакете, который в зависимостях будет тянуть CUDA.

Всем привет, хорошая статья

Что-то не очень работает у меня такой способ… Можете подсказать, что я делаю не так?
Создал проект (использую qt-creator)
Вписал туда эти строчки (с небольшими изменениями, cuda установлено в другом месте):

QT += core gui

TARGET = qtcudaproject
CONFIG += console
TEMPLATE = app

INCLUDEPATH += ‘/opt/cuda/include’
LIBS += -L/opt/cuda/lib -lcudart

SOURCES += main.cpp\
mainwindow.cpp \
cube.cpp \
gpu_processor.cu

HEADERS += mainwindow.h \
cube.h

FORMS += mainwindow.ui

CUDASOURCES = gpu_processor.cu

cu.output = ${QMAKE_FILE_BASE}.o
cu.commands = /opt/cuda/bin/nvcc -c ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
cu.input = CUDASOURCES
cu.CONFIG += no_link
cu.variable_out = OBJECTS

QMAKE_EXTRA_COMPILERS += cu

Файл, разумеется, создал.
Если писать qmake, а потом make (или компилировать средствами qt-creator, что тоже самое), то он всё равно вместо nvcc вызывает gcc для этого файла

gcc -c -pipe -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/opt/cuda/include -I. -I. -o gpu_processor.o gpu_processor.cu
gcc: gpu_processor.cu: входные файлы компоновки не использованы, поскольку компоновка не выполнялась
….бла-бла-бла…..
g++: gpu_processor.o: Нет такого файла или каталога

Что я неправильно сделал?

Кажется, я понял свою ошибку… файл gpu_processor.cu надо было просто убрать из SOURCES :)
вроде так, да?..

cu-файлы надо добавлять в CUDA_SOURCES, естественно что в обычные SOURCES добавлять cu-файлы не надо.

Всё равно не получается. На этот раз написал готовый код, он компилится без проблем… Запускаю – ошибка сегментации. отладчиком проследил, что возникает она там, где попытка запустить функцию, которая и запускает ядро.
Выложить пример тяжело (он довольно большой), попробую сделать попроще, и скомпилю, попробую запустить…

а если без Qt – код работает?

Привет. А не могли бы вы описать весь процесс настройки qtcreator’а для работы с CUDA? Уже третью неделю мучаюсь и никакого результата – в директории debug не создалось никаких выходных файлов. Может быть, имеет смысл списаться по скайпу?

сама CUDA нормально настроена? Какая версия? Примеры компилируются?

CUDA настроена нормально, написанный в блокноте код (пример с поэлементным сложением двух массивов) нормально компилится в командной строке. Проблема в том, как это все интегрировать в проект, написанный на C++ с использованием Qt в QtCreator.

Теперь получаю ошибки вида:
(.text[___isnan]+0x15):-1: ошибка: undefined reference to `_allshl’
Гугл говорит, что не хватает cudart.lib или cuda.lib, но я лбе библиотеки подключил. Вот содержимое .pro-файла:
QT += core
QT -= gui

TARGET = output
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp
CUDASOURCES = module.cu

LIBS += “c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\lib\Win32\cuda.lib” \
“c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA/v4.1\lib\Win32\cudart.lib”
INCLUDEPATH += “C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\include”

cu.output = ${QMAKE_FILE_BASE}.o
cu.commands = nvcc -c ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
cu.input = CUDASOURCES
cu.CONFIG += no_link
cu.variable_out = OBJECTS

QMAKE_EXTRA_COMPILERS += cu

Помогите, плиз. Ничего не могу с этим поделать(((

а что если указать LIBS как-то так:
LIBS += -L"c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v4.1/lib/Win32" -lcuda -lcudart
ну и вопрос, а что если глянуть в примерах CUDA, какие include-ы и lib-ы прописаны там?

Если писать с -lcuda и -lcudart, то выдает ошибку “:-1: ошибка: c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\lib\Win32: No such file: Permission denied” – то есть ему напрямую пути к конкретным файлам указывать надо.
Все примеры для винды, которые я находил, описывают только порядок настройки MSVS. А вообще обычно подключают cudart (как выяснилось, использовать вместе cuda и cudart нельзя, т.к. CUDA Driver API и CUDA Runtime API нельзя смешивать).

Могу предложить FindCUDA.cmake.
Даже первого чтения документации на cmake достаточно для понимания превосходства в сравнении с qmake.
Qt Creator прекрасно открывает CMakeFile.txt.
Зависимости проектов автоматически добавляются в индексацию, что закрывает проблему автодополнения.

так проблема разрешилась или нет?

Нет, проблема не решилась. У меня закрадывается подозрение, что CUDA под виндой работает корректно только с компилятором cl.exe от VisualStudio, и это печально. Сделал все то же самое, что и в qt-проекте, через консоль и cl.exe – и все заработало, а с mingw – нет. Наверное, придется поставить Ubuntu.

я помню в Windows можно настроить работу Qt с студийными компилятором, такое не подойдет?

Да, это было бы круто. Можешь сказать, как это сделать?

вот инфа насчет mingw и CUDA http://agapii.ucoz.ru/publ/cuda_i_kriptografija/ostalnoe/cuda_i_qtmingw_pod_win/4-1-0-8
говорят что можно настроить компиляцию, но работать будет только Driver API

а вот тред http://www.qtcentre.org/threads/29353-how-to-set-QT-Creator-to-use-MSVC-compiler-instead-of-mingw по поводу использования MS-компилятора в QtCreator

ну или можно использовать Qt прям в студии, без QtCreator-а, вот официальный плагин http://qt.nokia.com/downloads/visual-studio-add-in

Спасибо большое, но все эти форумы уже читал, и они не помогли. А студию использовать не хочется. Попробую вариант с ubuntu. Если комп не взорвется, напишу, что из этого получилось:)

Могу предложить ещё две опции.
Можно попробывать “Object file converter” http://www.agner.org/optimize/ для того, чтобы сконвертировать в нужный формат либы.
Можно использовать питон для связывания различного функционала.
Имеется в виду PyQt (pyside) + pycuda. Вычислительное ядро при этом производительность терять не будет. Проблемы прокидывания OpenGL контекстов у меня не было для случая питона.
Немного наркоманский второй вариант идельно подходит для прототайпинга.

> А студию использовать не хочется

почему такая ненависть к студии раз уж все равно на винде?

Да это не ненависть, просто QtCreator понравился. Хочется изучать что-то новое.

по-моему QtCreator, так же как и студия – это всего лишь инструмент для изучения Qt и CUDA, так что по большому счету все равно какая IDE, главное чтобы код компилился и библиотеки линковались с минимальными затратами

Prifiz, если будут вопросы по установке убунты и настройке CUDA в Linux – отписывайся тут, поможем тебе чем сможем, хотя там вроде все тривиально

Спасибо, но после установки дров NVidia слетела Unity. Было откровенно смешно))) Поставил Debian, дрова и cuda toolkit встали нормально. Как приду с работы, установлю QtSDK и проверю интеграцию.

как так? что значит слетела Unity? У меня вроде ничего не слетало.

ЕЕЕЕЕЕЕЕ!!!!!!!!!!!! ААААААААААААА!!!!!!!!!!!!!! СВЕРШИЛОСЬ!!!!! НАКОНЕЦ-ТО!!!!
О-НО-СКО-МПИ-ЛИ-ЛОСЬ!!!!!!!
Огромное спасибо всем за помощь!!!! Теперь наконец-то можно писать диплом и готовиться к конференциям.
Для истории: помог кусок .pro-файла, приведенный в самом начале этой статьи. В винде, видимо, нормально скрестить CUDA и QtCreator не судьба, т.к. все равно остается зависимость от студии.

поздравляю =)

Попробовал вышеприведённый способ, добавил в про-файл следующие строчки:

cu.input = addv.cu
cu.output = addv.ptx
cu.commands = $(CUDA_BIN_PATH)/nvcc —ptx -c ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
cu.CONFIG += no_link
cu.variable_out = OBJECTS
QMAKE_EXTRA_COMPILERS += cu

При сборке в консоли всё выглядит как будто никакого вызова nvcc нет, и,соответственно файл addv.ptx не создаётся((.
Попробовал в commands прописать просто вывод чего-нить в консоль:

cu.input = addv.cu
cu.output = addv.ptx
cu.commands = @echo *********blablabla***********
QMAKE_EXTRA_COMPILERS += cu

И опять в консоли ничего похожего на *********blablabla***********.
Может я неправ, и ничего в консоли не должно отображаться, но .cu файл не компилится, и это меня напрягает). Кто-нить сталкивался с подобной проблемой? Что не так?)

з.ы. если что, работаю в Qt creator’е под виндой + mingw

см комменты выше, там тоже была проблема с mingw, решилась переходом на Ubuntu

Что-то мне подсказывает я так и сделаю) Но всё же хочется понять, почему в винде в креаторе не работает QMAKE_EXTRA_COMPILERS?

аноним 16 марта 2012, 18:36
0

если все же разберешься почему в Windows ничего не работает – отпишись плз, но все же соглашусь с предыдущим комментатором – проще перейти на Linux и не создавать лишний геморой

Войдите, чтобы оставить комментарий