2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5
 
 Re: Перемножение матриц в С++
Сообщение02.12.2017, 17:26 
Заслуженный участник


12/07/07
4438
На всякий случай. На 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 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение02.12.2017, 18:49 
Заслуженный участник


12/07/07
4438
В общем, это я не понял, что Вы с bondkim137 обсуждаете. Как Вы выше написали, можно двигаться по элементам, уменьшая смещение при помощи sub. Условие прекращения цикла — равенство смещения нулю. Тут действительно нет лишней операции сравнения. loop не применяем — используем jnz или аналог. Внутренний цикл будет повторяться очень много раз (а при блочной реализации не только самый внутренний), поэтому какой-то выигрыш в скорости выполнения будет.

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

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

 Профиль  
                  
 
 Re: Перемножение матриц в С++
Сообщение02.12.2017, 19:43 
Заслуженный участник


20/08/14
11065
Россия, Москва
GAA
Да я придрался к не совсем точной формулировке bondkim137.
Причём сначала даже подумал что уменьшение и увеличение указателя будут одинаковы по скорости. Но потом и он расписал по шагам и сам проверил, да, уменьшение часто выгоднее. Исключения есть, но редки, например когда тупо нельзя идти в обратную сторону, или неудобна индексная адресация (шаг сильно разный в разных массивах, или непостоянный, или не 1,2,4,8, или ...).
А вот его утверждение что перед условным переходом dec всегда лучше чем cmp (потому что первое бесплатно, а второе нет) - недостаточно корректно сформулировано, подразумевалась как раз экономия одной команды, я же подумал что речь про отличие в спаривании этих команд с условным переходом.
В общем мы уже разобрались. Фактически я зря придрался к неточностям формулировок.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4, 5

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group