Расширенные векторные расширения

редактировать
Расширения к архитектуре набора команд x86 для микропроцессоров Intel и AMD

Расширенные векторные расширения (AVX , также известный как Sandy Bridge New Extensions ) - это расширения для x86 архитектуры набора команд для микропроцессоров из Intel и AMD, предложенные Intel в марте 2008 г. и впервые поддержанные Intel с процессором Sandy Bridge, поставляемым в первом квартале 2011 г., а затем AMD с Bulldozer Процессор поступит в продажу в третьем квартале 2011 года. AVX предоставляет новые функции, новые инструкции и новую схему кодирования.

AVX2 (также известный как Haswell New Instructions ) расширяет большинство целочисленных команд до 256 бит и вводит слитные операции умножения-накопления (FMA ). Впервые они были поддержаны Intel с процессором Haswell, который был поставлен в 2013 году.

AVX-512 расширяет поддержку AVX до 512-бит, используя новую кодировку EVEX prefix, предложенную Intel в июле 2013 года. и впервые поддерживается Intel с процессором Knights Landing, который был поставлен в 2016 году.

Содержание

  • 1 Advanced Vector Extensions
    • 1.1 Новые инструкции
    • 1.2 ЦП с AVX
    • 1.3 Поддержка компилятора и ассемблера
    • 1.4 Поддержка операционной системы
  • 2 Advanced Vector Extensions 2
    • 2.1 Новые инструкции
    • 2.2 ЦП с AVX2
  • 3 AVX-512
    • 3.1 ЦП с AVX-512
    • 3.2 Компиляторы, поддерживающие AVX-512
  • 4 Приложения
    • 4.1 Программное обеспечение
  • 5 Понижение частоты
  • 6 См. Также
  • 7 Ссылки
  • 8 Внешние ссылки

Расширенные векторные расширения

AVX использует шестнадцать регистров YMM для выполнения одной инструкции для нескольких частей данных (см. SIMD ). Каждый регистр YMM может хранить и выполнять одновременные операции (математические) над:

  • восемью 32-битными числами с плавающей запятой одинарной точности или
  • четырьмя 64-битными числами с плавающей запятой двойной точности.

Ширина регистров SIMD увеличен со 128 до 256 бит и переименован из XMM0 – XMM7 в YMM0 – YMM7 (в режиме x86-64 из XMM0 – XMM15 в YMM0 – YMM15). Унаследованные инструкции SSE могут по-прежнему использоваться через префикс VEX для работы с младшими 128 битами регистров YMM.

Схема регистров AVX-512 как расширение регистров AVX (YMM0-YMM15) и SSE (XMM0-XMM15)
511256255128127 0
ZMM0YMM0XMM0
ZMM1YMM1XMM1
ZMM2YMM2XMM2
ZMM3YMM3XMM3
ZMM4YMM4XMM4
ZMM5YMM5XMM5
ZMM6YMM6XMM6
ZMM7YMM7XMM7
ZMM8YMM8XMM8
ZMM9YMM9XMM9
ZMM10YMM10XMM10
ZMM11YMM11XMM11
ZMM12YMM12XMM12
ZMM13YMM13XMM13
ZMM14YMM14XMM14
ZMM15YMM15XMM15
ZMM16YMM16XMM16
ZMM17YMM17XMM17
ZMM18YMM18XMM18
ZMM19YMM19XMM19
ZMM20YMM 20XMM20
ZMM21YMM21XMM21
ZMM22YMM22XMM22
ZMM23YMM23XMM23
ZMM24YMM24XMM24
ZMM25YMM25XMM25
ZMM26YMM26XMM26
ZMM27YMM27XMM27
ZMM28YMM28XMM28
ZMM29YMM29XMM29
ZMM30YMM30XMM30
ZMM31YMM31XMM31

AVX вводит формат инструкции SIMD с тремя операндами, в котором регистр назначения отличается от двух исходных операндов. Например, инструкция SSE, использующая обычную форму с двумя операндами a = a + b, теперь может использовать неразрушающую форму с тремя операндами c = a + b, сохраняя оба исходных операнда. Формат AVX с тремя операндами ограничен инструкциями с операндами SIMD (YMM) и не включает инструкции с регистрами общего назначения (например, EAX). Такая поддержка впервые появится в AVX2.

Требование выравнивания операндов памяти SIMD ослаблено.

Новая схема кодирования VEX представляет новую набор кодовых префиксов, который расширяет пространство opcode, позволяет командам иметь более двух операндов и позволяет регистрам векторов SIMD быть длиннее 128 бит. Префикс VEX также можно использовать в устаревших инструкциях SSE, придавая им форму с тремя операндами и позволяя им более эффективно взаимодействовать с инструкциями AVX без необходимости в VZEROUPPER и VZEROALL.

Инструкции AVX поддерживают как 128-битные, так и 256-битные SIMD. 128-битные версии могут быть полезны для улучшения старого кода без необходимости расширять векторизацию и избежать штрафов за переход от SSE к AVX, они также работают быстрее на некоторых ранних реализациях AMD AVX. Этот режим иногда называют AVX-128.

Новые инструкции

Эти инструкции AVX дополняют те, которые являются 256-битными расширениями унаследованных 128-битных инструкций SSE; большинство из них можно использовать как для 128-битных, так и для 256-битных операндов.

ИнструкцияОписание
VBROADCASTSS, VBROADCASTSD, VBROADCASTF128Скопируйте 32-битный, 64-битный или 128-битный операнд памяти в все элементы векторного регистра XMM или YMM.
VINSERTF128Заменяет нижнюю или верхнюю половину 256-битного регистра YMM на значение 128-битного исходного операнда. Другая половина пункта назначения не изменилась.
VEXTRACTF128Извлекает нижнюю или верхнюю половину 256-битного регистра YMM и копирует значение в 128-битный целевой операнд.
VMASKMOVPS, VMASKMOVPDУсловно считывает любое количество элементов из операнда векторной памяти SIMD в регистр назначения, оставляя остальные элементы вектора непрочитанными и устанавливая соответствующие элементы в регистре назначения на ноль. В качестве альтернативы, условно записывает любое количество элементов из операнда векторного регистра SIMD в операнд векторной памяти, оставляя остальные элементы операнда памяти неизменными. В архитектуре процессора AMD Jaguar эта инструкция с операндом источника памяти занимает более 300 тактов, когда маска равна нулю, и в этом случае инструкция не должна делать ничего. Похоже, это недостаток конструкции.
VPERMILPS, VPERMILPDPermute In-Lane. Перемешайте 32-битные или 64-битные векторные элементы одного входного операнда. Это внутренние 256-битные инструкции, что означает, что они работают со всеми 256 битами с двумя отдельными 128-битными перестановками, поэтому они не могут перемешиваться по 128-битным дорожкам.
VPERM2F128Перемешать четыре 128-битных элементы битового вектора двух 256-битных исходных операндов в 256-битный целевой операнд с непосредственной константой в качестве селектора.
VZEROALLУстановить все регистры YMM в ноль и пометить их как неиспользуемые. Используется при переключении между 128-битным использованием и 256-битным использованием.
VZEROUPPERУстановить верхнюю половину всех регистров YMM на ноль. Используется при переключении между 128-битным использованием и 256-битным использованием.

ЦП с процессорами AVX

Не все процессоры из перечисленных семейств поддерживают AVX. Как правило, процессоры с коммерческим наименованием Core i3 / i5 / i7 / i9 поддерживают их, а процессоры Pentium и Celeron - нет.

Проблемы совместимости между будущими процессорами Intel и AMD обсуждаются в разделе Набор инструкций XOP.

  • VIA :
    • Nano QuadCore
    • Eden X4
  • Zhaoxin :
    • Процессоры на основе WuDaoKou (KX-5000 и KH- 20000)

Поддержка компилятора и ассемблера

  • Absoft поддерживает с флагом -mavx.
  • Компилятор Free Pascal поддерживает AVX и AVX2 с переключателями -CfAVX и -CfAVX2 из версии 2.7.1.
  • Встроенные функции ассемблера GNU Assembler (GAS) поддерживают эти инструкции (доступны через GCC), как и примитивы Intel и встроенный ассемблер Intel (близко совместимый с GAS, хотя и более общий в обработке локальных ссылок внутри встроенного кода).
  • GCC, начиная с версии 4.6 (хотя существовала ветвь 4.3 с определенная поддержка), а Intel Compiler Suite начиная с версии 11.1 поддерживает AVX.
  • Компилятор Open64 версии 4.5.1 поддерживает AVX с флагом -mavx.
  • PathScale поддерживает через флаг -mavx.
  • Компилятор Vector Pascal поддерживает AVX через флаг -cpuAVX32.
  • The Visual Studio 2010 / 2012 компилятор поддерживает AVX через встроенный переключатель и / arch: AVX.
  • Другие ассемблеры, такие как MASM версия VS2010,, FASM, NASM и JWASM.

Поддержка операционной системы

AVX добавляет новое состояние регистра через файл регистров YMM шириной 256 бит, поэтому для правильного сохранения требуется явная поддержка операционной системы и восстановить расширенные регистры AVX между переключением контекста s. Следующие версии операционной системы поддерживают AVX:

  • DragonFly BSD : поддержка добавлена ​​в начале 2013 года.
  • FreeBSD : поддержка добавлена ​​в патче, представленном 21 января 2012 года, который был включен в стабильную версию 9.1. выпуск
  • Linux : поддерживается начиная с версии ядра 2.6.30, выпущенной 9 июня 2009 г.
  • macOS : поддержка добавлена ​​в обновлении 10.6.8 (Snow Leopard ) выпущено 23 июня 2011 г.
  • OpenBSD : поддержка добавлена ​​21 марта 2015 г.
  • Solaris : поддерживается в Solaris 10 Update 10 и Solaris 11
  • Windows : поддерживается в Windows 7 SP1, Windows Server 2008 R2 SP1, Windows 8, Windows 10
    • Windows Server 2008 R2 SP1 с Hyper-V требует исправления для поддержки процессоров AMD AVX (серии Opteron 6200 и 4200): KB2568088

Advanced Vector Extensions 2

Advanced Vector Extensions 2 (AVX2), также известные как Haswell New Instructions , является расширением набора инструкций AVX, представленного в Intel Haswell micr оархитектура. AVX2 вносит следующие дополнения:

  • расширение большинства векторных целочисленных инструкций SSE и AVX до 256 бит
  • трехоперандное манипулирование битами общего назначения и поддержка умножения
  • Gather, позволяющая элементам вектора загружаться из несмежных ячеек памяти
  • DWORD- и QWORD-гранулярность меняет любой на любой
  • сдвиг вектора.

Иногда другое расширение, использующее другой флаг cpuid, считается частью AVX2; эти инструкции перечислены на отдельной странице, а не ниже:

Новые инструкции

ИнструкцияОписание
VBROADCASTSS, VBROADCASTSDКопировать 32-битный или 64-битный регистровый операнд во все элементы векторного регистра XMM или YMM. Это регистровые версии тех же инструкций в AVX1. Однако 128-битной версии нет, но тот же эффект может быть просто достигнут с помощью VINSERTF128.
VPBROADCASTB, VPBROADCASTW, VPBROADCASTD, VPBROADCASTQСкопируйте 8, 16, 32 или 64-битный целочисленный регистр или операнд памяти во все элементы векторного регистра XMM или YMM.
VBROADCASTI128Копировать 128-битный операнд памяти во все элементы векторного регистра YMM.
VINSERTI128Заменяет нижнюю или верхнюю половину 256-битного регистра YMM значением 128-битного исходного операнда. Другая половина пункта назначения не изменилась.
VEXTRACTI128Извлекает нижнюю или верхнюю половину 256-битного регистра YMM и копирует значение в 128-битный целевой операнд.
VGATHERDPD, VGATHERQPD, VGATHERDPS, VGATHERQPSСобирает значения с плавающей запятой одинарной или двойной точности с использованием 32- или 64-битных индексов и масштаб.
VPGATHERDD, VPGATHERDQ, VPGATHERQD, VPGATHERQQСобирает 32- или 64-битные целочисленные значения с использованием 32- или 64-битных индексов и масштабирования.
VPMASKMOVD, VPMASKMOVQУсловно считывает любое количество элементов из операнда векторной памяти SIMD в регистр назначения, оставляя остальные элементы вектора непрочитанными и устанавливая соответствующие элементы в регистре назначения на ноль. В качестве альтернативы, условно записывает любое количество элементов из операнда векторного регистра SIMD в операнд векторной памяти, оставляя остальные элементы операнда памяти неизменными.
VPERMPS, VPERMDПеремешивают восемь 32-битных векторных элементов одного 256-битного исходного операнда в 256-битный целевой операнд с регистром или операндом памяти в качестве селектора.
VPERMPD, VPERMQПеремешивают четыре 64-битных векторных элемента одного 256-битного исходного операнда в 256-битный целевой операнд с регистром или операндом памяти в качестве селектора.
VPERM2I128Перемешать (два из) четырех 128-битных векторных элементов двух 256-битных исходных операндов в 256-битный операнд назначения с непосредственной константой в качестве селектора.
VPBLENDDДвойное слово немедленная версия инструкций PBLEND из SSE4.
VPSLLVD, VPSLLVQСдвиг влево логический. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом.
VPSRLVD, VPSRLVQСдвиг вправо логический. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом.
VPSRAVDСдвиг вправо арифметически. Допускает переменные сдвиги, при которых каждый элемент сдвигается в соответствии с упакованным вводом.

ЦП с процессором AVX2

AVX-512

AVX-512 - это 512-битные расширения для 256-битных инструкций SIMD Advanced Vector Extensions для архитектуры набора команд x86, предложенные Intel в июле 2013 года и поддерживаются процессором Intel Knights Landing.

Инструкции AVX-512 кодируются с новым префиксом EVEX. Он позволяет использовать 4 операнда, 7 новых 64-битных регистров маски операции, режим скалярной памяти с автоматической рассылкой, явное управление округлением и режим адресации сжатой памяти смещения . Ширина файла регистров увеличивается до 512 бит, а общее количество регистров увеличивается до 32 (регистры ZMM0-ZMM31) в режиме x86-64.

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

  • AVX-512 Foundation - добавляет несколько новых инструкций и расширяет большинство 32-разрядных и 64-разрядных инструкций SSE-SSE4.1 и AVX / AVX2 с плавающей запятой схемой кодирования EVEX для поддержки 512 -битовые регистры, маски операций, широковещательная передача параметров, встроенное округление и контроль исключений
  • AVX-512 Инструкции по обнаружению конфликтов (CD) - эффективное обнаружение конфликтов, позволяющее векторизовать больше циклов, поддерживается Knights Landing
  • AVX-512 Exponential and Reciprocal Instructions (ER) - экспоненциальные и взаимные операции, предназначенные для помощи в реализации трансцендентных операций, поддерживаемые Knights Landing
  • AVX-512 Prefetch Instructions (PF) - новые возможности предварительной выборки, поддерживаемые Knights Landing
  • AVX-512 Vector Length Extensions (VL) - расширяет большинство операций AVX-512 для работы с регистрами XMM (128-бит) и YMM (256-бит) (включая XMM16-XMM31 и YMM16- YMM31 в режиме x86-64)
  • AVX-512 Byte and Word Instructio ns (BW) - расширяет AVX-512 для охвата 8-битных и 16-битных целочисленных операций
  • AVX-512 Doubleword and Quadword Instructions (DQ) - расширенные 32-битные и 64-битные целочисленные операции
  • AVX-512 Integer Fused Multiply Add (IFMA) - объединенное сложение умножения для 512-битных целых чисел.
  • AVX-512 Vector Byte Manipulation Instructions (VBMI) добавляет инструкции перестановки векторных байтов которых нет в AVX-512BW.
  • AVX-512 Векторные инструкции нейронной сети Word variable precision (4VNNIW) - векторные инструкции для глубокого обучения.
  • AVX-512 Fused Multiply Accumulation Packed Single precision (4FMAPS) - векторные инструкции для глубокого обучения.
  • VPOPCNTDQ - количество бит, установленное на 1.
  • VPCLMULQDQ - умножение четверных слов без переноса.
  • AVX-512 Vector Neural Network Instructions (VNNI) - векторные инструкции для глубокого обучения.
  • AVX-512 Поле Галуа Новые инструкции (GFNI) - векторные инструкции для вычисления Поле Галуа.
  • AVX-512 Векторные инструкции AES (VAES) - векторные инструкции для кодирования AES.
  • AVX-512 Vector Byte Manipulation Instructions 2 (VBMI2) - загрузка байтов / слов, сохранение и объединение со сдвигом.
  • Битовые алгоритмы AVX-512 (BITALG) - байты / слова манипуляции с битами инструкции, расширяющие VPOPCNTDQ.

Для всех реализаций требуется только базовое расширение AVX-512F (AVX-512 Foundation), хотя все текущие процессоры также поддерживают CD (обнаружение конфликтов); вычислительные сопроцессоры будут дополнительно поддерживать ER, PF, 4VNNIW, 4FMAPS и VPOPCNTDQ, а процессоры для настольных ПК будут поддерживать VL, DQ, BW, IFMA, VBMI, VPOPCNTDQ, VPCLMULQDQ и т. д.

Обновленные инструкции SSE / AVX в AVX -512F использовать ту же мнемонику, что и версии AVX; они могут работать с 512-битными регистрами ZMM, а также будут поддерживать 128/256-битные регистры XMM / YMM (с AVX-512VL) и целочисленные операнды байта, слова, двойного слова и четверного слова (с AVX-512BW / DQ и VBMI).

ЦП с AVX-512

Подмножество AVX-512FCDERPF4FMAPS4VNNIWVLDQBWIFMAVBMIVBMI2VPOPCNTDQBITALGVNNIVPCLMULQDQGFNIVAES
Intel Knights Landing (2016)ДаДаНет
Intel Knights Mill (2017)ДаНетДаНет
Intel Skylake-SP, Skylake-X (2017)НетДаНет
Intel Cannon Lake (2018)ДаНет
Intel Cascade Lake-SP (2019)НетДаНет
Intel Ice Lake (2019)Да

По состоянию на 2020 год нет AM D, поддерживающие AVX-512, и AMD еще не опубликовала планы по поддержке AVX-512.

Компиляторы, поддерживающие AVX-512

  • GCC 4.9 и новее
  • Clang 3.9 и новее
  • ICC 15.0.1 и новее
  • Microsoft Компилятор C ++ Visual Studio 2017
  • Java 9
  • Go 1.11
  • Julia

Приложения

  • Подходит для вычислений с плавающей запятой в мультимедийных, научных и финансовые приложения (AVX2 добавляет поддержку целочисленных операций).
  • Увеличивает параллелизм и пропускную способность в вычислениях с плавающей запятой SIMD.
  • Снижает нагрузку на регистры из-за
  • Повышает производительность программного обеспечения Linux RAID (требуется AVX2, AVX недостаточно)

Программное обеспечение

  • Начиная с версии 3.11 и новее, минимальные требования StarCitizens были обновлены для использования AVX, игровой движок в настоящее время использует DirectX 11, но разрабатывает поддержку API Vulkan для использования в его модифицированном Lumberyard Engine.
  • Blender использует AVX2 в циклах движка рендеринга.
  • Botan использует как AVX, так и AVX2, когда доступно т o ускорять некоторые алгоритмы, такие как ChaCha.
  • Crypto ++ использует как AVX, так и AVX2, если они доступны для ускорения некоторых алгоритмов, таких как Salsa и ChaCha.
  • OpenSSL использует криптографические функции, оптимизированные для AVX и AVX2, начиная с версии 1.0.2. Эта поддержка также присутствует в различных клонах и форках, таких как LibreSSL
  • Prime95 / MPrime, программное обеспечение, используемое для GIMPS, начатое с использованием инструкций AVX, начиная с версии 27.x.
  • dav1d AV1 декодер может использовать AVX2 на поддерживаемых ЦП.
  • dnetc, программное обеспечение, используемое distribution.net, имеет ядро ​​AVX2, доступное для его проекта RC5 и скоро выпустит один для своего проекта OGR-28.
  • Einstein @ Home использует AVX в некоторых из своих распределенных приложений, которые ищут гравитационные волны.
  • Folding @ home использует AVX на вычислительных ядрах реализован с помощью библиотеки GROMACS.
  • Horizon: Zero Dawn Использует AVX1 в Decima (игровой движок) и является движком, который использует игра.
  • RPCS3, открытый исходный код Эмулятор PlayStation 3, использует инструкции AVX2 и AVX-512 для эмуляции игр PS3.
  • Интерфейс сетевого устройства, протокол IP-видео / аудио, разработанный NewTek для производства прямых трансляций, использует AVX и AVX2 для повышения производительности ormance.
  • TensorFlow, начиная с версии 1.6 и тензорных потоков выше, требует, чтобы ЦП поддерживал как минимум AVX.
  • x264, x265 и VTM видеокодеры могут использовать AVX2 или AVX-512 для ускорения кодирования.
  • Различные майнеры на базе ЦП криптовалюты (например, пулеры для биткойнов и Litecoin ) используют AVX и AVX2 для различных процедур, связанных с криптографией, включая SHA-256 и scrypt.
  • libsodium использует AVX в реализации скалярного умножения для Curve25519 и Ed25519 алгоритмы, AVX2 для BLAKE2b, Salsa20, ChaCha20 и AVX2 и AVX-512 в реализации Argon2
  • libvpx эталонная реализация кодировщика / декодера VP8 / VP9 с открытым исходным кодом, использует AVX2 или AVX-512, если они доступны.
  • FFTW может использовать AVX, AVX2 и AVX-512, когда они доступны.
  • , программный модуль визуализации OpenGL в Mesa, использующий инфраструктуру Gallium и LLVM, использует AVX2 когда доступно.
  • glibc использует AVX2 (с FMA ) для оптимизированной реализации (т.е. expf, sinf, powf, atanf, atan2f) различных математических функций в libc.
  • Ядро Linux может использовать AVX или AVX2 вместе с AES-NI в качестве оптимизированной реализации криптографического алгоритма AES-GCM.
  • Ядро Linux использует AVX или AVX2, если они доступны, в оптимизированная реализация нескольких других криптографических шифров: Camellia, CAST5, CAST6, Serpent, Twofish и другие примитивы: Poly1305, SHA-1, SHA-256, SHA-512, ChaCha20.
  • POCL, a переносимый язык вычислений, который обеспечивает реализацию OpenCL, по возможности использует AVX, AVX2 и AVX512.
  • .NET Core и .NET Framework могут использовать AVX, AVX2 через общее пространство имен System.Numerics.Vectors.
  • .NET Core, начиная с версии 2.1 и более широко после версии 3.0, может напрямую использовать все встроенные функции AVX, AVX2 через Sy STEM.Runtime.Intrinsics.X86пространство имен.
  • EmEditor 19.0 и выше использует AVX-2 для ускорения обработки.
  • Софтсинт Massive X Native Instruments требует AVX.
  • Microsoft Teams использует инструкции AVX2 для создания размытого или настраиваемого фона за участниками видеочата.
  • simdjson a JSON библиотека синтаксического анализа использует AVX2 для повышения скорости декодирования.

Разгон

Поскольку инструкции AVX шире и выделяют больше тепла, в процессорах Intel предусмотрены меры по снижению предела частоты Turbo Boost при выполнении таких инструкций. Регулировка делится на три уровня:

  • L0 (100%): нормальный предел турбо-ускорения.
  • L1 (~ 85%): предел «AVX boost». Мягкий запуск 256-битными «тяжелыми» инструкциями (единица с плавающей запятой: математика FP и целочисленное умножение). Жестко запускается «легкими» (всеми остальными) 512-битными инструкциями.
  • L2 (~ 60%): предел «ускорения AVX-512». Мягко запускается 512-битными тяжелыми командами.

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

Понижение частоты означает, что использование AVX в смешанной рабочей нагрузке с процессором Intel может привести к снижению частоты, несмотря на то, что это быстрее в «чистом» контексте. Избегайте использования широких и тяжелых инструкций, чтобы свести к минимуму воздействие в этих случаях. AVX-512VL позволяет использовать 256-битные или 128-битные операнды в AVX-512, что делает его разумным по умолчанию для смешанных нагрузок.

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-06-10 02:09:57
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте