[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