2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4, 5
 
 Re: Перемножение матриц в С++
Сообщение02.12.2017, 17:26 
На всякий случай. На 86/186/286 даже sub reg, 2 заменяли на два dec reg и старались по возможности использовать loop. Но с 386 происходит отход от dec/inc/loop в пользу sub/add/jc (c — condition). И иногда компиляторы, чтобы особо не думать, заменяют dec/inc на sub/add.

За примеры «test vs cmp» спасибо. Но они не по теме ветки. Я всегда, если алгоритм позволяет, делаю цикл по уменьшению смещения, пока оно не станет равным нулю. Это конечно для типичного случая, когда кол-во повторений известно заранее.

Спаривание двух команд… это понятно. Но мы же не пустой цикл гонять планируем. Между dec и jcond могут идти инструкции; также они могут идти перед dec. Вопрос для меня не простой. Детали мне не известны.



Тип данных double, адресуемся к блокам по 128/256/512 (SSE/AVX/AVX512; под Windows по умолчанию используют не fpu, а SSE/AVX). Как dec/inc приспособить?

 
 
 
 Re: Перемножение матриц в С++
Сообщение02.12.2017, 17:52 
GAA в сообщении #1271101 писал(а):
Как dec/inc приспособить?
Да не знаю как. Индексная адресация позволяет просто обращаться лишь к 1,2,3,4,5,8,9 байтовым полям, вот с ними и можно inc/dec применять, с остальными невыгодно. А уж для циклов с линейным проходом массивов это вообще излишне, проще делать ++/-- индекса, которое превращается в add/sub константы длины поля. Так что не понял Вашего вопроса, он похоже о чём-то другом.

 
 
 
 Re: Перемножение матриц в С++
Сообщение02.12.2017, 18:49 
В общем, это я не понял, что Вы с bondkim137 обсуждаете. Как Вы выше написали, можно двигаться по элементам, уменьшая смещение при помощи sub. Условие прекращения цикла — равенство смещения нулю. Тут действительно нет лишней операции сравнения. loop не применяем — используем jnz или аналог. Внутренний цикл будет повторяться очень много раз (а при блочной реализации не только самый внутренний), поэтому какой-то выигрыш в скорости выполнения будет.

-- Сб 02.12.2017 17:54:06 --

И компиляторы довольно часто заменяют цикл по возрастанию индекса на цикл по убыванию (даже Delphi). Но я бы сразу писал на ЯВУ так, чтобы потом было легче переписывать на asm. Т.е. сразу по убыванию индекса.

 
 
 
 Re: Перемножение матриц в С++
Сообщение02.12.2017, 19:43 
GAA
Да я придрался к не совсем точной формулировке bondkim137.
Причём сначала даже подумал что уменьшение и увеличение указателя будут одинаковы по скорости. Но потом и он расписал по шагам и сам проверил, да, уменьшение часто выгоднее. Исключения есть, но редки, например когда тупо нельзя идти в обратную сторону, или неудобна индексная адресация (шаг сильно разный в разных массивах, или непостоянный, или не 1,2,4,8, или ...).
А вот его утверждение что перед условным переходом dec всегда лучше чем cmp (потому что первое бесплатно, а второе нет) - недостаточно корректно сформулировано, подразумевалась как раз экономия одной команды, я же подумал что речь про отличие в спаривании этих команд с условным переходом.
В общем мы уже разобрались. Фактически я зря придрался к неточностям формулировок.

 
 
 [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4, 5


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group