|
Недавно возникла необходимость скрестить две технологии 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 в проект, решение которых выходит далеко за рамки данной статьи. Комментариибольшое спасибо за пост, буду ждать дальнейших прорівов в єтой области) могу еще несколько статей написать по этой теме, главное чтобы это было кому-то интересно :) очень интересно, был бы просто оооооооооооооооочень признателен. что именно интересует?
А можно пример рабочего проекта? Типа hello world. А то вроде все правильно сделал, а компилятор ругается на модификатор global: expected constructor, destructor, or type conversion before ‘void’. описываемый вами симптом – признак того, что вы поместили cuda-функции не в cu-файл или же неправильно настроили сборку cu-файлов, т.е. сейчас у вас то, что должно обрабатываться nvcc обрабатывает g++ Расширение файла cu. Я тоже думаю что дело в неправильной настройке сборки. Только где именно ошибся не знаю. Я заметил что файл .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: очень просто, не подключать в файле mainwindow.cpp файл kernel.cu: сделайте доп. функцию в kernel.cu которая будет вызывать ядро и вынесите ее определение в отдельный .h файл и в mainwindow.cpp подключайте этот .h файл если не понятно – пишите – объясню подробнее Теперь все компилируется, ехешник создается, но не запускается. Пишет: все из-за того, что QtCreator (или что там) на находит либу. Можно пойти следующими путями:
Спасибо. Ваши советы помогли. Только вот если я на другом компе захочу программу запустить мне тоже придется путь прописывать? Я скопировал libcudart.so.3 в каталог программы, но он все равно не находится. Можно ли как нибудь сделать чтобы библиотеки искались в каталоге программы? Или deb пакет делать придется? Или есть третий вариант? можно сделать shell-скрипт который будет прописывать необходимые пути и запускать программу. Добавьте в LD_LIBRARY_PATH текущий каталог (т.е. как-то так: ./) может получится Что-то не очень работает у меня такой способ… Можете подсказать, что я делаю не так? QT += core gui TARGET = qtcudaproject INCLUDEPATH += ‘/opt/cuda/include’ SOURCES += main.cpp\ HEADERS += mainwindow.h \ FORMS += mainwindow.ui CUDASOURCES = gpu_processor.cu cu.output = ${QMAKE_FILE_BASE}.o QMAKE_EXTRA_COMPILERS += cu Файл, разумеется, создал. 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 Что я неправильно сделал? Кажется, я понял свою ошибку… файл gpu_processor.cu надо было просто убрать из SOURCES :) cu-файлы надо добавлять в CUDA_SOURCES, естественно что в обычные SOURCES добавлять cu-файлы не надо. Всё равно не получается. На этот раз написал готовый код, он компилится без проблем… Запускаю – ошибка сегментации. отладчиком проследил, что возникает она там, где попытка запустить функцию, которая и запускает ядро. Привет. А не могли бы вы описать весь процесс настройки qtcreator’а для работы с CUDA? Уже третью неделю мучаюсь и никакого результата – в директории debug не создалось никаких выходных файлов. Может быть, имеет смысл списаться по скайпу? сама CUDA нормально настроена? Какая версия? Примеры компилируются? CUDA настроена нормально, написанный в блокноте код (пример с поэлементным сложением двух массивов) нормально компилится в командной строке. Проблема в том, как это все интегрировать в проект, написанный на C++ с использованием Qt в QtCreator. Теперь получаю ошибки вида: TARGET = output TEMPLATE = app SOURCES += main.cpp LIBS += “c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\lib\Win32\cuda.lib” \ cu.output = ${QMAKE_FILE_BASE}.o QMAKE_EXTRA_COMPILERS += cu Помогите, плиз. Ничего не могу с этим поделать((( а что если указать LIBS как-то так: Если писать с -lcuda и -lcudart, то выдает ошибку “:-1: ошибка: c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.1\lib\Win32: No such file: Permission denied” – то есть ему напрямую пути к конкретным файлам указывать надо. Могу предложить FindCUDA.cmake. Нет, проблема не решилась. У меня закрадывается подозрение, что 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 а вот тред 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. Если комп не взорвется, напишу, что из этого получилось:) Могу предложить ещё две опции. > А студию использовать не хочется почему такая ненависть к студии раз уж все равно на винде? Да это не ненависть, просто QtCreator понравился. Хочется изучать что-то новое. по-моему QtCreator, так же как и студия – это всего лишь инструмент для изучения Qt и CUDA, так что по большому счету все равно какая IDE, главное чтобы код компилился и библиотеки линковались с минимальными затратами Prifiz, если будут вопросы по установке убунты и настройке CUDA в Linux – отписывайся тут, поможем тебе чем сможем, хотя там вроде все тривиально Спасибо, но после установки дров NVidia слетела Unity. Было откровенно смешно))) Поставил Debian, дрова и cuda toolkit встали нормально. Как приду с работы, установлю QtSDK и проверю интеграцию. как так? что значит слетела Unity? У меня вроде ничего не слетало. ЕЕЕЕЕЕЕЕ!!!!!!!!!!!! ААААААААААААА!!!!!!!!!!!!!! СВЕРШИЛОСЬ!!!!! НАКОНЕЦ-ТО!!!! Попробовал вышеприведённый способ, добавил в про-файл следующие строчки: cu.input = addv.cu При сборке в консоли всё выглядит как будто никакого вызова nvcc нет, и,соответственно файл addv.ptx не создаётся((. cu.input = addv.cu И опять в консоли ничего похожего на *********blablabla***********. з.ы. если что, работаю в Qt creator’е под виндой + mingw см комменты выше, там тоже была проблема с mingw, решилась переходом на Ubuntu Что-то мне подсказывает я так и сделаю) Но всё же хочется понять, почему в винде в креаторе не работает QMAKE_EXTRA_COMPILERS? если все же разберешься почему в Windows ничего не работает – отпишись плз, но все же соглашусь с предыдущим комментатором – проще перейти на Linux и не создавать лишний геморой Часто используемые элементы Textile, которые могут вам пригодиться при написании текста:
О дополнительных элементах можно прочитать тут: http://redcloth.org/textile Оставьте свой комментарий:
|
Goganchic
Был вчера
Рубрики сообщества
Облако тегов
3d
administration
apple
bug
C++
console
deb
debian
development
dpkg
epic fail
firefox
flash
global menu
gnome
google
gtk
hardware
iphone
kernel
laptop
Linux
linux
mac os x
mp3
nautilus
Nokia N810
Qt
rails
screen
skype
ssh
tmux
tomboy
ubuntu
ubuntu 10.04
ubuntu 11.10
unity
vim
Vim
web
windows
Xen
zsh
администрирование
все-в-теме
ноутбук
программирование
разработка
установка
|
|||||||||||||||||||||||||||||||||||||||



