ARM NEON: Какие пары инструкций должны ждать обратной записи?
В документации ARM NEON говорится:
[...] некоторым парам команд, возможно, придется подождать, пока значение не будет записано обратно в регистровый файл.
Я не сталкивался со списком, который определяет пары команд, которые могут использовать перенаправленные результаты, и пары команд, которые должны ждать обратной записи.
Кто-нибудь знает таблицу или документацию, в которой перечислены эти пары?
3 ответа
В общем, то, что вы разумно ожидаете, вперед, вперед. vmul.f32 перенаправляет на vadd.f32 и тому подобное.
Я не верю, что точные пути пересылки точно задокументированы в любом месте так, как вы ищете. Во всяком случае, я их не нашел. Если вы их найдете, обязательно сообщите нам, где. Конечно, для любой данной пары инструкций не слишком сложно определить, происходит ли переадресация, но это не общее решение. Сожалею.
Целое число умножается накапливается.
Раздел в конце http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k/ch16s06s03.html полезен:
Если умножение-накопление следует за умножением или другим умножением-накоплением и зависит от результата этой первой инструкции, то, если зависимость между обеими командами имеет одинаковый тип и размер, процессор использует специальную пересылку с накопителем множителя. Эта специальная пересылка означает, что команды умножения могут выдаваться последовательно, потому что результат первой инструкции в N5 пересылается в накопитель второй команды в N4. Если размер и тип инструкций не совпадают, то в N3 требуется Dd или Qd. Это относится к комбинациям команд умножения-накопления VMLA, VMLS, VQDMLA и VQDMLS и команд умножения VMUL и VQDMUL
Не думайте, что умножение с плавающей запятой накапливает работу таким же образом. Я не использовал инструкции NEON с плавающей запятой для чего-то критически важного для производительности, поэтому я не могу предложить здесь никакого опыта, но убедитесь, что вы прочитали и поняли примечание в конце http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k/BCGDCECC.html
Кто-нибудь знает таблицу или документацию, в которой перечислены эти пары?
Эти пары более 9000, и все они не могут быть перечислены.
Например:
VADD.F32 q0,q0,q1
VMUL.F32 q3,q0,q2
первая инструкция записывает результат в 4-м цикле, в то время как вторая команда требует его (q0) в качестве источника во 2-м цикле, так как источник еще не готов, но между этими двумя инструкциями есть остановка (или "дыра" в конвейере),
Для расчета этих киосков вы можете использовать следующий онлайн-инструмент:
http://pulsar.webshaker.net/ccc/result.php?lng=us