CNXSoft: пост от гостя Blu о плате для разработчиков Baikal T1 и SoC, одной из последних платформ потребительского класса MIPS.
Нам потребовалось много времени, чтобы начать писать эту статью, хотя уже несколько месяцев мы тестировали процессор и есть выводы, которыми стоит поделиться с другими разработчиками. То, что нас удерживало – это мыслью о том, что это, возможно, один из последних образцов процессоров потребительского класса с первоклассным ISA, когда-то перевернувший мир процессоров. Отсюда смешанные чувства – частично печали, частично нерешительность – чтобы не оценить несправедливо, возможно, последнее, в своем роде, устройство. С такими чувствами мы взялись за эту статью. Но, для начала, короткая личная история.
Пару лет назад мы с одним из наших товарищей обсуждали архитектуры процессоров и гипотезы о будущих достижениях в отрасли. Тогда мы упомянули о том, что последний MIPS P5600 Imagination Technologies – MIPS32r5 – разместил интересное расширение SIMD – ранее невидимое в мире MIPS. Нас впечатлили документы для этого расширения – MIPS SIMD Architecture (MSA). Мы обсудили, как P5600 нашел свой путь в SoC российского поставщика полупроводников Baikal Electronics и как они выпускали плату для разработки, которая, из-за производства ограниченной серией, была бы недоступна простым разработчикам.
Перенесемся в это лето, когда мы получили сообщение от нашего друга – он находился в то время в Санкт-Петербурге, Россия, и, просматривая один интернет-магазин, обнаружил плату Baikal T1 BFK 3.1 , стоимостью около 500 евро. Если вы когда-либо хотели ее получить, сейчас самое время.
Разве только мы хотим этого? Последний MIPS. Наш опыт пользования платой Imagination CI20, в которой было реализовано приложение Ingenic JZ4780 SoC – двухъядерная реализация MIPS32r2, был смешанным. У нас были более высокие ожидания от SoC, по нашему мнению, ни поставщик SoC, ни Imagination не оправдали ожидания пользователей. Единственная интересная часть этого SoC, с нашей точки зрения, это полноценный стек GLESv2/EGL для стареющего SGX540. То, что мы ожидаем на этот раз, это «более содержательный» MIPS, которое был бы ближе к современному уровню ISA, и P5600 был именно таким.
Итак, да, мы очень хотели заполучить этот процессор. Но цена была довольно высока, поэтому мы немного колебались. На что наш друг предложил подарить нам его. [Огромное спасибо ему, за доброту и щедрость!]
BFK 3.1 – это плата sub-uATX, в форм-факторе flexATX – немного больше, чем mini-ITX. Это означает, что он компактный, не такой как RPi, заметьте, но все же. Baikal T1 является компактным SoC – не намного большим, чем Ingenic JZ4780. Последний – 17×17 мм BGA390 (40 нм), против 25×25 мм BGA576 (28 нм) для T1. Но, T1 – это правильный SoC, который содержит все необходимое для небольшого универсального компьютера (без GPU), чего и добивается BFK 3.1. В сочетании с универсальным MCU STM32F205 (ARM Cortex-M3 @ 120MHz), T1 позволяет использовать версию с двумя чипами. Помимо формы SoC и его компаньона MCU, в BFK 3.1 размещается разъем PCIe x16 коннектор (4x активные полосы), слот SO-DIMM, разъем питания ATX, 2x 1 Гбит Ethernet и 2x SATA 3 разъема, USB2.0, UART (через мини-USB), это то, что кажется USB OTG, несколькими JTAG и даже разъемом RPi GPIO – остальная, верхняя часть платы, практически чистая. Есть еще один разъем – для дополнительного 10Gb Ethernet, но это, скорее, курьез с нашей точки зрения.
Подача питания BFK 3.1 осуществляется через 24-контактный разъем ATX – без блока питания для любого типа, но у нас также имелся 20-контактный ATX picoPSU (80 Вт DC-DC , 12 В вход) и запасной DC-DC 12В-конвертер (60 Вт). У нас также был оставшийся DDR3 SO-DIMM на 4 ГБ из выведенного из эксплуатации ноутбука, тоже есть RAM. «Небольшая» деталь ускользнула от нашего внимания – SO-DIMM был разновидностью 1333 мегатранзакции в секунду (667 МГц), тогда как плата заняла 1600 мегатранзакции в секунду (800 МГц) – поэтому первая загрузка платы заставила нас задуматься о контроллере RAM.
Плата оснащена “неподходящий” SO-DIMM @ 667 МГц
Одно посещение местного магазина и плата была усовершенствована отличной DDR3 на 8 ГБ.
Еще одна незначительная деталь о оперативной памяти, первоначально ускользнувшая из нашего внимания и не имеющая решающего значения для загрузки платы, о которой мы узнали только после первой загрузки: у SoC была 32-разрядная RAM-шина, это половина емкости 64-битного DIMM. Возможно, можно было бы увидеть полную емкость DIMM – мы не инженеры по аппаратной части, чтобы знать такие вещи, а дизайнеры BFK 3.1 явно не позаботились об этом. Что немного прискорбно для платы для разработчиков. Ну ладно – вернемся к «4 ГБ ОЗУ».
Кстати, как оказалось, нам действительно нужна оперативная память, так как для раскрытия полного потенциала P5600 у нас была компиляторная сборка, а мы всегда делали сборку самостоятельно, когда это было возможно. Но, об этом дальше.
Плата поставляется с Busybox в SPI-flash, а Baikal Electronics предоставляет две версии образов Debian Stretch с ядром 4.4 для повседневного использования с диска SATA. Все доступные загрузочные носители доступны через самый чистый интерфейс меню U-Boot, который когда либо нас встречался.
Приечание: помимо использования образа Debian на SSD, все взаимодействия с BFK 3.1 выполнялись без участия ПК – представленный выше скриншот – из нашего надежного chromebook.
Обязательный сброс основных настроек:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
blu@baikal:~$ uname -a Linux baikal 4.4.100-bfk3 #4 SMP Thu Feb 15 17:25:02 MSK 2018 mips GNU/Linux blu@baikal:~$ blu@baikal:~$ cat /proc/cpuinfo system type : Baikal-T Generic SoC machine : Baikal-T1 BFK3 evaluation board processor : 0 cpu model : MIPS P5600 V3.0 FPU V2.0 BogoMIPS : 1196.85 wait instruction : yes microsecond timers : yes tlb_entries : 576 extra interrupt vector : yes hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb] isa : mips1 mips2 mips32r1 mips32r2 ASEs implemented : vz msa eva xpa shadow register sets : 1 kscratch registers : 3 package : 0 core : 0 VCED exceptions : not available VCEI exceptions : not available processor : 1 cpu model : MIPS P5600 V3.0 FPU V2.0 BogoMIPS : 1196.85 wait instruction : yes microsecond timers : yes tlb_entries : 576 extra interrupt vector : yes hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb] isa : mips1 mips2 mips32r1 mips32r2 ASEs implemented : vz msa eva xpa shadow register sets : 1 kscratch registers : 3 package : 0 core : 1 VCED exceptions : not available VCEI exceptions : not available blu@baikal:~$ |
Рассматривало ли ядро это как машину MIPS32r2 или оно использовало расширения адресов – это выходит за рамки первого знакомства с устройством. Нам хотелось изучить производительность uarch, и пока компиляторы были в курсе истинных возможностей ISA процессора, я был установлен.
Расширение VZ – это вещь для виртуализации – и далека от наших интересов. EVA и XPA расширения адресации – расширенный виртуальный адрес и расширенный физический адрес, соответственно. Первый позволяет более эффективное сопоставление виртуального пространства между ядром и пользовательским пространством для 32-битного/4 ГБ пространства для обработки адресов. И последнее – это расширение физического адреса. Из руководства P5600:
Расширенный физический адрес (XPA), который позволяет увеличить физический адрес от 32 бит до 40 бит.
Очевидно, что оба расширения адресации могут быть полезны для разработчиков ядра.
Как насчет производительности FS?
1 2 3 4 5 6 |
root@baikal:/home/blu# hdparm -tT /dev/sda1 /dev/sda1: Timing cached reads: 2352 MB in 2.00 seconds = 1176.26 MB/sec Timing buffered disk reads: 1206 MB in 3.00 seconds = 401.89 MB/sec root@baikal:/home/blu# |
Как говорят мудрые люди, «приличная производительность SATA будет использоваться для сборки».
И, наконец, наблюдение, связанное с прерываниями, которое может помочь нам получить более чистые результаты бенчмаркинга:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
blu@baikal:~$ cat /proc/interrupts CPU0 CPU1 1: 16906 9097 MIPS GIC Local 1 timer 2: 0 0 MIPS GIC Local 0 watchdog 8: 5428 0 MIPS GIC 8 IPI resched 9: 0 4970 MIPS GIC 9 IPI resched 10: 4693 0 MIPS GIC 10 IPI call 11: 0 15118 MIPS GIC 11 IPI call 23: 0 0 MIPS GIC 23 be-apb 31: 0 0 MIPS GIC 31 timer0 38: 0 0 MIPS GIC 38 1f200000.pvt 40: 0 0 MIPS GIC 40 1f046000.i2c0 41: 191 0 MIPS GIC 41 1f047000.i2c1 47: 5 0 MIPS GIC 47 dw_spi0 48: 0 0 MIPS GIC 48 dw_spi1 55: 2464 0 MIPS GIC 55 serial 56: 10 0 MIPS GIC 56 serial 63: 0 0 MIPS GIC 63 dw_dmac 71: 21832 0 MIPS GIC 71 1f050000.sata 75: 0 0 MIPS GIC 75 xhci-hcd:usb1 79: 652 0 MIPS GIC 79 eth1 87: 0 0 MIPS GIC 87 eDMA-Tx-0 88: 0 0 MIPS GIC 88 eDMA-Tx-1 89: 0 0 MIPS GIC 89 eDMA-Tx-2 90: 0 0 MIPS GIC 90 eDMA-Tx-3 91: 0 0 MIPS GIC 91 eDMA-Rx-0 92: 0 0 MIPS GIC 92 eDMA-Rx-1 93: 0 0 MIPS GIC 93 eDMA-Rx-2 94: 0 0 MIPS GIC 94 eDMA-Rx-3 95: 0 0 MIPS GIC 95 MSI PCI 96: 0 0 MIPS GIC 96 AER PCI 103: 0 0 MIPS GIC 103 emc-dfi 104: 0 0 MIPS GIC 104 emc-ecr 105: 0 0 MIPS GIC 105 emc-euc 134: 0 0 MIPS GIC 134 be-axi ERR: 0 blu@baikal:~$ |
Обратите внимание, что все последовательные и SATA-прерывания обслуживаются 1-м ядром? Мы могли бы это использовать.
Теперь самое интересное! Поскольку мы фанаты контрольных тестов, мы, как правило, запускаем несколько мини-тестов производительности при тестировании новых микроархитектур – один «общего назначения» и один на «устойчивой fp». Оба они были однопоточными, поэтому мы могли сосредоточиться на деталях uarch.
К сожалению, передо нами было последнее препятствие ‒ Debian Stretch поставляется с gcc-6.3, который не знает о расширении MSA в P5600. Для этого нам понадобился еще один крупный компилятор – gcc-7.3 полностью осведомленный новым набором инструкций, и поэтому следующим шагом было создание gcc-7.3 для платформы. Очень просто, как нам казалось.
У нас возникли трудности с пониманием того, что самозагружаемая сборка по умолчанию для компилятора завершилась неудачей с «незаконной инструкцией» на этапе начальной загрузки. Так обстоит дело с g ++ – 7.3 в Debian Stretch при создании самостоятельной --target=mipsel-linux-gnu
на BFK 3.1, и именно поэтому мы обратились к списку рассылки gcc-dev с неправильной постановкой вопроса, к которому, к счастью, мы получил полезные ответы.
Вернемся к BFK 3.1, где в итоге мы получили хорошую сборку g ++ – 7.3 через следующую конфигурацию, в значительной степени скопированную с g ++ – 6.3 Debian:
1 2 |
$ CPATH=/usr/include/mipsel-linux-gnu/ LIBRARY_PATH=/usr/lib/mipsel-linux-gnu/ ../gcc-7.3.0/configure --enable-languages=c,c++ --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --disable-multiarch --with-arch-32=mips32r2 --with-fp-32=xx --with-madd4=no --with-lxc1-sxc1=no --enable-checking=release --build=mipsel-linux-gnu --host=mipsel-linux-gnu --target=mipsel-linux-gnu $ CPATH=/usr/include/mipsel-linux-gnu/ LIBRARY_PATH=/usr/lib/mipsel-linux-gnu/ make -j2 |
Что дало нам:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
blu@baikal:~$ /usr/bin/g++ --version g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516 Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. blu@baikal:~$ g++ --version g++ (GCC) 7.3.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. blu@baikal:~$ |
Ура, поддержка компилятора MSA получена! Теперь мы могли сделать все, что хотели (и не только).
Но, для начала, удивившие нас результаты микро-теста, без SIMD, – сюжет Мандельброта, написанный на языке Brainfuck, и пропущенный через доморощенного переводчика Brainfuck.
Выполнение этого до и после обновления компилятора показало следующие результаты:
Brainstorm Mandelbrot – три версии кода, через два компилятора:
g ++ – 6.3.0: 0m43.539s (vanilla)
g ++ – 6.3.0: 0m38.176s (alt)
g ++ – 6.3.0: 0m38.176s (alt ^ 2)
g ++ – 7.3.0: 0m36.003s (vanilla)
g ++ – 7.3.0: 0m36.561s (alt)
g ++ – 7.3.0: 0m31.852s (alt ^ 2)
Обратите внимание, как для одинакового кода и одинаковых флагов оптимизации два компилятора произвели дельту производительности для результирующего двоичного файла с разницей 20% в пользу нового g++? Это не связано новыми, более умными инструкциями P5600, используемыми новым компилятором – нет, сгенерированные коды в обоих случаях использовали один и тот же ISA. Просто новый компилятор произвел значительно более качественный код – меньше ветвей, больше линейного потока управления.
Эти результаты g ++ 7.3 прочно расположили P5600 между AMD A8-7600 и Intel Core2 Duo P8600 в нормализованных по времени графиках производительности Mandelbrot (где Penryn также использует пользовательский компилятор Apple clang, который обычно превосходит gcc при таком сочетание процессора и задачи).
В тесте тактового сигнала, Р5600 также получил преимущество над Cortex-A15, который, по нашему мнению, является самым близким конкурентом в категории P5600. P5600, или, возможно, его воплощение в Baikal T1, не оправдал ожиданий. Если это ядро достигнет тактового сигнала ближе к 2 ГГц, мы увидим гораздо более интересные результаты с абсолютной производительностью.
Пришло время посмотреть, как P5600 работает на fp32 SIMD. Для этого используем матричный множитель SGEMM. Использование новой MSA ISA потребовало минимальных усилий, частично благодаря поддержке gcc для общих векторов, частично благодаря простоте MSA ISA. Версия MSA кода matmul, получившая название «ALT = 8», заняла менее часа (кодирование и настройка), и привела к ~ 3,9 флопа/часов для небольшого, подходящего для кэша набора данных (матрицы 64×64) и 2.1 флопу/часам для большого набора данных (матрицы 512×512). Эти результаты надежно поместили P5600 между Intel Merom и Intel Penryn для небольшого набора данных и немного ниже уровня ARM Cortex-A72 и Intel Merom для большого набора данных. Большой набор данных, однако, показал довольно неустойчивое поведение-время выполнения значительно варьировалось даже при закреплении на 2-м ядре. Было похоже, что подсистема памяти, прошедшая L2D, вела себя непоследовательно, делая 128-битные обращения. Это требует дальнейшего рассмотрения в другой раз.
Но, закончим обзор BFK 3.1 и дадим наше субъективное, беспристрастное мнение.
Наши впечатления от P5600 в Baikal T1 в значительной степени положительны. Используемый нами ограниченный набор микро-тестов в качестве основы, приводит к выводу, что эта микроархитектура, в значительной степени, обеспечивает свои обещания – хороший IPC и хорошая пропускную способность SIMD за такт и может считаться прямым конкурентом лучших 32-битных решений ARM Cortex. Тем не менее, Baikal T1 может использовать более высокий тактовый сигнал, что аозволит ему встать в один ряд в группе линейки Core2 от Intel и линейки Cortex-A12 / 15/17 от ARM. Что, было бы не чем иным, как великим достижением для Baikal Warrior (очень метко название проекта P-series MIPS “воином” ‒ так как ему пришлось бы бороться за выживание своего ISA). Возможно мы когда-нибудь доживем до очередной Baikal T ‒ серии, так, Baikal Electronics разрабатывает свои Baikal M ‒ серии-ARM Cortex-A57 решения.
MIPS однажды перевернул мир процессоров. Сможет ли она пережить свой самый темный час (по крайней мере, на Западе ‒ на Востоке у китайцев есть свой Loongson) и шагнуть в Ренессанс, или она погибнет в забвении? Нам, например, хотел бы увидеть первое, но мы просто старый чудаки, а старые чудаки не очень часто говорят в эти дни.
Выражаем свою благодарность источнику с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.