×

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

[Об авторе: Андриан Буданцов — CTO и соучредитель компании Readdle, где с 2007 года управляет разработкой продуктов для миллионов людей и тысяч бизнесов. Андриан уже 16 лет работает с кодом десктопных, мобильных и веб-приложений]

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

Айтишные примеры мирового масштаба всем хорошо известны — Билл Гейтс (ПО для микрокомпьютеров), Стив Возняк (бытовые микрокомпьютеры), Марк Андерсен (браузер), Энди Рубин (мобильная ОС). Примеры меньшего масштаба — основатели продуктовых компаний вашей страны или города.

Не следует строить иллюзий — хорошее понимание технологий очень важно, но не является достаточным условием успеха — даже в семидесятых годах на одного Возняка приходилась сотня бородатых молодых людей, способных разработать домашний компьютер. Однако готовность к будущему, которое может наступить, — вещь достаточно ценная, чтобы ей пренебрегать.

Что нужно программисту знать о будущем? В первую очередь то, для каких компьютеров в будущем нужно будет писать код.

Поговорим о компьютерах или даже в более узком смысле — о процессорах. Последние 120 лет сложность процессоров описывает закон Мура. Закон Мура (называется законом по исторической традиции) — это наблюдение о том, что каждые два года количество транзисторов на кристалле процессора удваивается. С некоторыми оговорками, это наблюдение все еще выполняется.

До 2005 года из наблюдения Мура следовало то, что персональные компьютеры регулярно (18-24 мес.) становятся вдвое быстрее. При этом от программиста не требовалось никаких усилий, чтобы написать код (или даже не писать код), использующий возможности новых процессоров.

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

Прошло около десяти лет, и мы оказались в ситуации, когда количество ядер в большинстве компьютеров больше не увеличивается, а разница в производительности между поколениями процессоров отличается едва ли на 10%.

Да, для мобильных процессоров ситуация пока еще более радужная (разница порядка 40% между поколениями), но и там уже чувствуется близость предела возможностей.

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

Тренд № 1: развитие многопоточности

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

Для компьютеров и ноутбуков ситуацию может пошатнуть удачный выпуск нового AMD Ryzen (имеет шанс оказаться дешевым и быстрым 8-ядерным процессором). Для мобильных устройств — удачный выпуск Qualcomm Snapdragon 835 (процессор большинства Android флагманов 2017 года) и увеличение количества ядер в чипах Apple (пока неизвестно, произойдет ли оно).

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

На сегодняшний день наиболее удачные подходы для многопоточной разработки предполагают использование функционального программирования и/или передачи сообщений: см. модель взаимодействующих последовательных процессов и модель акторов.

Что делать: обратить внимание на языки программирования, в которых работа с многопоточностью является сильной стороной: Go, Rust, Erlang/Elixir, Scala.

Тренд № 2: General-Purpose Graphics Processing Unit (GPGPU или GPU)

Ускорители компьютерной графики, первоначально использовавшиеся для видеоигр и инженерной графики, выросли до параллельного процессора общего назначения, содержащего тысячи ядер.

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

На GPGPU эффективней всего работает вычислительный код, выполняющий параллельную обработку большого количества данных. GPGPU код (обычно это код «вычислительных ядер») не выполняет ввод-вывод сам и не синхронизирует индивидуальные потоки. В некотором смысле это в чистом виде ускоритель вычислений.

Новейшая видеокарта Nvidia GeForce GTX 1080 Ti: 3584 CUDA ядер и 11 Гб памяти

Что делать: существует три возможности использовать мощь GPGPU:

  1. Высокоуровневые библиотеки и сервисы — уже готовые решения, которые позволяют с помощью GPU обрабатывать данные: изображения, звук, видео, текст, абстрактные значения.
  2. Инструменты для вычислений — оптимизированные библиотеки (достаточно большой список от Nvidia), а также фреймворки для вычислений вроде TensorFlow.
  3. Низкоуровневые инструменты — в первую очередь библиотеки-языки Cuda (можно начинать со свежего An Even Easier Introduction to CUDA) и OpenCL (а также Metal в мире Apple) — необходимы, когда нужна максимальная производительность и тесная интеграция между процессом расчета и приложением.

Тренд № 3: Облака

Вычислительные кластеры уже давно используются для решения задач, с которыми не справляется один процессор; к тому же Google показал, что решение, построенное на множестве недорогих компьютеров, оказывается более эффективным, чем большие серверы и мэйнфреймы.

С развитием облачных вычислений стало возможно получить в управление множество серверов и менять их количество в больших пределах в течение часа. Кроме этого, облачные решения становятся дешевле и популярней с каждым годом (см. иллюстрацию ниже — замкнутый круг между удешевлением, снижением цен, популярностью и ростом).

Замкнутый круг Amazon из документа «Introduction to AWS Economics»

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

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

Что делать: наибольшая область развития в этом тренде находится в бэкенд разработке.

В первую очередь следует познакомиться с примитивами облачных вычислений (балансировка нагрузки, очереди, автомасштабирование). Далее — инструментарий devops, распределенные вычисления (блокировка, CAP теорема, задача консенсуса). Контейнеризация и популярные технологии оркестрирования — Kubernetes, Mesos, Swarm. Наконец существующие распределенные и масштабируемые базы данных и их ограничения.

Тренд № 4: FPGA и ASIC

Когда процессоры общего назначения упираются в пределы производительности — остается вариант использовать специализированные чипы. Как известно, по этому подходу уже пошли добытчики криптовалют, у которых аппаратные майнеры давно обогнали как CPU, так и GPGPU.
FPGA (Field-Programmable Gate Array) — программируемый пользователем чип, в котором логика работы может быть полностью задана с помощью кода, обычно на языках Verilog или VHDL. Традиционно FPGA используются для прототипирования.

До некоторых пор FPGA разработка находилась очень далеко от обычного программирования, однако сейчас, усилиями компаний Altera (Intel) и Mojo, порог входа в FPGA разработку почти не отличается от покупки Raspberry Pi или Arduino.

В 2017 году можно рассчитывать на новый тип инстансов Amazon F1, который будет позволять программировать и выполнять FPGA код, не прикасаясь к железу вообще. Кроме этого, известно, что новые iPhone 7 также содержат FPGA чип, пока еще неизвестного предназначения.

ASIC (Application-specific integrated circuit) — в более широком смысле, любые специфические чипы для решения определенных задач.

Microsoft HoloLens Tensor Processing Unit Board


Из интересного нового железа в этой области — HPU (Holographic Processing Unit), который используется в HoloLens от Microsoft, TPU (Tensor Processing Unit) — аппаратный ускоритель TensorFlow от Google, чипы от Nvidia для самоуправляемых автомобилей.

Что делать: как и в случае с GPGPU, с этим трендом можно работать на разных уровнях. На высоком уровне — использовать возможности новых устройств, содержащих специфические ASIC. Каждый ASIC потенциально ждет своего killer-продукта.

Тем, кто достаточно смел, чтобы работать с железом, имеет смысл достать набор разработчика FPGA и начать изучение Verilog.

См. также

Помимо описанных трендов, существуют и другие события, которые могут резко повлиять на разработку программного обеспечения: слияние RAM и SSD (сверхбыстрая энергонезависимая память большого объема), 5G сети, квантовые компьютеры, новые устройства ввода/вывода.

Наконец существует вероятность, что произойдут большие изменения в методологии разработки без сопутствующих изменений аппаратуры.

Будьте любопытны, сообразительны и удачи вам.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn

Схожі статті




23 коментарі

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.
языки программирования, в которых работа с многопоточностью является сильной стороной: Go, Rust, Erlang/Elixir, Scala.
в ADA это уже 30+ лет как сильная сторона — и чё?

Ada-83 с её блокирующими рандеву это скорее издевательство, чем реальная параллельность. Только с 95-й началось что-то более нормальное.
Но если бы они вместо этого взяли каналы стиля нынешнего Go, получилось таки бы проще и эффективнее в плане затрат на разработку.

Мне кажется, это не очень новые тренды.

Автор и не называет их новыми.

влияли, влияют и, скорее всего, продолжат влиять

"

Тем, кто достаточно смел, чтобы работать с железом, имеет смысл достать набор разработчика FPGA и начать изучение Verilog.
"

1. www.amazon.com/...ture-Second/dp/0123944244
2. www.amazon.com/...tecture-ARM/dp/0128000562
3. www.fpga4fun.com
4. marsohod.org

якщо використати OpenCL то можна на С++ під FPGA писати:

www.altera.com/...pers/opencl/overview.html
www.youtube.com/watch?v=dZEPjhwOOtk

щоб працювати з FPGA крім Verilog/VHDL будуть потрібні знання електроніки та цифрової схемотехніки.

Для работы с FPGA тут потребуется не очень высокий уровень этих знаний — без аналоговой части, а часто даже без знаний про гонки и защёлки.

Все залежить від завдання. якщо у вас готовий пристрій на базі FPGA і залишилось тільки написати Verilog/VHDL код, то тут я можу погодитись.

якщо потрібно спроектувати на базі FPGA то без знань електроніки не обійтись:
аналогової — FPGA + ADC, DAC, OPAM, блокуючі конденсатори, схеми ресету, та інш.
цифрової — оптимізувати код FPGA
без знань про гонки, не вийде підключити до FPGA швидкісну пам’ять, usb, Ethernet, HDMI контроллери, та інш.

якщо у вас готовий пристрій на базі FPGA

Те, що в названих тут трендах — саме таке. Вже готова схема, в якій є FPGA для особливих завдань.

якщо потрібно спроектувати на базі FPGA

Придбаватимуть готові, як зараз Arduino/etc.

Придбаватимуть готові, як зараз Arduino/etc.
таке рішення ідеальне для стадії прототипування, для готового продукту ні.

А чому в графіку про закон Мура є ПК від IBM та графічні процесори 480Х і Титан Х? Все-таки це різні сфери, про що і далі в статті написано, хіба ні?

Та какая разница, если в телефоны уже по 3 миллиарда транзисторов запихивают (память добавляет существенную долю, но все же)

Антон, спасибо за вопрос. Наблюдение Мура не ограничивается типом чипа. Если завтра появиться очень плотный чип оперативной памяти, то его тоже можно будет указать на графике. Если на графике указывать только процессоры, то проседание станет заметно уже сейчас, да и на 120 лет назад не получится экстраполировать.

и единственный путь будет ставить на мамку много процессоров, что сильно повысит ее цену. Это тупиковый путь.

А за счёт чего повышение цены? Если синхронизация в чипсете и тому подобное, то от неё как раз легко уйти, сделав раздельные вложенные компьютеры с почти полным набором периферии.

Так что сейчас единственное реальное направление — это вычислительные кластеры.

Вот они и будут, при таком подходе, в пределах одного ящика.

Пункты 1, 2, 3 это не тренды, а свершившиеся факты. А вот Persistent Memory про которую упомянуто одной лишь строкой вполне себе тренд, который может изменить всю индустрию в будущем.

Дмитрий, про Persistent Memory пока очень мало ясности. Тем не менее я все ещё считаю что процессоры с десятками ядер, GPU на сотни терафлопс, и Cloud-сервера за доллар в месяц изменят индустрию больше, чем многие программисты сейчас готовы. Из-за специализации сейчас очень легко игнорировать эти факты-тренды.

процессоры с десятками ядер
Десятками имеется ввиду 50 и больше ? Просто еще 3-4 года назад арендовать сервер на 24 ядра не было такой уже трудной задачей даже в Украине.
Cloud-сервера за доллар в месяц изменят индустрию больше
Да кто сможет такое выкатить на рынок с прибылью реально порвет рынок, но пока те же рендер фермы идут по 16-25 баксов час и там еще и очередь если у тебя заказ маленький.

И правильно делают, что не в курсе. NVDIMM без батарейки не выполняет своих задач, а с батарейкой отличается от iRAM только тем, что модуль можно будет вынуть, когда оно всё запишется. А учитывая скорость записи лучшего NAND по сравнению с DRAM, это может быть нескоро.
На уровне же приложения mmap() на SSD даёт такую же прозрачность, как эти средства.

Вот когда будет NVRAM со скоростью хотя бы как DDR2, можно будет всерьёз воспринимать это вместо нынешней оперативки.

и когда уже люди собственную некомпетентность перестанут считать весомым аргументом в споре...

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

Підписатись на коментарі