Создает ли следующий набор инструкций ARM задержки? - PullRequest
0 голосов
/ 05 декабря 2010

Программируя ARM11MP Vfpu, я просмотрел документы и обеспокоен тем, что при работе с четырехкомпонентным точечным произведением (как часть умножения матрицы 4x4) следующее будет плохо останавливаться


  fmuls   s0, s0, s4
  fmacs   s0, s1, s5
  fmacs   s0, s2, s6
  fmacs   s0, s3, s7

Шаг накопления генерирует здесь ларьки? Если это так, мне придется по-настоящему изменить ситуацию, так как я получаю только 32 отдельных регистра, а затем беру 9 как есть. Кроме того, я мог бы настроить векторный регистр, чтобы сделать это в 1 инструкции, но мне интересно, будут ли стоить эти 3 цикла инструкций, так как мне пришлось бы сбрасывать их почти немедленно для сохранения в памяти, если я не переполнен в регистры ARM , Публикация из дома без моей реальной учетной записи здесь ...

1 Ответ

1 голос
/ 06 декабря 2010

Я совсем не знаком с ARM, так что вы должны взять это с небольшим количеством соли.Этот ответ основан на 20-минутном поиске документации на моем телефоне.Могут быть некоторые вещи, которые я пропускаю, поэтому это может быть неправильно.

В любом случае, я считаю, что да, это должно привести к остановке конвейера.Сопроцессор VFP имеет 8-ступенчатый конвейер, но из-за «пересылки» (каждая инструкция зависит от результата предыдущей инструкции) число остановленных циклов должно быть уменьшено до 7 для каждой инструкции.Тем не менее, с учетом 4 инструкций, которые у вас есть, вы остановитесь примерно на 28 циклах, что не очень хорошо.Это также не учитывает время, необходимое для загрузки регистров, что может усугубить проблему.

Вероятно, вы можете улучшить производительность, чередуя "инструкции fld" с инструкциями fmacs.

Проверкадля получения дополнительной информации:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACBBDCE.html

Результаты инструкции "fld" должны быть доступны в течение 4 циклов, что означает, что вы могли бы сделать что-то вроде:

fld s0
fld s4
fld s1
fld s5
fmuls s0, s0, s4
fld s2
fld s6
fld s3
fld s7
fmacs s0, s1, s5
famcs s0, s2, s6
fmacs s0, s3, s7

Тогда вы можете уменьшить общее количество остановленных циклов до 17.

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

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

...