Как стать автором
Обновить

Вычисляем на видеокартах. Технология OpenCL. Часть 0. Краткая история GPGPU

Время на прочтение7 мин
Количество просмотров18K
Всего голосов 21: ↑21 и ↓0+21
Комментарии29

Комментарии 29

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

Действительно проморгал. Расскажете подробнее? Желательно с ссылками

Увы, маловато, чтоб говорить, что CUDA — открытая технология.

в CUDA самое ценное это их CUDNN - предтюненные conv/matmul программы для всех своих видюх. Исходника на них не получить. А обычные cuda программы портировать на тот же opencl как бы справится и пара индусов.

А также другие закрытые библиотеки, типа cuFFT (ее немного юзает Tensorflow) и cuBLAS (насколько я знаю, cuDNN на ней основан отчасти).

Я когда-то FFT для OpenCL искал. Нашел один пример, неоптимизированный, только для 2^n размеров массивов...

На самом деле всё это очень печально. Каждый вендор занимается своими разработками по мл. Это хорошо если нужно что-то проанализировать, сделать какую-то модель для внутреннего использования, так что сгодится какой-то 1 вендор. Но если МЛ идёт в продакшн к пользователям, то начинается попа-боль. Потому что у пользователей есть не только нвидиа, но и амд, а есть еще встроенная в интел проц видяха, которая и не очень быстрая, но зато освобождает процессорное время, что тоже очень неплохо. Т.е. вместо того чтобы всем объединиться и делать какой-то единый стандарт/фреймворк итд итп, мы имеем 3 гиганта которые работают порознь, а так же араву разработчиков библиотек, которые делают различные плохо портируемые фреймворки под конкретные типы железа, конкретные компиляторы и ОС. Единственное это Microsoft хоть как-то пытается это всё стандартизировать. Я использую их onnxruntime , который работает одинаково хорошо на всех видяхах для инференса моделей. Так же их DirectML тоже перспективен и выдает неплохую скорость тренировки в tensorflow-directml, но для линукса нет.

К сожалению, CUDA — это не открытая технология. Возможно, вы перепутали с какой-то другой технологией. Достаточно посмотреть лицензию, которая, например, в явном виде запрещает реверс-инжиринг SDK.

А это что ?

https://developer.download.nvidia.com/compute/cuda/opensource/

Лицензия наверное на бинарный пакет который содержит компоненты из источников 3-й стороны,которые реверсировать нельзя.

А это что ?

А вы смотрели, что внутри? Если скачать здоровенный архив из поддиректории image/, то там внутри будут исходники apt, bash, make и других утилит и библиотек. Nvidia их использует, например, в своих образах для Docker и по лицензии GPL должна распространять исходники вместе с программами.
Исходников каких-то компонентов CUDA Toolkit (например, cuBLAS) я внутри не заметил. Может плохо смотрел, конечно.
Для меня открытая технология — это всё же когда больше одной компании влияет на её развитие, когда есть спецификации железа, чтобы любой мог реализовать, ну и когда есть исходники всех компонентов.
А то у Nvidia много опенсорса, тут я спорить не буду. Достаточно на их гитхаб зайти.

Если избавиться от CPU, всё будет немножечко лагать. Так делать не надо.

Извиняюсь, но так инженеры не выражаются. Это первое. Второе. Я рассказываю своим студентам тоже разницу между CPU и GPU. Так вот. Если провести параллель, то CPU это пассажирский самолёт, а GPU — истребитель. Можно их сравнивать? Ну для детского воображения — да. Но не взаимоисключающе, а как для своих нужд хорошо отлаженные инструменты.

Не вдаюсь в детали, но сравнение неуместно. Потому что вроде идёт разговор о замещении одного другим, но список задач сводится к шейдерам. Но организация компьютера — это не треугольники и шейдеры. Это намного больше. И CPU занимается своим делом, а GPU и видеокарта — своим. И почему-то уверен, что так и останется ещё долгое время. Архитектура Von-Neumann уже не одно десятилетие пережило. Конечно оба можно в одно интегрировать, но сказать, что одно можно заменить другим — не является истинной. В таких вещах разделение задач только на пользу.

Спасибо за замечание! Одна из основных идей этой вводной статьи - показать, что сравнение действительно некорректно. Несмотря на то, что по измеримым характеристикам (флопсы) GPU во много раз превосходит CPU, последний нельзя заменить на первый. Причина - их действительно не во всех случаях можно сравнивать.

Но если задача действительно допускает массовый параллелизм, хорошо ложится на видеокарту, правильно реализована на ней, то тогда сравнение обретает смысл: соотношение времени её работы на CPU и GPU получится примерно такое как теоретическое отношение производительности этих устройств.

Прошу прощения, но технологии GPGPU уже больше 10 лет. И, насколько, я знаю, все современные суперкомпьютеры построены с использованием видеокарт. Просто это оказался самый дешевый вариант массивно-параллельных вычислений.

нашел стандартную задачу на собеседование или тест

Обработка данных:

Исходные данные: последовательность из 1 миллиона чисел (int, от 1 до 100) (14, 45, 77, 1, ...)
Сжать данные, чтобы они занимали как можно меньше места
Разжать данные в оригинальную последовательность

Условия:

Должна быть многопоточность
Вычисления должны делаться на GPU
А можете поделится идеями, как такое задание решается. Спасибо заранее.
CUDA.
Я просто хотел принцип услышать, а не то, что в каком-то языке для этого функция есть. Примеры с сортировком в том и заключаются, что человек понимает суть команды, неважно в c# или в Javе, потому что известно, что за команой .Sort стоит например Quick Sort алгоритм. Но всё равно — спасибо. Попробую посмотреть в этом направлении. Может быть что-нибудь найду интересное.
НЛО прилетело и опубликовало эту надпись здесь
1. GPU не является Машиной Тьюринга. Не может посчитать, к примеру, экспоненциальную функцию — сигмоиду, соответственно инференс только на GPU в общем случае невозможен. После GPU все равно досчитывает CPU.
2. Память GPU, конечно, быстрая, только данные туда в начале должны попасть. Накладные расходы на передачу из RAM в GPU-RAM, а потом еще обратно! приводят к тому что внезапно самый быстрый практический инференс на легких нейронках получается на CPU с векторными расширениями (NEON, AVX).
3. В моих домашних применениях наличие 2080TI никак не ускоряет видеомонтаж, потому что CPU в 48 аппаратных потоков делает это быстрее.

Итого, я не говорю что GPU это плохо. Просто практическое применение несколько отрезвляет.
>CPU в 48 аппаратных потоков делает это быстрее

2080 Ti может не только 1 поток сжимать, но и не только два. А еще она может сжимать lossless hevc. А еще там есть поддержка NVFBC, которая дает 0.5% CPU при захвате экрана. А и ещё b-frames each и middle.

А и ваша любимая x264 поддерживает opencl.
Просто практическое применение несколько отрезвляет

ну вот — опять всё портите :) А такой масштаб для маркетинга имеет место быть! Не всем-же обязательно знать, что в их вычислительном процессе где-нибудь будет узкое место (bottleneck) — продаваться ведь может в общем на ура. А потом и на поиски этого «узкого места» можно и новые проекты поставить на ноги и доп. буджет освоить итд.

Такой радикальный подхот замечаю при внедрении новых систем, где необдуманно за основу берётся какая-нибудь функция, которую старая система вроде хуже делала, но при этом полностью или частично пренебрегаются и другие, немаловажные функции. И когда система запускается, начинается бесконечное допиливание системы. Потому что старая система не настолько была плохая, как её описывали, чтобы продать/купить новую.

Конкретный пример. У нас в новой архитектуре предусмотрели замену импорта данных на JSON, который раньше был на csv. Ведь это так модерно и круто. А то, что время импорта потом увеличилось в разы — это никого поначалу не волновало, ведь в Big Data все так делают. И не важно, что схема файла почти никогда не будет изменена. Потом приходит осознание, но после этого — многое уже просто так не вернёшь назад. Только за деньги и кучу времени.

GPU не является Машиной Тьюринга. Не может посчитать, к примеру, экспоненциальную функцию — сигмоиду, соответственно инференс только на GPU в общем случае невозможен. После GPU все равно досчитывает CPU.

Очень странное заявление. GPU вполне может симулировать машину Тьюринга.

И сигмоида на GPU прекрасно программируется. Вот пример реализации. Тут даже думать особо не нужно, чтобы запрограммировать, так как экспонента — это стандартная функция.

подтверждаю. И будущее это общая память CPU с GPU.

>Если избавиться от CPU, всё будет немножечко лагать.

Не правда. Просто нужна ос, грузящаяся с GPU (благо 2080 Ti имеет USB 10 гбит/с, с которого можно грузиться даже в нормальной ситуации через USB Attached SCSI Protocol). users.atw.hu/gerigeri/DawnOS/history.html
Dawn now works on GPU-s: with a new OpenCL capable emulator, Dawn now boots and works on Graphics Cards, GPU-s and IGP-s (with OpenCL 1.0). Dawn is the first and only operating system to boot and work fully on a graphics chip.


>что к 2010 году тактовая частота одного ядра процессора достигнет 10 гигагерц. Сейчас мы знаем, что эти ожидания не сбылись.

Внутреннее разрешение времени в VISA debug framework-e Intel во всех современных чипсетах десять пикосекунд. Надеюсь, не надо объяснять, что это как раз 10 GHz. А вот что там внутри самого Bigcore (это то, что мы, простые люди, и называем CPU) да фиг знает. Не смотря на то, что ucode взломали и частитчно дизассемблировали, во внутрь ещё не заглянули. Для этого надо сам ucode эксплойтнуть.
>35 Гб/сек против 400 Гб/сек.

Первое это ГБ. А не Гбит. Да и второе тоже.
А 484 ГБ это довольно сложные вычисления, получающие из 8 чипов скорости 11 Gbit/s: superuser.com/questions/1186150/whats-the-difference-between-gpu-memory-bandwidth-and-speed/1186160#1186160

11 Гбит/с * 352 бита шина / 8 = 484 ГБ/с.

Притом 35 это для одного канала (при указанной частоте), коих у 9900 два.

Бииткоины уже давным давно не майнят на видеокартах. Этим занимаются ASIC микросхемки.

понятно же, что под биткойнами здесь подразумевают работу с криптовалютами. Это как подгузники называют памперсами, хотя памперсы - это подгузники определенного производителя :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий