Умножение матриц, серия 4: NVidia G80, CUDA, CuBLAS и RapidMind

GPGPU или зачем все эти упражнения

Все предыдущие и более ранние мои упражнения были сделаны в качестве «подхода к снаряду», нужна была baseline для более интересной задачи: вычислений общего назначения на видеокарте.

Эта тема в последние год-полтора (а особенно, в последние полгода) очень сильно нагрелась. В то же время, в варианте от NVidia hardware и софт общедоступны, покупаешь видеокарту и развлекаешься.

Приборы и материалы: NVidia CUDA и прочие

Настоящий общедоступный сдвиг произошел меньше месяца назад: 6 февраля 2006 г. вышла вторая версия NVidia CUDA Toolkit, она же первая публичная (и первая более-менее работающая), она же версия 0.8.

Эта версия доступна всем желающим без подписания NDA, следовательно результаты тестов можно открыто публиковать.

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

Рассматривались три доступных умножителя матриц:

  1. SGEMM в составе библиотеки CUBLAS.
  2. Тестовый пример от NVidia, который очень подробно разобран в документации.
  3. Реализация SGEMM от RapidMind.

Сравнивалось все с результатами вычислений на доступных мне компьютерах общего назначения:

  1. Dual Opteron 275 (2.2 Ghz) - долгое время это был "предпоследний процессор в линейке" т.е. наиболее разумный выбор по цена/качество.
  2. Dual Xeon 5140 - текущий оптимум по цена/производительность.

Стоимости решений

Видеокарта сама по себе не работает, поэтому интересно сравнить "платформы", состоящие из процессора, материнской платы, пары гигабайт памяти и видео. В минимальном варианте три разных системы будут стоить на сегодня (по московским ценам):
  • Вычислитель на G80: NVidia 8800GTX + современная недорогая обвязка (процессор, память): $1200-1300, половину суммы составляет видеокарта.
  • Вычислитель на Dual Opteron 275: $1200-1300, половину стоимости составляют два процессора.
  • Вычислитель на Dual Xeon 5140: $1600-1700 из которых около 1000 за два процессора.
Xeon - существенно дороже, но как мы помним по прошлым тестам, он примерно в 1.6 раза быстрее на вычислениях.

Результаты тестов

Вычисления на видеокарте проходят в три этапа:
  • Загрузка данных в видеопамять
  • Запуск вычислительного модуля, исполняемого GPU
  • Выгрузка данных в основную память компьютера
В-принципе, загрузка-выгрузка могут осуществляться одновременно с расчетами (если области видеопамяти не пересекаются), поэтому при оценке быстродействия интересны два времени: чистое время на исполнение (это быстродействие мы получим, если у нас есть много данных для расчетов) и с учетом ввода-вывода (это время обсчета одной задачи).

Быстродействие на перемножении матриц (MFLOP/s)
Платформаразмер задачи
1024 2048 4096
Вычисления на CPU
2xOpteron 275, Goto BLAS
single precision, 4 threads
23 091 28 971 30 272
2xXeon 5140, Goto BLAS
single precision, 4 threads
26 512 45 935 47 556
NVidia G8800GTX: Чистое время вычислений
RapidMind 2.0b3 109 653 -* -*
пример из CUDA toolkit 46 403 46 562 46 299
cuBLAS SGEMM 97 713 99 890 98 738
NVidia G8800GTX: Вычисления + загрузка-выгрузка данных в видеокарту
RapidMind 2.0b3 33 314 -* -*
пример из CUDA toolkit + IO 25 230 35 911 40 879
NVidia G8800GTX, cuBLAS SGEMM 58 703 73 670 83 473
* — Стандартный пример от RapidMind ограничен матрицами 1020x1020

Обсуждение результатов

RapidMind

Пример от RapidMind не использует аппаратных особенностей G80 и должен работать на любой DX9-видеокарте. Используется операция MAD (Multiply-Add) над векторными (4 компонента) операциями. По всей видимости, MAD работает, получающаяся производительность весьма вкусная. К несчастью, пример плохо масштабируется, программировать в терминах 4-векторов очень мучительно. А убивает все скорость копирования данных из видеокарты: стандартные средства DX9 очень медленные и неудобные.

Пример от NVIdia

Умножение матриц в примере от NVidia сделано с большой претензией: блоки данных копируются в сверхбыструю shared-memory, где и умножаются. Однако shared-памяти мало, 16 килобайт на мультпроцессор (всего, соответственно, 256kb полмегабайта, исправлено 01.10.07) и весь пар уходит в свисток: синхронизацию всех тредов. Результат получается хуже, чем у более сложного кода для CuBLAS.

CuBLAS

Про внутренности CuBLAS неизвестно ничего. По внешним признакам, там нет глупостей с оптимизацией на кратность матрицы размеру блока в shared memory и прекрасно сделано копирование данных в(из) видеопамять.

Выводы

На несложной задаче без ручных оптимизаций NVidia G80 делает в 2-3 раза вычисления на мощных современных CPU (двух двухядерных). Исследования надлежит продолжать.

В следующей серии: FFT3D.

Comments

Размерность задач указана, а вот нельзя ли по-подробнее про тип данных? Т.е. разброс значений и структуры матриц - для которых проводились эти тесты?

Это все single precision (32 бита). Данные подбирались так, чтобы не попасть в переполнение или потерю точности (значения от 0.1 до 1).

Матрицы - не разреженные.

браво!

> Эта тема в последние год-полтора (а особенно, в последние полгода) очень сильно нагрелась.

я про это думал уже году в 2000-2002 (примерно в то время появились первые известия о возможности вычислений на GPU.

Но дальше "раздумий" дело не пошло - нету времени и знаний, да и основная работа загружает на 100%.

C 2002-го года много воды утекло.

Во-первых, стало больше смысла, ускорители развиваются (ускоряются) быстрее чем CPU.

Во-вторых, появились разумные инструментальные средства генерации кода (с отладкой много хуже)

"В следующей серии: FFT3D."
Уже есть пример пост-врем. фильтра для видео
от Fizick
http://avisynth.org.ru/fft3dfilter/fft3dfilter-rus.html
переделанный под GPU
http://forum.doom9.org/showthread.php?t=89941

Вообще, есть FFT-GPU (под OpenGL), но я имел в виду тестирование FFT, который входит в поставку CUDA Toolkit.

Впрочем, тестировать пока не стал, увлекся самостоятельным программированием под данную платформу.

В тему:
NVIDIA анонсирует Tesla: ускорение расчётов силами видеочипов Lexagon / 21.06.2007 07:47 / ссылка на материал / версия для печати
Ещё осенью прошлого года, в момент анонса видеокарт на базе чипа
G80, компания NVIDIA сделала акцент на возможности использования видеочипов
для ускорения разного рода расчётов - соответствующая концепция получила
название CUDA. Официальный анонс соответствующих решений должен был
состояться в июне, и он состоялся вчера, о чём доложили все профильные
сайты. Расскажем о новой платформе NVIDIA и мы.

По сути, NVIDIA открывает путь к суперкомпьютерным вычислениям при
использовании видеокарт класса Quadro FX 5600, которые являются близкими
родственниками GeForce 8800 GTX с той лишь разницей, что первые оснащены 1,5
Гб памяти типа GDDR-3. В "суперкомпьютерном варианте" такая видеокарта
лишена портов для подключения к монитору - они ей просто не нужны.
Называется этот продукт "GPU computing processor", модель обозначается как
Tesla C870.

Однако shared-памяти мало, 4 килобайта на процессор (всего, соответственно, полмегабайта)

нету там столько кэша :) 16кб на мультипроцессор, которых всего 4, итого 64 кб на карте.

Зато там память быстрая :)

Что касается Tesla, то текущая модель основана на архитектуре nVIDIA 8800 GTX, поэтому не стоит особенно обольщаться. Нужно ждать новой модели их процессора G90.

Оба неправы :)
Действительно, 16Kb на мультипроцессор, но мультипроцессоров в 8800GTX - 16 штук.
И еще 32 килобайта регистров на мультипроцессор, тоже быстрая память.
Итого, 256/768Kb на карту (как считать).
Сейчас поправлю.

Скажите мне, простому юзеру када первые реальные приложения появятся на компе с использованием CUDA?

Уже появился первый реальный подборщик паролей от Elcomsoft.

Но вообще - скоро. Ведь до конца ноября CUDA требовала (от юзера) установки специального видеодрайвера, а скоро эта функциональность будет в стандартном драйвере NVidia (пока только в бета-версии)

Я - простой пользователь, но подобными темами (конкретно-параллельных вычислений)интересуюсь давно. Вопрос такой: что Вы думаете относительно применимости SONY PS3 для этих целей?Возможно ли сравнение с иследовавшимися Вами процессорами? я видел заметку о самодельном,правда,при поддержке SONY суперкомпьютере из 15-ти приставок.ссылку, к сожалению,не сохранил(ix bit ?).

У PS3 очень мало памяти для серьезной работы

Как программировать? Не могу разобраться в коде... на каком примере можно реально разобрать, диплом будущий надеюсь на CUDA посчитать...

Там же в одном из двух файлов дистрибутива (скорее в SDK, а не в Toolkit) есть просто куча примеров. И документация к ним.

Все на английском, но в-принципе в NVidia работают и наши соотечественники, я с ними общался на русском.