NVIDIA & CUDA

Обмен опытом по установке Линукс на разные аппаратные конфигурации

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 06 ноя 2011, 17:28

Но меня больше всего (или "единственно"? ;-) ) интересуют реализации быстрых алгоритмов цифровой обработки сигналов: быстрые Фурье-преобразования, корреляции-свёртки на их основе, ... возможно, авторегрессионные фильтры (если это возможно).
Вот только теперь к этому можно подступиться :
Olej писал(а): Вот здесь: http://developer.nvidia.com/gpu-accelerated-libraries - обзор целевых библиотек CUDA, в частности (что меня главным образом и интересует) библиотека CUDA Fast Fourier Transform library (cuFFT).
Здесь на неё пример использования (в SDK его нет): http://developer.nvidia.com/cuda-librar ... impleCUFFT
Здесь я написал - ошибку. :-(

1. примеры simpleCUFFT и simpleCUBLAS (линейная алгебра, матрицы) есть в составе SDK но находятся совсем в другом подкаталоге от остальных примеров:

Код: Выделить всё

[olej@nvidia release]$ pwd
/home/olej/NVIDIA_GPU_Computing_SDK/CUDALibraries/bin/linux/release
[olej@nvidia release]$ ls si*
simpleCUBLAS  simpleCUFFT
2. старые примеры (приведенные в ссылке) уже не собираются в новой CUDA инсталляции - это "фирменный стиль" NVIDIA: неаккуратность... а вот из SDK всё ОК:

Код: Выделить всё

[olej@nvidia simpleCUFFT]$ pwd
/home/olej/NVIDIA_GPU_Computing_SDK/CUDALibraries/src/simpleCUFFT
[olej@nvidia simpleCUFFT]$ make
[olej@nvidia simpleCUBLAS]$ pwd
/home/olej/NVIDIA_GPU_Computing_SDK/CUDALibraries/src/simpleCUBLAS
[olej@nvidia simpleCUBLAS]$ make

Код: Выделить всё

[olej@nvidia release]$ ./simpleCUFFT
[simpleCUFFT] starting...
[simpleCUFFT] is starting...
Transforming signal cufftExecC2C
Launching ComplexPointwiseMulAndScale<<< >>>
Transforming signal back cufftExecC2C
[simpleCUFFT] test results...
PASSED

Код: Выделить всё

[olej@nvidia release]$ ./simpleCUBLAS
[simpleCUBLAS] starting...
simpleCUBLAS test running..
[simpleCUBLAS] test results...
PASSED
С этого уже можно стартовать!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 06 ноя 2011, 23:30

http://www.linux.org.ru/forum/talks/6241532
Ядро на GPU
Исследователи из университета Юты представили проект KGPU, в рамках которого разработан способ перенести исполнение частей кода ядра Linux на графический процессор, поддерживающий технологию NVIDIA CUDA. Код KGPU распространяется в рамках лицензии GPLv2.

NSK или Non-Stop Kernel представляет собой код, исполняемый на GPU и способный загружать дополнительные модули (сервисы в терминологии KGPU), каждый из которых может выполнять определенный вид работы по обработке данных. NSK принимает запросы, загружает сервис (для повышения производительности он может быть загружен заранее) и отдает ему данные, ожидая результатов исполнения, которые затем будут переданы обратно по цепочке модулю ядра. Для передачи данных между компонентами системы используется коммуникационный протокол, реализованный с помощью быстрой pinned-памяти, выделяемой драйвером CUDA.

Такая архитектура позволяет перенести фрагменты кода ядра на графический процессор просто переписав их в виде NSK-сервисов. В подтверждение авторы KGPU создали реализацию алгоритма AES, которая позволила поднять скорость шифрования файловой системы eCryptfs в 6 раз.
Сам проект KGPU: What is It? и его GIT репозитарий кодов (скачивать там пока вряд ли что можно, а посмотреть любопытно ;-) ).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 07 ноя 2011, 18:23

Olej писал(а): Поиском нашёл ещё интересный (!) ресурс русскоязычный по CUDA (а если точнее, то не только CUDA, но и AMD ATI и OpenCL, т.е. использование сверхпроизводительных GPU для вычислений вообще):
http://www.gpgpu.ru/node/71
GPGPU.ru
Использование видеокарт для вычислений

Там же форум:
http://www.gpgpu.ru/forum
Итак, собираю себе ссылки источников по CUDA: а). обсуждения программистов, которые делятся опытом + б). русскоязычные (пока) + в). досаточно свежих (не позже 2-й половины 2010).

2. (1-я была ссылка цитируемая выше ;-) )
http://www.bog.pp.ru/work/cuda.html
Bog BOS: Использование модели массового параллелизма CUDA для разработки программ
Последнее изменение файла: 2010.09.01
3. http://steps3d.narod.ru/tutorials/cuda-tutorial.html
Основы CUDA

4. http://www.prog.org.ru/index.php?topic=19243.msg129897
Подключение библиотеки собранной nvcc
Август 27, 2011
5. http://3.14.by/ru/read/cuda-crash-course-vvedenie
CUDA: С места в карьер
(та же статья: http://habrahabr.ru/blogs/CUDA/50241/)
здесь же обстоятельный форум:
http://3.14.by/forum/viewforum.php?f=6
BarsWF, криптография, безопасность, GPGPU и суперкомпьютеры

Пока это и всё, что я нарыл :-?

P.S. Вот ещё такой обзор нашёлся, не самый свежий...
http://www.ray-tracing.ru/articles199.html
Технология CUDA
Cтатья опубликована в журнале "Компьютерная Графика и Мультимедиа" http://cgm.computergraphics.ru/ (http://cgm.computergraphics.ru/issues/issue16/cuda)
но именно как обзор для начала - читается неплохо (лучше, чем те хвалёные книжки, и наша и зарубежные, с которых я начал тему :lol: ).

P.P.S.
http://plmpedia.ru/wiki/CUDA
Compute Unified Device Architecture — технология GPGPU и соответсвующий ей API, позволяющие реализовывать на языке программирования С алгоритмы, выполнимые на графических процессорах видеокарт NVIDIA.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 08 ноя 2011, 17:12

Что хуже всего в состоянии дел с CUDA, так это то, что:
- ни в одном из "крутых" источников (что в мэнюэлах с NVIDIA, что в книжках названных и достаточно бездарных) нет толком и 2-х слов о том, а). как собрать самое простенькое приложение CUDA, опции команд, что на что влияет; б). перечисления частей, входящих в CUDA tools и что для чего нужно; в). т.е. технологического описания "из чего это складывается и как это всё крутится"...
- а форумы, обсуждения etc. CUDA (в большинстве названных выше) использующие Windows описывают это ("с истошным криком идиота" :lol: , как это назвал один мэтр рок-н-рола ;-) ) так: "... после установки запускаю Visual C 2010, нажимаю кнопку ... и всё получилось!" ... или: "... и ничего не получилось!" :lol:
Olej писал(а): Итак, собираю себе ссылки источников по CUDA: а). обсуждения программистов, которые делятся опытом + б). русскоязычные (пока) + в). досаточно свежих (не позже 2-й половины 2010).

2. (1-я была ссылка цитируемая выше ;-) )
http://www.bog.pp.ru/work/cuda.html
Bog BOS: Использование модели массового параллелизма CUDA для разработки программ
Последнее изменение файла: 2010.09.01
Вот здесь хоть кой-что:
Основной программой среды разработки является компилятор nvcc, который управляет всей цепочкой преобразований. Исходная программа может быть на языке C (.c), C++ (.cc, .cxx, .cpp), расширении языка C (.cu; .cup для препроцессированных файлов). В начале, стандартный cpp осуществляет макроподстановки, затем утилита cudafe в 2 прохода разделяет общий код программы, написанный на расширении языка C (.cu; .cup для препроцессированных файлов), на части, предназначенные к исполнению на хосте (.c, компилируется обычным gcc в режиме C++ в .o), и части, предназначенные к исполнению на GPU (.gpu, C). Простенький развёрнутый crypt-des (25 итераций по 16 раундов по 8 S-блоков по 10 переменных) обрабатывался 15 минут. Последние преобразуются nvopencc в код виртуальной машины (.ptx). nvopencc имеет ограничение по умолчанию - не более 26000 регистров каждого типа (а их препроцессор генерирует бесжалостно). После снятия ограничения на оптимизацию потребил (в фазе be) 6GB памяти (реально используются!) и 90 минут CPU, после чего всё равно упал. Код виртуальной машины компилируется оптимизирующим ассемблером ptxas (распределение виртуальных регистров в реальные, имеет свои ограничения) в двоичный блоб (.cubin), который утилита fatbin в сочетании с кодовым именем устройства либо размещает во внешний репозитарий (.fatbin), либо добавляет к коду хостовой части (.cu.c), из которого стандартый компилятор gcc (версии от 3.4 до 4.2; кстати, в Fedora gcc 4.3!) компилирует и собирает программу.

К хостовой программе в дополнение к остальным библиотекам (.a, .so) присоединяется библиотека функций (высокого уровня cudart и/или низкого уровня cuda; cudart использует cuda; приложение может использовать только одну из них), обеспечивающих управление и доступ к GPU со стороны хоста. К программе, выполняемой на GPU, присоединяется библиотека функций, специфических для устройства. Имеется также общая часть - подмножество библиотеки C, реализованное как на хосте, так и на GPU. nvcc генерирует код, предназначенный для работы с cudart, при этом инициализация, управление контекстами и модулями скрыты от программиста.

С помощью макро __CUDACC__ можно определить, компилируется ли программа с помощью nvcc.

Несколько хостовых потоков могут запускать ядра на одном GPU (ресурсы одного потока недоступны другому). Один хостовый поток не может использовать несколько GPU.
Это всё скорее "заметки на полях" от человека более-менее (скорее менее ;-) ) повозившимся с CUDA, но это и есть самое вкусное ;-) :
Хостовые подпрограммы компилируются в режиме C++, чтобы компилировать в режиме C требуется указать ключ "--host-compilation=c".
Расширения языка C:

квалификатор типа функции, указывающий где должна выполняться функция и откуда её можно вызывать
__device__ (функция выполняется на GPU, вызывается из GPU; рекурсия запрещена; статические переменные запрещены; фиксированное число параметров; указатель на функцию недопустим)
__global__ (это ядро и должно вызываться специальной директивой запуска ядра; вызов является асинхронным; параметры передаются через разделяемую память (до 256 байт); функция выполняется на GPU, вызывается из хоста; рекурсия запрещена; статические переменные запрещены; фиксированное число параметров; тип функции только void)
__host__ (функция выполняется на хосте, вызывается из хоста, по умолчанию)
__device__ __host__ (код функции компилируется и для хоста, и для GPU)

квалификатор типа переменной, указывающий в памяти какого типа её размещать (можно использовать только в функциях, исполняемых на GPU):
__device__ (переменная размещается в глобальной памяти GPU; существует пока существует приложение; доступна из любого потока на GPU и из хоста через библиотеку)
__constant__ (переменная размещается в памяти констант GPU; существует пока существует приложение; доступна из любого потока на GPU и из хоста через библиотеку)
__shared__ (переменная размещается в разделяемой памяти блока, существует пока существует блок; доступна из любого потока блока; запись становится гарантированно видима остальным потокам блока только после вызова __syncthreads() )

внутренние переменные исполняемой на GPU функции без квалификатора обычно хранятся в регистре, но если оптимизатор из ptxas посчитает, что их слишком много (более 124), то в локальной нерегистровой памяти MP (по времени доступа неотличима от глобальной); узнать, что он туда перенёс, невозможно (в .ptx всё в регистрах, а в блоб не заглянешь); массивы с достпом по неконстантному индексу тоже попадают в локальную память

директива запуска ядра: вызов из хоста ядра (функции с квалификатором __global__) оформляется специальным образом - между именем функции и списком параметров в тройных угловых скобках ( "<<<...>>>" ) записываются через запятую размерность и размер решётки (тип dim3), размерность и размер блока (тип dim3), количество дополнительной динамически выделяемой разделяемой памяти на блок (опционально), номер задачи (stream, опционально); конфигурация ядра вычисляется до вычисления параметров и передаётся через разделяемую память
встроенные переменные, доступные из функции, работающих на GPU (только чтение, указывать на встроенные переменные недопустимо):
gridDim (тип dim3) - размерность и размер решётки
blockIdx (тип uit3) - индекс блока в решётке
blockDim (тип dim3) - размерность и размер блока
threadIdx (тип uit3) - индекс потока в блоке
warpSize (тип int) - размер порции

__noinline__ (по умолчанию, все функции, работающие на устройстве, компилируются, как встроенные (inline); nvcc может проигнорировать это указание, если список параметров слишком велик или при передаче ссылки)

компилятор по умолчанию развёртывает маленькие циклы с известным числом шагов; непосредственно перед циклом можно явно указать, что делать с этим циклом директивой "#pragma unroll [число-шагов]"

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 09 ноя 2011, 01:28

Olej писал(а): Это всё скорее "заметки на полях" от человека более-менее (скорее менее ;-) ) повозившимся с CUDA, но это и есть самое вкусное ;-) :
... и как во всех источниках информации по CUDA (что фирменных от NVIDIA, что в публикациях) - информация устаревает раньше, чем она публикуется: отдельные вещи на-дух не соответствуют действительности, устарели, остались в предыдущих версиях:
Ключ компилятора "-deviceemu" позволяет компилировать и запускать программу на CPU, что позволяет отлаживать её с помощью обычного отладчика. Макрос __DEVICE_EMULATION__ позволяет осуществлять условную компиляцию отладочной печати и т.п.. При эмуляции на каждый предполагаемый поток GPU создаётся поток CPU, а каждый поток требует 256KB стека!

Эмуляция - это не полная симуляция, например, не могут быть найдены ошибки синхронизации, точности вычислений, ошибки адресации.
Управление генерацией хостового кода:
--device-emulation | -deviceemu (генерировать код для эмулятора GPGPU)
...
Проверяем:

Код: Выделить всё

[olej@nvidia second]$ nvcc second.cu -deviceemu -o second
nvcc warning : option 'device-emulation' has been deprecated and is ignored
Когда-то оно, возможно, так и было :twisted:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 13 ноя 2011, 23:57

По поводу инструментов для компиляции и выполнения кода CUDA на x86 CPU (см. пред сообщение: то, что не удалось там ;-) ) - совершенно свежий обзор в журнале Dr.Dobb's:
http://drdobbs.com/high-performance-computing/231500166
Running CUDA Code Natively on x86 Processors
By Rob Farber, August 25, 2011
Здесь предлагается совершенно другой, альтернативный (относительно nvcc NVIDIA) компилятор PGI
A new compiler from PGI makes it possible to use the same CUDA code on x86 processors, Nvidia chips, or both
- который предлагается скачать с The Portland Group, и описывается детальная инструкция по установке и запуску в работу.
Утверждается, что эти tools работают независимо от установки CUDA SDK и не конфликтуют в работе.

P.S.
- но прежде вас замордуют регистрациями и паролями :twisted: , а затем позволят выгрузить 522Mb (что там может быть?);
- потом вас замордуют генерацией триального ключа по MAC-адресу 1-го сетевого интерфейса вашего компьютера... (это что? рудименты года эдак ... 1986-го :-o :lol: )
- ну а дальше, наверное :lol: , это можно попробовать в работе...
... но уже не хочется :lol:
Последний раз редактировалось Olej 14 ноя 2011, 02:19, всего редактировалось 3 раза.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 14 ноя 2011, 01:19

Olej писал(а):По поводу инструментов для компиляции и выполнения кода CUDA на x86 CPU (см. пред сообщение: то, что не удалось там ;-) ) - совершенно свежий обзор в журнале Dr.Dobb's:
http://drdobbs.com/high-performance-computing/231500166
Running CUDA Code Natively on x86 Processors
By Rob Farber, August 25, 2011
Там же (Dr.Dobb's) целый цикл свежих (самая 1-я статья от 2008г., в отличие от самой NVIDIA) от того же автора
Rob Farber is a visiting HPC expert at Irish Center for High-End Computing (ICHEC), supported by Science Foundation Ireland.

В рубрике журнала HIGH PERFORMANCE COMPUTING (оно стоит того, чтобы все перечислить):

CUDA, Supercomputing for the Masses: Part 1
CUDA, Supercomputing for the Masses: Part 2
CUDA, Supercomputing for the Masses: Part 3
CUDA, Supercomputing for the Masses: Part 4
CUDA, Supercomputing for the Masses: Part 5
CUDA, Supercomputing for the Masses: Part 6
CUDA, Supercomputing for the Masses: Part 7
CUDA, Supercomputing for the Masses: Part 8
CUDA, Supercomputing for the Masses: Part 9
CUDA, Supercomputing for the Masses: Part 10
CUDA, Supercomputing for the Masses: Part 11
CUDA, Supercomputing for the Masses: Part 12
CUDA, Supercomputing for the Masses: Part 13
CUDA, Supercomputing for the Masses: Part 14
CUDA, Supercomputing for the Masses: Part 15
CUDA, Supercomputing for the Masses: Part 16
CUDA, Supercomputing for the Masses: Part 17
CUDA, Supercomputing for the Masses: Part 18
CUDA, Supercomputing for the Masses: Part 19
CUDA, Supercomputing for the Masses: Part 20
CUDA, Supercomputing for the Masses: Part 21
Как мне показалось, это совершенно уникальная подборка информации, не уступающая самому сайту NVIDIA.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 14 ноя 2011, 01:47

Olej писал(а): В рубрике журнала HIGH PERFORMANCE COMPUTING (оно стоит того, чтобы все перечислить):

CUDA, Supercomputing for the Masses: Part 1
В этой части (1-й) приводится самый простейший пример CUDA программы (можно попробовать - проще не бывает, вон он в присоединённом архиве)...
Но самое любопытное здесь, утверждение:
1. Create or edit the CUDA program with your favorite editor. Note: CUDA C language programs have the suffix ".cu".
2. Compile the program with nvcc to create the executable. (NVIDIA provides sane makefiles with the examples. Generally all you need to type is "make" to build for a CUDA device or "make emu=1" to build for the emulator.)
3. Run the executable.
(меня заинтересовало относительно emu=1 !).

Берём произвольный пример из CUDA SDK:

Код: Выделить всё

[olej@nvidia Interval]$ pwd
/home/olej/NVIDIA_GPU_Computing_SDK/C/src/Interval
[olej@nvidia Interval]$ make emu=1
nvcc warning : option 'device-emulation' has been deprecated and is ignored
...
/usr/bin/ld: cannot find -lcudartemu
/usr/bin/ld: cannot find -lcudartemu
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [../../bin/linux/emurelease/Interval] Ошибка 1
- опять то же предупреждение о deprecated ... или отсутствие варианта runtime библиотек CUDA: libcudartemu.so ?

Код: Выделить всё

[olej@nvidia C]$ ldconfig -p | grep cuda*
    libnpp.so.4 (libc6) => /usr/local/cuda/lib/libnpp.so.4
    libnpp.so (libc6) => /usr/local/cuda/lib/libnpp.so
    libicudata.so.44 (libc6) => /usr/lib/libicudata.so.44
    libcusparse.so.4 (libc6) => /usr/local/cuda/lib/libcusparse.so.4
    libcusparse.so (libc6) => /usr/local/cuda/lib/libcusparse.so
    libcurand.so.4 (libc6) => /usr/local/cuda/lib/libcurand.so.4
    libcurand.so (libc6) => /usr/local/cuda/lib/libcurand.so
    libcufft.so.4 (libc6) => /usr/local/cuda/lib/libcufft.so.4
    libcufft.so (libc6) => /usr/local/cuda/lib/libcufft.so
    libcudart.so.4 (libc6) => /usr/local/cuda/lib/libcudart.so.4
    libcudart.so (libc6) => /usr/local/cuda/lib/libcudart.so
    libcuda.so.1 (libc6) => /usr/lib/libcuda.so.1
    libcuda.so (libc6) => /usr/lib/libcuda.so
    libcublas.so.4 (libc6) => /usr/local/cuda/lib/libcublas.so.4
    libcublas.so (libc6) => /usr/local/cuda/lib/libcublas.so
Вложения
dd1.tgz
(4.56 КБ) 628 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 16 ноя 2011, 04:02

Olej писал(а): В рубрике журнала HIGH PERFORMANCE COMPUTING (оно стоит того, чтобы все перечислить):

CUDA, Supercomputing for the Masses: Part 1
CUDA, Supercomputing for the Masses: Part 2
CUDA, Supercomputing for the Masses: Part 3
CUDA, Supercomputing for the Masses: Part 4
CUDA, Supercomputing for the Masses: Part 5
CUDA, Supercomputing for the Masses: Part 6
CUDA, Supercomputing for the Masses: Part 7
CUDA, Supercomputing for the Masses: Part 8
CUDA, Supercomputing for the Masses: Part 9
CUDA, Supercomputing for the Masses: Part 10
CUDA, Supercomputing for the Masses: Part 11
CUDA, Supercomputing for the Masses: Part 12
CUDA, Supercomputing for the Masses: Part 13
CUDA, Supercomputing for the Masses: Part 14
CUDA, Supercomputing for the Masses: Part 15
CUDA, Supercomputing for the Masses: Part 16
CUDA, Supercomputing for the Masses: Part 17
CUDA, Supercomputing for the Masses: Part 18
CUDA, Supercomputing for the Masses: Part 19
CUDA, Supercomputing for the Masses: Part 20
CUDA, Supercomputing for the Masses: Part 21
Как мне показалось, это совершенно уникальная подборка информации, не уступающая самому сайту NVIDIA.
Там вы найдёте великое множество законченных примеров кода (работающих приложений) CUDA, ... особенно в той части, которая касается обсчитывания графических текстур или отрисовки используя OpenGL. Меня это мало интересует ...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: NVIDIA & CUDA

Непрочитанное сообщение Olej » 03 дек 2011, 23:06

Olej писал(а): По CUDA есть такая (основная?) книжка:
Только-что вышла ещё новая книга по CUDA: Rob Farber , CUDA Application Design and Development.

Интересно... но я пока не знаю, откуда её можно скачать. :cry: ;-)

Ответить

Вернуться в «Железо для Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей