В задачах которые хорошо распараллеливаются (например решение СЛАУ) CUDA реально дает прирост производительности. Проверял на той же задаче с поездом расчет ускорений для 2 и 200 вагонов занимает одинаковое время… Только там возникли другие проблемы с реализацией, которые надо решать…

Приятно удивило наличие всего необходимого ПО в репозиториях арча. В той же винде с установкой куды и настройкой среды надо повозится
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org


Compute Unified Device Architecture, дословно – унифицированная вычислительная архитектура устройств – архитектура (совокупность программных и аппаратных средств), позволяющая производить на GPU вычисления общего назначения, при этом GPU фактически выступает в роли мощного сопроцессора.

Эта технология заинтересовала меня для применения при разработке вычислительного комплекса моделирования движения тяжелых грузовых поездов. Изначально проект развивался на базе OC Windows 7 Ultimate и MS Visual Studio 2010 в качестве средства разработки.

Однако желание избавить проект от использования проприетарного ПО (мало доступного в академической среде, и доставаемого сами знаете как…) подвигла меня на поиск путей создания бесплатной платформы разработки, благо NVidia предоставляет Toolkit и SDK безвозмездно. Кстати вышел резил-кандидат CUDA 5.0 со специализированной средой разработки, но доступный для Windows, Mac OS и популярных дистрибутивов Linux, к коим арч не совсем относится.

Тем не менее засучив рукава я приступил к настройке своего арча для работы с CUDA. И, о чудо, драйвера и тулкиты оказались доступны в официальных репозиториях арча! Радостно мяукнув приступил к…

1. Установка CUDA SDK и Toolkit

Если у Вас не установлены средства разработки на C/C++, то их надо установить

# pacman -S gcc glibc make

Ставим драйвера на видеокарту, если они у Вас ещё не установлены

# pacman -S nvidia

Затем

# pacman -S cuda-sdk cuda-toolkit

Собственно и всё, необходимый набор инструментария у вас уже имеется. Лежит все это богатство по адресу /opt/cuda-sdk/ и /opt/cuda-toolkit/. Мне лично было интересно проверить работоспособность CUDA под линуксом на моей видеокарте (GForce 580 GTX) поэтому я сначала собрал все примеры из SDK. Делаем это так

$ cd /opt/cuda-sdk/C

переходим в каталог с исходниками примеров. Собираем их командой

# make

Теперь переходим в /opt/cuda-sdk/C/bin/linux/release/ и любуемся примерами



Сразу предупреждаю, большинство примеров там чисто вычислительные без визуализации, так что не удивляйтесь если сразу не найдете именно этот - smokeParticles. Что ж, полюбовались, идем дальше

2. Выбор среды разработки. Настройка Netbeans 7.2 для работы с CUDA

Честно говоря сначала мой выбор пал на Eclipse IDE, поскольку именно в этой среде я занимался разработкой icq-клиента на Java, привык к ней основательно, да и официальная IDE, релиз коей не за горами основывается именно на эклипсе.

Однако тут меня ждало разочарование - найти толкового описания настройки Eclipse Juno для работы с CUDA я не нашел, предыдущие версии ставить не захотел, а разница в окнах настройки у разных версий эклипса очень ощутимая. Попрыгав с бубном я решил обратить свой взор к Netbeans от “кровавого” Oralce

# pacman -S netbeans

Запускаем Netbeans (Все приложения -> Разработка -> Netbeans - это в “кедах”).

Теперь необходимо настроить среду на сборку CUDA-проектов. Для их сборки модулей содержащих код работающий на GPU (файлы с расширением *.cu) используется компилятор nvcc, входящие в состав CUDA Toolkit. По сути он является оберткой над gcc - код GPU собирает сам, код CPU передает на съедение gcc.

Изначально Netbeans не настроен на работу с конкретным языком программирования, поэтому идем в пункт меню “Сервис -> Подключаемые модули -> Установленные”, в котором выбираем модуль C/C++ и жмем “Активировать”



Перезапускаем среду, идем в “Сервис -> Параметры”. В появившемся окне выбираем C/C++ и на нескольких вкладках последовательно задаем параметры.

В писке “Набор средств” жмем “Добавить”. Задаем базовый каталог - тот в котором будут хранится ваши проекты, семейство набора средств (я поставил GNU) имя набора средств CUDA (на скрине CUDA1, ибо у меня CUDA уже есть, а для иллюстрации удалять не хотелось)



Задаем пути к компилятору C/C++



Задаем дополнительные каталоги заголовочных файлов для компиляторов C и C++



Добавить расширение *.cu в список поддерживаемых расширений




В принципе всё готово для создания проектов с использованием CUDA. Однако опционально можно настроить подсветку синтаксиса в Netbeans, вернее отключить некоторые настройки “Сервис -> Параметры -> Редактор -> Выделение”. Выбираем язык “Исходные файлы на C/C++” и снимаем галочки “Выделить ошибки синтаксиса”, “Выделить неразрешенные файлы include” и “Выделить неразрешенные идентификаторы”.



Для чего это делаеть? Дело в том, что разработка для CUDA ведется не на С/С++ а на его расширении CUDA C, содержащем ключевые слова и идентификаторы не входящие в стандарт. Редактор безбожно покрывается красными волнистыми линиями подчеркивания “неправильных слов” и пестрит иконками восклицательных знаков ошибок, хотя проект отлично собирается и выполняется. Такая настройка избавит Вас от такого раздражителя, а ошибки компиляции всё равно будут подсвечиваться в исходном коде при щелчке по сообщению об ошибке в логе компиляции.

Теперь все готово для создания первого проекта. Идем в меню “Файл -> Создать проект”. В категориях выбираем C/C++, в проектах “Приложение С/С++”. Жмем “Далее”.



Мы будем создавать пустой проект, поэтому в настройках снимаем галку “Создать главный файл проекта”, задаем имя проекта hello_CUDA, выбираем набор средств “CUDA (Набор компиляторв GNU)”



Жмем готово, и видим появившееся слева дерево проекта, которое пока ничего не содержит.



Щелкаем правой клавишей по папке “Исходные файлы” и в меню выбираем “Новый -> Исходный файл на языке C++”. В появившемся окне задаем имя и расширение файла *.cu. Жмем “Готово” и переходим в редактор кода, в котором набираем такой текст

#include  <cuda.h>
#include  <stdio.h>
__host__ int main(void)
{
    printf("Hello! I can work with NVidia CUDA :)\n");   
    return 0;
}


Далее щелкаем правой кнопкой по имени проекта в дереве и в меню выбираем “Свойства”. В открывшемся окне выбираем вкладку “Собрать” и снимаем галочку “Включить проверку зависимостей”



После этого жмем F11 - собираем проект. Сообщение

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Вход в каталог `/home/maisvendoo/netbeans/hello_CUDA'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/CUDA-Linux-x86/hello_cuda
make[2]: Вход в каталог `/home/maisvendoo/netbeans/hello_CUDA'
mkdir -p build/Debug/CUDA-Linux-x86/_ext/1706347718
nvcc    -c -g -o build/Debug/CUDA-Linux-x86/_ext/1706347718/hello.o /home/maisvendoo/netbeans/hello_CUDA/hello.cu
mkdir -p dist/Debug/CUDA-Linux-x86
nvcc     -o dist/Debug/CUDA-Linux-x86/hello_cuda build/Debug/CUDA-Linux-x86/_ext/1706347718/hello.o  
make[2]: Выход из каталога `/home/maisvendoo/netbeans/hello_CUDA'
make[1]: Выход из каталога `/home/maisvendoo/netbeans/hello_CUDA'
СОБРАТЬ SUCCESSFUL (общее время: 2s)

означает что проект успешно собран. Жмем F6 для запуска.

Hello! I can work with NVidia CUDA :)
ВЫПОЛНЕНИЕ SUCCESSFUL (общее время: 45ms)

Данный код выполнялся конечно на CPU, о чем говорит директива __host__ в описании функции main(). Так что данный пример иллюстрирует лишь пригодность Netbeans в качестве IDE для разработки для NVidia CUDA. Дальнейшее впереди… :)

Удачного cud-инга! ;)
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org