Так что давайте просто попробуем. NUCLEO-F767ZI
Cortex-M7 в целом:
Prefetch Unit
The Prefetch Unit (PFU) provides:
1.2.3
• 64-bit instruction fetch bandwidth.
• 4x64-bit pre-fetch queue to decouple instruction pre-fetch from DPU pipeline operation.
• A Branch Target Address Cache (BTAC) for the single-cycle turn-around of branch predictor state and target address.
• A static branch predictor when no BTAC is specified.
• Forwarding of flags for early resolution of direct branches in the decoder and first execution stages of the processor pipeline.
Для этого теста предсказание ветвления мешает, поэтому отключите:
Установите ACTLR в 00003000 ( шестнадцатеричное, большинство чисел здесь шестнадцатеричные)
Не вижу, как отключить PFU, так или иначе, не ожидайте, что у вас будет такой контроль.
Поэтому мы ожидаем, что предварительная выборка будет читать 64 бита время, 4 инструкции на выровненной границе.
С ST
Бит DBANK устанавливается для одного банка
Предварительная выборка инструкций
В случае режима с одним банком (бит опции nDBANK установлено) 256 битов, представляющих 8 команд из 32 битов по 16 команд из 16 битов в соответствии с запущенной программой. Таким образом, в случае последовательного кода, по крайней мере, 8 циклов ЦП необходимы для выполнения предыдущего чтения строки инструкций.
Таким образом, ST собирается превратить это в 256-битные или 16 инструкций
Использование таймера на ручке. Я работаю на частоте 16 МГц, поэтому fla sh находится в нулевом состоянии ожидания.
08000140 <inner>:
8000140: 46c0 nop ; (mov r8, r8)
8000142: 46c0 nop ; (mov r8, r8)
8000144: 46c0 nop ; (mov r8, r8)
8000146: 46c0 nop ; (mov r8, r8)
8000148: 46c0 nop ; (mov r8, r8)
800014a: 46c0 nop ; (mov r8, r8)
800014c: 3901 subs r1, #1
800014e: d1f7 bne.n 8000140 <inner>
00120002
Итак, 12 часов на л oop. Две предварительные выборки из ARM, первая становится одной выборкой ST. Должно быть нулевое состояние ожидания. Обратите внимание, что это AXIM
Если я уменьшу количество nops, оно останется равным 0x1200xx, пока здесь не будет:
08000140 <inner>:
8000140: 46c0 nop ; (mov r8, r8)
8000142: 46c0 nop ; (mov r8, r8)
8000144: 3901 subs r1, #1
8000146: d1fb bne.n 8000140 <inner>
00060003
Выбор одной руки вместо двух. Время сокращается вдвое, поэтому предварительная выборка доминирует в нашей производительности.
08000140 <inner>:
8000140: 46c0 nop ; (mov r8, r8)
8000142: 46c0 nop ; (mov r8, r8)
8000144: 46c0 nop ; (mov r8, r8)
8000146: 46c0 nop ; (mov r8, r8)
8000148: 3901 subs r1, #1
800014a: d1f9 bne.n 8000140 <inner>
000 (zero wait states)
00120002
001 (1 wait state)
00140002
002 (2 wait states)
00160002
202 (2 wait states enable ART)
0015FFF3
Почему это повлияет на AXIM?
, поэтому каждое состояние ожидания добавляет 2 такта на л oop, есть два выборок на л oop, поэтому, возможно, каждая выборка заставляет st выполнить одну из 256-битных выборок, которая кажется нарушенной.
Переключиться на ITCM
00200140 <inner>:
200140: 46c0 nop ; (mov r8, r8)
200142: 46c0 nop ; (mov r8, r8)
200144: 46c0 nop ; (mov r8, r8)
200146: 46c0 nop ; (mov r8, r8)
200148: 3901 subs r1, #1
20014a: d1f9 bne.n 200140 <inner>
000
00070004
001
00080003
002
00090003
202
00070004
ram
00070003
Так что ITCM один, нулевое ожидание состояние, ART выключен 7 часов за l oop для 6 инструкций l oop с ответвлением. кажется разумным. Для этого крошечного теста включение ART с двумя состояниями ожидания возвращает нас к 7 на л oop.
Обратите внимание, что для ram этот код также работает на 7 на л oop. Давайте попробуем другую пару
00F
00230007
20F
00070004
Я не искал других предикторов ветвления, кроме BTA C
Первое, на что нужно обратить внимание: вы не хотите запускать MCU быстрее чем вам нужно, сжигает энергию, многие вам нужно добавить FL sh состояния ожидания, многие CPU и периферийные устройства имеют разные максимальные тактовые частоты, поэтому есть граница, где она становится нелинейной (занимает X тактовых циклов при медленных тактах частота, периферийные часы = тактовая частота процессора, есть место, где N раз быстрее N X тактов, чтобы сделать что-то, но одна или несколько границ, где требуется больше, чем N X, чтобы сделать что-то, когда тактовая частота процессора В N раз быстрее). Эта конкретная часть имеет эту нелинейную проблему. Если вы используете библиотеки из ST для установки часов, то вы, возможно, получаете худший случай из fla sh состояний ожидания, где, если вы настроите его и прочитаете документацию, вы сможете сбрить один или два / несколько.
Cortex-M7 имеет дополнительные кеши L1, на этот раз не связывался с ним, но у ST была эта вещь ART до того, как они появились, и я считаю, что они по крайней мере побеждают / отключают кэш i, улучшит ли это его или хуже иметь оба? Если он есть, тогда первое прошлое будет медленным, а остальное возможно быстрее даже в пространстве AXIM. Вы можете попробовать это. Кажется, помните, что они сделали что-то хитрое с ремешком на ядре процессора, было нелегко увидеть, как оно было побеждено, и это может быть не этот чип / ядро, но определенно был ST. M4 не имеет кеша, поэтому это должен быть M7, с которым я связывался (в частности, с этим).
Таким образом, краткий ответ: производительность не так уж и ужасна, если вы откажетесь от ИСКУССТВО и / или закончилась AXIM. ST реализовал fla sh таким образом, что интерфейс ITCM работает быстрее, чем AXIM. Мы можем увидеть эффект самой загрузки ARM, если вы включите предсказание ветвлений, вы также можете увидеть это, если включите его.
Нетрудно создать эталонный тест, который побеждает эти функции, так же, как вы можете сделать тест, который делает кеш L1 (или любой другой кеш) снижающим производительность. ART, как и любой другой кеш, делает производительность менее предсказуемой, и по мере того, как вы меняете код, добавляете строки, удаляете строки, производительность может прыгать в любом месте, без каких-либо изменений в результате.
В зависимости от процессора и выбор размеров и выравниваний производительность вашего кода может варьироваться путем добавления или удаления кода над чувствительными к производительности частями проекта, но это зависит от некоторых факторов, которые мы редко видим в.
Трудно сказать похоже, они утверждают, что АРТ снижает мощность. Я ожидал бы, что это увеличит власть, имея те srams на / такт. Не вижу очевидного, сколько вы сэкономите, если выключите fla sh и бегите от барана. Детали M7 на самом деле не предназначены для деталей с низким энергопотреблением, как некоторые детали STM32L, где вы можете получить единицы / десятки микроампер (микро, а не миллионы, если бы это было сделано).
Небольшое количество часов 0x70004 вместо 0x70000 приходится иметь дело с некоторыми накладными расходами на выборку, будь то ARM или ST или их комбинация. Чтобы увидеть производительность памяти / fla sh, вам необходимо отключить как можно больше функций, таких как прогнозирование ветвлений, кэши, которые вы можете отключить, и т. Д. c. В противном случае сложно измерить производительность, а затем сделать предположения о том, что делает флэш / память / шина. Я подозреваю, что все еще есть вещи, которые я не выключил, чтобы сделать точное измерение, и / или не могу выключить. И простые циклы nop (пробовали другие не nop инструкции, не меняли их) не скажут вам всего. Используя документы в качестве руководства, вы можете попытаться кэшировать sh ART или другие данные и посмотреть, какие попадания вам нужны.
Для кода, критичного к производительности, вы можете запустить из ОЗУ и избежать всех этих вопросов, я не искал его, но предположил, что эти части SRAM могут работать так же быстро, как процессор. Ответ не выскакивает у меня, вы можете понять его.
Обратите внимание, что мой тест на самом деле выглядит как
ldr r2,[r0]
inner:
nop
nop
nop
nop
sub r1,#1
bne inner
ldr r3,[r0]
sub r0,r2,r3
bx lr
, где выборка из синтистика находится только впереди и сзади. Перед веткой. Чтобы измерить ART, вам нужно выбрать время до перехода в ветвь для диапазона памяти, который не был прочитан, магически невозможно прочитать, что чем быстрее первое чтение в кэш, тем медленнее. Если я переместлю отсчет времени дальше, я смогу увидеть go от 0x7000A до 0x70027 для состояний ожидания от 0 до 15 с включенным ART. Это заметное снижение производительности веток в коде, который еще не был запущен / кэширован. Зная размер художественных выборок, должно быть легко сделать тест, который много скачет, и функция ART начинает не иметь значения.
Короткий ответ, ITCM - это другой интерфейс шины на ARM Ядро, ST реализовал их дизайн так, что есть выигрыш в производительности. Таким образом, даже если ART не включен, ITCM работает быстрее, чем AXIM (скорее всего, это шина ARM, а не ST fla sh). Если вы работаете на достаточно высоких тактовых частотах, чтобы добавить в состояние ожидания значения sh, то ART в основном может стереть их.