Высокопроизводительные вычисления на С++

реклама
[email protected]
•
•
•
•
•
Разработчик ПО (.NET, C++)
Microsoft MVP Visual C# (с 2009г.)
Автор Pluralsight курсов по MATLAB, CUDA, D, …
Технический евангелист в JetBrains
Занимаюсь финансовой математикой
• Какая разница между нативным и «управляемым»
кодом?
• Как использовать возможности обычного (x86
CPU) железа?
• Какие COTS и специализированные железки
существуют и для чего они используются?
• Нативный код = исходники компилируются в
инструкции процессора.
• Управляемый код = исходники компилируются в
некий промежуточный язык (обычно похожий на
assembler), который потом превращается в
нативный platform-specific код.
• Портативен. Но С++ тоже портативен если грамотно
писать (т.е. не использовать платформноспецифичные вещи).
• В теории – оптимизируется под разные платформы.
На практике – оптимизируется плохо.
• Не допускает низкоуровневое взаимодействие
пользовательского кода с процессором.
• Дополнительная безопасность («управляемость») –
проверки выхода за рамки массива, приведение
типов, и т.п.
• Не всегда портативен (например .NET портативен
только частично, не включая UI, WCF, …)
• Обычно поддерживает автоматическую сборку
мусора.
• Содержит механизмы взаимодействия с нативным
кодом (JNI, P/Invoke, C++/CLI).
• Разработчика или программы?
• Управляемые языки более просты в разработке
• Задачи иногда тормозят не только из-за CPU, но
из-за IO
• С приходом SSD стало лучше
• Варианты оптимизации
• Увеличения тактовой частоты процессора можно
не ждать
• Единственный способ ускорить код – дать больше
сущностей, на которых этот код можно запустить
• На уровне инструкций
• На уровне ядер
• На уровне машин
• Писать inline assembly
• Использовать т.н. intrinsics
• Надеяться что компилятор «векторизует» циклы
• Использовать магические компиляторы
• GPGPU
• FPGA
• Аппаратные платы расширения
• Аппаратные платформы – NVIDIA, ATI
• Программные платформы для вычислений –
CUDA, OpenCL, C++ AMP
• Считается что если >2, эффективность падает
• PCI bus узкий, но все зависит от паттернов
использования
• CUDA является единственной коммерчески успешной
системой
• CUDA поддерживают многие производители ПО (Photoshop,
MATLAB, etc.)
• Во многих областях (например video transcoding), ситуация с
использованием GPU остается плачевной
• С точки зрения производительности, считается что у CUDA
лучше с floating-point, у ATI лучше с integral math
• CUDA – это на самом деле managed технология
• CUDA не является device-independent
• Основной язык – это CUDA C
• GPU может иметь много «мультипроцессоров»
• Каждый SM имеет много процессоров
• Мы можем запустить очень много потоков
параллельно
• Кол-во потоков таково, что даже с меньшим тактом
процессоров, CUDA выигрывает у CPU для
вычислений
• GPU не поддерживает x86. Обычно все упирается
в математику (+-*/, sin/cos, etc.). Boost или
«обычный код» тут не поднять.
• Гнать несколько разных задач на одном GPU
накладно (но можно). Например, симулировать
карточную игру невыгодно.
• Причина – потоки на GPU должны выполнять
одну и ту же инструкцию. Простой if делает из
параллельного кода последовательный.
• FPGA – Field Programmable Gate Array
• Конструктор Лего для создания собственной
схемы обработки данных
• Среднее между жесткой конфигурацией ASIC и
очень гибкими general-purpose CPU
• Используют специальные языки описания железа
(HDL) – VHDL, Verilog. Также есть SystemC и более
высокоуровневые решения (к пр. Embeddr).
• Например для видео декодирования в
телевизоре.
• Или для того чтобы воткнуть вместо Xeon’а в
сокет и делать FFT
• Или как самый мощный способ защитить свой
код (когда обфускация софта не помогает).
• FPGA не являются COTS-решением
• Строго говоря, FPGA дает возможность
«разгрузить» CPU, взяв на себя некоторые
определенные задачи.
• Гибкость FPGA намного меньше. Например, он не
так хорошо подходит для математики.
• FPGA – низкоуровневый конструкт.
• FPGA – крайне дорогие для несерийного
производства.
• FPGA не конкурируют с обычными процессорами
по скорости
• FPGA конкурируют благодаря своей
параллельной природе
• Смысл – «заточить» схему на прецизионную
обработку определенной задачи
• Пример – разбор специализированных
протоколов «в железе» (т.н. feed handler)
• Как воткнуть еще несколько процессоров в мат
плату? Никак. Архитектура не масштабируется и
никогда не будет.
• Вариант: повесить дополнительный компьютер
(coprocessor) на PCI шину
• Коммерческая реализация
копроцессора от Intel
• PCI карта с 60x процессорами
• Поддерживает x86!!!!!!!!!111111
• Поддерживает несколько парадигм взаимодействия
• Использует свой собственный micro Linux (а не драйвер)
• Можно использовать
• Требует специальный инструментарий для разработки
• Intel производит инструментарий для С++
разработчиков
• Для работы с Xeon Phi нужны
• Offload mode
• Native execution mode
• Symmetric execution
• Пишем Hello World
• icpc –mmic –std=c++0x –openmp hello.cpp
• scp hello.out mic0:
Также, не забываем скопировать нужные lib’ы
ssh mic0
export LD_LIBRARY_PATH=/:$LD_LIBRARY_PATH
./hello.out
• Программа запускается на девайсе
•
•
•
•
• 60 процессоров
• 4 hardware threads на ядро
• 8Gb memory
• 512-bit SIMD
Скачать