<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753931</guid>
        <pubDate>Tue, 19 Dec 2017 14:10:02 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753931</link>
        <description><![CDATA[Jin X: Возможно, это косяк программы для теста. Тем не менее, изменения были конкретно после замены [ecx] и [edx] на [ebp-...], так что не исключено :)]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753889</guid>
        <pubDate>Tue, 19 Dec 2017 08:06:56 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753889</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411737&view=findpost&p=3753656'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2017-12-17T11:09:47+00:00">17.12.17, 11:09</time></span><div class='quote '>А вот с ускорением после замены [ecx] на [ebp-4] ничего в голову не приходит? </div></div><br>
Во-первых, не факт, что есть реальное ускорение, а не глюки тестирования на уровне &quot;ловли блох&quot;, поскольку<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411737&view=findpost&p=3753656'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2017-12-17T11:09:47+00:00">17.12.17, 11:09</time></span><div class='quote '>Я немного оптимизировал измерялку, ...<br>
И замена [ecx] на [ebp-4] не влияет уже на скорость</div></div><br>
Во-вторых, не исключено, что в Intel Core <strong class='tag-b'>в общем случае</strong> действительно м.б. разница между этими вариантами. Это связано с проблемой &quot;чтения после записи&quot;, когда опережающее (или одновременное) чтение возможно только в том случае, когда адрес&#092;размер чтения не перекрывается с адресом&#092;размером предыдущей записи (пока она еще не выполнена). Поэтому осторожные AMD всегда сначала вычисляют реальные адреса чтения&#092;записи и выполняют опережающее чтение только в случае несовпадения адреса с предыдущей записью (отсюда и известная проблема AMD под названием AGI - address generation interlock). В нагло-бесшабашных P4, наоборот, никаких предварительных проверок совпадения адресов не делалось, и возможные ошибки устранялись за счет ужасно тормозного replay (перезапуска конвеера с места ошибочного чтения). А в P6, и особенно в Intel Core (судя по фичам в документации) используется некий предварительный анализ возможности&#092;невозможности совпадения адресов еще на стадии планирования, а не исполнения команд (коронная фраза - address to bee seemd not the same). При этом чтение&#092;запись с адресацией через один и тот же регистр, но с разными смещениями типа [ebp-4] и [ebp-8], как раз поддаются анализу на стадии планирования, т.к. конкретное значение регистра ebp тут роли не играет, и планировщик может сделать вывод о несовпадении адресов чисто по коду микрооперации (индекс регистра одинаковый, а смещения разные). Соотв-но, это может давать некоторый выигрыш за счет опережающего запуска команд чтения.<br>
<br>
PS: Но как в конкретном варианте #8 с ebp этот простой механизм не действует, т.к. push [ebp-4] пишет по адресу относительно esp, а следующий mov eax, [ebp-8] читает относительно ebp. Поэтому либо действуют какие-то другие механизмы, если выигрыш реально есть, либо его нет и все объясняется несовершенством тестирования.]]></description>
        <author>leo</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753859</guid>
        <pubDate>Mon, 18 Dec 2017 21:03:05 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753859</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>cppasm</strong>, я ж говорю: в <strong class='tag-b'>ecx</strong> предварительно загружается адрес <strong class='tag-b'>ebp-4</strong> (lea ecx,[ebp-4]).]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753790</guid>
        <pubDate>Mon, 18 Dec 2017 09:49:58 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753790</link>
        <description><![CDATA[cppasm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411737&view=findpost&p=3753656'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2017-12-17T11:09:47+00:00">17.12.17, 11:09</time></span><div class='quote '>А вот с ускорением после замены [ecx] на [ebp-4] ничего в голову не приходит?</div></div><br>
Приходжит в голову кэш.<br>
EBP у тебя же на стековый фрэйм указывает, правильно?<br>
Стэк скорее всего уже в кэш заружен, а другой участок памяти загружается при первом обращении если до этого не использовался.]]></description>
        <author>cppasm</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753667</guid>
        <pubDate>Sun, 17 Dec 2017 11:54:41 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753667</link>
        <description><![CDATA[Jin X: Если кому интересно (D7) :)<br>
<br>
<span class="b-attach" data-size="207893" data-hits="152" data-attach-id="57576" data-attach-post-id="3753667">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3753667&amp;attach_id=57576' title='Скачать файл' target='_blank'>SpdTest.zip</a> (, : 152)
		</span>]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753656</guid>
        <pubDate>Sun, 17 Dec 2017 11:09:47 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753656</link>
        <description><![CDATA[Jin X: Всё ясно, спасибо за разъяснение :victory: <br>
А вот с ускорением после замены <strong class='tag-b'>[ecx]</strong> на <strong class='tag-b'>[ebp-4]</strong> ничего в голову не приходит? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2017-12-17T11:42:24+00:00">17.12.17, 11:42</time></span></span><br>
А вообще, ты знаешь, <strong class='tag-b'>leo</strong>, всё-таки твой код (без цикла) работает быстрее, чем<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push [ecx]</div><div class="code_line">mov eax,[edx]</div><div class="code_line">pop [edx]</div><div class="code_line">mov [ecx],eax</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Я немного оптимизировал измерялку, получилось быстрее (и результаты стабильнее). Хотя в цикле получилось так же.<br>
И замена <strong class='tag-b'>[ecx]</strong> на <strong class='tag-b'>[ebp-4]</strong> не влияет уже на скорость :)<br>
Но в сравнении с<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push [ecx]</div><div class="code_line">mov eax,[edx]</div><div class="code_line">mov [ecx],eax</div><div class="code_line">pop [edx]</div></ol></div></div></div></div>получилось так же (в т.ч. в цикле).<br>
<br>
И даже <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push [ecx]</div><div class="code_line">mov [ecx],eax</div><div class="code_line">pop eax</div></ol></div></div></div></div>немного быстрее, чем:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push eax</div><div class="code_line">mov eax,[ecx]</div><div class="code_line">pop [ecx]</div></ol></div></div></div></div>(хотя это, вероятно, уже из-за влияния окружения, даже несмотря на то, что непосредственно перед кодом стоит <strong class='tag-b'>cpuid</strong>, а после <strong class='tag-b'>rdtscp</strong>). Это как раз тот случай, когда нужно просто тупо пробовать оба варианта :) <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2017-12-17T11:49:41+00:00">17.12.17, 11:49</time></span></span><br>
Жалко <strong class='tag-b'>wbinvd</strong> из-под юзера сделать нельзя... &lt;_&lt;<br>
(хотя для данного кода это вряд ли на что-то повлияло бы)]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753638</guid>
        <pubDate>Sun, 17 Dec 2017 08:32:44 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753638</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411737&view=findpost&p=3753571'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2017-12-16T12:34:40+00:00">16.12.17, 12:34</time></span><div class='quote '>leo, а в чём прикол последних двух инструкций (вместо просто pop [edx])?</div></div><br>
Это не прикол, а &quot;бездумное&quot; применение общего правила оптимизации - avoid complex instructions. По количеству макро- и микро-опов эти варианты полностью эквивалентны. Но pop m состоит из двух макро-опов, поэтому в Intel Core она может декодироваться только на первом декодере в начале такта. В общем случае это может приводить к неполному использованию пропускной способности декодера. Например, в моем &quot;тупом&quot; варианте декодер загружен на 100% - в первом такте проходят сложная push m и следующие за ней две простых команды, во втором - две простых и плюс еще две простых из последующего окружения, например, управления цикла - dec r + jnz. А в твоем варианте, декодирование pop m переносится на второй такт, что приводит к переносу в следующий такт одной из команд последующего окружения - например, если это цикл с dec r + jnz, то декодирование jnz сдвигается на следующий такт и приводит к чистой потере одного такта (т.к. после jсс декодирование и выполнение следующей итерации цикла всегда начинается с нового такта).<br>
Однако, пропускная способность декодера это далеко не самый главный, и не самый тонкий&#092;блошиный фактор оптимизации. Например, если управление циклом состоит не из двух простых команд, а из трех и более, то переход jcc по любому смещается на следующий такт, поэтому замена двух простых команд на сложную pop m, может и не приводить к потере такта на jcc. Но самым тонким моментом является конфликт портов исполнения команд, который невозможно предусмотреть иначе, как либо теоретически - расписав всю последовательность предполагаемого исполнения микроопов, либо практически - с помощью обезьяньей игры в перестановку команд. А в данном коде вероятность таких конфликтов весьма высока, т.к. весь код состоит только из загрузки и выгрузки в память. Поэтому не исключено, что использование pop m в данном коде приводит к реальному выигрышу за счет устранения конфликта портов несмотря на теоретический проигрыш в пропускной способности декодера.]]></description>
        <author>leo</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753626</guid>
        <pubDate>Sat, 16 Dec 2017 21:22:06 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753626</link>
        <description><![CDATA[Jin X: Ещё (про обмен регистра с памятью):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push eax</div><div class="code_line">mov eax,[ecx]</div><div class="code_line">pop [ecx]</div></ol></div></div></div></div>как будто бы немного быстрее работает (результаты тестов нестабильные, но ощущение такое)...<br>
И опять же, есть разница: используется ли именно <strong class='tag-b'>[ecx]</strong> или <strong class='tag-b'>[ebp-4]</strong>.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753571</guid>
        <pubDate>Sat, 16 Dec 2017 12:34:40 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753571</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>leo</strong>, а в чём прикол последних двух инструкций (вместо просто <strong class='tag-b'>pop [edx]</strong>)?<br>
По-любому же <strong class='tag-b'>pop eax</strong> не может выполниться раньше, чем <strong class='tag-b'>mov [edx],eax</strong>...<br>
<br>
В цикле разница в скорости не заметна, а вот по 1 разу наблюдается интересная картина:<br>
Именно в таком виде вариант с <strong class='tag-b'>pop eax</strong> работает быстрее.<br>
Но&#33; Если заменить [ecx] и [edx] на [ebp-4] и [ebp-8] (т.е. локальные переменные функции), то быстрее начинает работать вариант с <strong class='tag-b'>pop [ebp-8]</strong>.<br>
Это при том, что в первом варианте перед этим делается <strong class='tag-b'>lea ecx,[ebp-4]</strong> + <strong class='tag-b'>lea edx,[ebp-8]</strong> (и тут неважно: делаю я это непосредственно перед этими манипуляциями или перед <strong class='tag-b'>rdtscp</strong>, которая производит сериализацию... но тут я, естественно, уже использую esi и edi, а не ecx и edx). Вот эту загадку хотелось бы разгадать ещё... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2017-12-16T12:43:49+00:00">16.12.17, 12:43</time></span></span><br>
Кстати, вариант:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push [ecx]</div><div class="code_line">mov eax,[edx]</div><div class="code_line">pop [edx]</div><div class="code_line">mov [ecx],eax</div></ol></div></div></div></div>Чуть короче и работает немного быстрее твоего (и в цикле, и по 1 почти всегда, но точно не медленнее).<br>
<br>
Но всё равно:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push [ebp-4]</div><div class="code_line">mov eax,[ebp-8]</div><div class="code_line">pop [ebp-8]</div><div class="code_line">mov [ebp-4],eax</div></ol></div></div></div></div>Немного быстрее. Почему???&#33;&#33;&#33;&#33;&#33;  :blink:]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753570</guid>
        <pubDate>Sat, 16 Dec 2017 11:26:25 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753570</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411737&view=findpost&p=3753390'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2017-12-14T19:46:47+00:00">14.12.17, 19:46</time></span><div class='quote '>Давай ещё для обмена 2-х элементов памяти </div></div><br>
Аналогично<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push [ecx]</div><div class="code_line">mov eax,[edx]</div><div class="code_line">mov [ecx],eax</div><div class="code_line">pop eax</div><div class="code_line">mov [edx],eax</div></ol></div></div></div></div><br>
Кол-во инструкций то же, что и в варианте с xor, но работать должно быстрее, т.к. вместо одной цепочки из 5 зависимых операций используется две независимых цепочки 3+2 - один из основных рулов оптимизации break dependance chain реально рул-ит :)]]></description>
        <author>leo</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753414</guid>
        <pubDate>Thu, 14 Dec 2017 23:58:54 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753414</link>
        <description><![CDATA[Jin X: Как какие критерии? Скорость. Вызываем функцию (по наиболее частому сценарию или со случайными данными), замеряем скорость, сравниваем с другой... какие проблемы?<br>И зачем миллион вариантов? К чему перебирать очевидно глупые варианты? Нормальных вариантов-то, по сути, не так много. Десяток-другой от силы наберётся. И то с трудом.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753410</guid>
        <pubDate>Thu, 14 Dec 2017 21:40:01 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753410</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411737&view=findpost&p=3753390'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2017-12-14T19:46:47+00:00">14.12.17, 19:46</time></span><div class='quote '>А если у нас будет несколько хороших вариантов, то будет из чего выбирать...</div></div>Ну т.е. открываем справочник по инструкциям, включаем фантазию и набираем мульён вариантов. А критерии сравнения для выбора формулируем как? На языке Теории Групп?]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753390</guid>
        <pubDate>Thu, 14 Dec 2017 19:46:47 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753390</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>leo</strong>, отличный вариант, кстати&#33; Давай ещё для обмена 2-х элементов памяти ;)<br>
<br>
<strong class='tag-b'>Qraizer</strong>, есть вещи, на которые мы можем повлиять (какие инструкции использовать и как их сочетать с другими), а есть те, на которые не можем (параллельные процессы, ядро и пр). Наша задача работать с тем, на что мы повлиять можем. Согласись, что всегда один код (или инструкция) будет работать &quot;в среднем&quot; быстрее, чем другой. А в некоторых случаях <em class='tag-i'>всегда</em> быстрее (типа <strong class='tag-b'>dec ecx+jnz</strong> против <strong class='tag-b'>loop</strong>, если не брать во внимание 8086 и т.п. экзотику).<br>
Например, вариант от <strong class='tag-b'>leo</strong> по любому будет быстрее, чем 2 push&#39;а и pop&#39;а. А если у нас будет несколько хороших вариантов, то будет из чего выбирать... По крайней мере, мы всегда можем вставить разные варианты в критические участки кода и потом сравнить общую скорость работы функции (при прочих приблизительно равных).]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753340</guid>
        <pubDate>Thu, 14 Dec 2017 13:09:44 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753340</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>Jin X</strong>, ты ж понимаешь, что это баловство? Скорость будет зависеть от любого чиха в окружении. Элементарно вдруг окажется, что параллельное ядро решило инвалидировать интересную строку кеша. Плюс зависимости по регистрам в окаймляющем коде. Плюс ветвления с неоднозначной предсказуемостью незадолго до или после. Плюс зависимости от исполнительных блоков, которые ты каким-нибудь xadd и/или sub отнимешь у команд за десяток инструкций от своего &quot;xchg&quot;. ИМХО просто не используешь xchg, и этого достаточно. Ибо главный тормоз тут lock, который вносит избыточную упорядоченность в исполнительный поток. Нет lock, нет проблемы, остальное от лукавого.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753332</guid>
        <pubDate>Thu, 14 Dec 2017 12:50:38 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753332</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411737&view=findpost&p=3753260'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2017-12-13T20:43:32+00:00">13.12.17, 20:43</time></span><div class='quote '>пока в голову не приходит ничего лучше, чем:</div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push [ecx]</div><div class="code_line">mov [ecx], eax</div><div class="code_line">pop eax</div></ol></div></div></div></div>]]></description>
        <author>leo</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753260</guid>
        <pubDate>Wed, 13 Dec 2017 20:43:32 +0000</pubDate>
        <title>Ускорить xchg с памятью. Вопрос на засыпку по оптимизации&amp;#33;</title>
        <link>https://forum.sources.ru/index.php?showtopic=411737&amp;view=findpost&amp;p=3753260</link>
        <description><![CDATA[Jin X: Как известно, инструкция <strong class='tag-b'>xchg</strong>, оперирующая с памятью, занимается нехорошим делом: блокировкой шины. Иногда, конечно, это дело очень даже полезное, но гораздо чаще – нет.<br>
<br>
Давайте подумаем: чем можно заменить эту инструкцию (скажем, <strong class='tag-b'>xchg [ecx],eax</strong>) для <span class='tag-u'>максимизации скорости</span>?<br>
Конечно, первое, что приходит в голову – это:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mov edx,[ecx]</div><div class="code_line">mov [ecx],eax</div><div class="code_line">mov eax,edx</div></ol></div></div></div></div>Скорость взлетает ощутимо – проверено.<br>
Но&#33; Тут используется дополнительный регистр&#33; А если лишнего регистра нет? Что делать?<br>
<br>
Может, я откровенно туплю, но пока в голову не приходит ничего лучше, чем:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">push eax</div><div class="code_line">push [ecx]</div><div class="code_line">pop eax</div><div class="code_line">pop [ecx]</div></ol></div></div></div></div>или<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">xadd [ecx],eax</div><div class="code_line">sub [ecx],eax</div></ol></div></div></div></div>Но второй вариант работает даже медленнее, чем первый (в цикле, по крайней мере)&#33;&#33;&#33;<br>
<br>
Ах, да, есть же ещё:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">xor eax,[ecx]</div><div class="code_line">xor [ecx],eax</div><div class="code_line">xor eax,[ecx]</div></ol></div></div></div></div>Он работает быстрее, чем <strong class='tag-b'>xadd</strong> и чуть быстрее, чем <strong class='tag-b'>push</strong>/<strong class='tag-b'>pop</strong> в цикле (и тем более <strong class='tag-b'>xchg</strong>), но скорость всё равно низкая...<br>
<br>
Задача №2 (усложнённая). Нам нужно обменять 2 элемента в памяти (а-ля <strong class='tag-b'>xchg [ecx],[edx]</strong>). В распоряжении у нас максимум 1 регистр.<br>
То бишь такое не прокатит:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mov eax,[edx]</div><div class="code_line">mov ebx,[ecx]</div><div class="code_line">mov [edx],ebx</div><div class="code_line">mov [ecx],eax</div></ol></div></div></div></div>(тут 2 регистра)<br>
<br>
Тут, конечно, относительно быстрым будет:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mov eax,[ecx]</div><div class="code_line">xor eax,[edx]</div><div class="code_line">xor [edx],eax</div><div class="code_line">xor eax,[edx]</div><div class="code_line">mov [ecx],eax</div></ol></div></div></div></div><br>
А вот это:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">fld dword ptr [ecx]</div><div class="code_line">fld dword ptr [edx]</div><div class="code_line">fstp dword ptr [ecx]</div><div class="code_line">fstp dword ptr [edx]</div></ol></div></div></div></div>...ещё быстрее варианта с <strong class='tag-b'>xor</strong> (примерно вдвое&#33;) :D<br>
<br>
Но хочется большего&#33;&#33;&#33;<br>
Покумекаем? :)<br>
<br>
p.s. Всяческие варианты с MMX/SSE (или каким-нибудь <em class='tag-i'>особенным</em> набором инструкций) прошу не предлагать как основные решения. Как дополнительные – ну ок, сгодятся.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      </channel>
      </rss>
	