<?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=419072&amp;view=findpost&amp;p=3833654</guid>
        <pubDate>Thu, 02 Jul 2020 13:44:48 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833654</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>core&#045;i7 &#064; <time class="tag-quote__quoted-time" datetime="2020-07-02T01:42:44+00:00">02.07.20, 01:42</time></span><div class='quote '>тогда QPF должна быть привязана к частоте процессора чтоли?</div></div>Нет.<br>
Как я понял, винда на старте проверяет наличие invariant TSC. Если он присутствует, то вычисляет кол-во циклов в секунду и определяет делитель (обратный множитель).<br>
А вот время вызова QPC проверяется выбранный на старте режим (HPET или TSC), и если используется TSC, читает его, добавляет что-то ещё зачем-то и делит на этот делитель, подгоняя таким образом к частоте 10 МГц.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>core&#045;i7 &#064; <time class="tag-quote__quoted-time" datetime="2020-07-02T01:42:44+00:00">02.07.20, 01:42</time></span><div class='quote '>и почему тогда, если НРЕТ не поддерживается чипсетом, то QPF в аккурат равна частоте ACPI-таймера 3.579545 MHz - где параллель с TSC ???</div></div>Подозреваю, что там, где используется APCI-таймер, винда не самая свежая, либо нет ни invariant TSC, ни HPET. <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="2020-07-02T16:46:09+03:00">02.07.20, 13:46</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833651'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-02T11:46:23+00:00">02.07.20, 11:46</time></span><div class='quote '>Не исключено, что занижение частоты связано со всякими там Spectre.</div></div>Сомневаюсь, что кто-то будет использовать QPC для тестов кэша :)<br>
Ну и да, эта канитель никогда на частоте проца не работала, насколько я понимаю.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833651</guid>
        <pubDate>Thu, 02 Jul 2020 11:46:23 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833651</link>
        <description><![CDATA[Qraizer: Не исключено, что занижение частоты связано со всякими там Spectre. Хотя и верится несколько с трудом, т.к. занижение QPF выполнено гораздо раньше, чем сообщено о той же Spectre. Ну или о Spectre было уже давно известно, гораздо раньше публикаций.]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833633</guid>
        <pubDate>Thu, 02 Jul 2020 01:42:44 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833633</link>
        <description><![CDATA[core-i7: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833627'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-07-01T22:32:50+00:00">01.07.20, 22:32</time></span><div class='quote '>Во-вторых, он <span class="tag-color tag-color-named" data-value="red" style="color: red">читает RDTSCP</span> и дальше выполняет какие-то хитрые арифметические операции</div></div><br>
тогда QPF должна быть привязана к частоте процессора чтоли? (ведь QPF и QPC работают синхронно)<br>
к примеру у меня CPU=1.1 GHz и QPF возвращает 10 MHz, <br>
ты говоришь, что у тебя тоже 10 MHz, а частота процессора какая?<br>
и почему тогда, если НРЕТ не поддерживается чипсетом, то QPF в аккурат равна частоте ACPI-таймера 3.579545 MHz - где параллель с TSC ???]]></description>
        <author>core-i7</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833627</guid>
        <pubDate>Wed, 01 Jul 2020 22:32:50 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833627</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>core-i7</strong>, ты знаешь, всё-таки QPC использует не HPET, даже при значениях QPF = 10 млн.<br>
Я тут почитал <a class='tag-url' href='https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps' target='_blank'>кое-что</a>. Во-первых, для HPET нужно идти в ядро, а QPC этого не делает (по крайней мере, у меня на 10-ке точно, да и на 7-ке, насколько я помню, было так же). Во-вторых, он читает RDTSCP и дальше выполняет какие-то хитрые арифметические операции, в результате чего преобразует это значение в QPC-счётчик. Причём, он выполняет не только деление (через умножение), но и зачем-то добавляет какие-то числа, ибо отношение RDTSCP/QPC постепенно растёт.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833431</guid>
        <pubDate>Mon, 29 Jun 2020 11:08:18 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833431</link>
        <description><![CDATA[Jin X: И снова исправлен косячок, добавленный в результате предыдущего исправления: прога всегда показывала CPU migration  &lt;_&lt; <br>
Файлы <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833263' target='_blank'>обновлены</a>.<br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Сообщения были разделены в тему &quot;<a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=419088' target='_blank'>Определение микроархитектуры CPU</a>&quot;</span></span>]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833274</guid>
        <pubDate>Sat, 27 Jun 2020 06:56:46 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833274</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833266'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>core&#045;i7 &#064; <time class="tag-quote__quoted-time" datetime="2020-06-27T04:18:18+00:00">27.06.20, 04:18</time></span><div class='quote '>прикольно получилось - зачёт&#33;</div></div>Я там косякнул кое-где (с цифровыми параметрами для SpeedTestMsg) :(<br>
Сейчас исправил, сообщение обновил ;)]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833266</guid>
        <pubDate>Sat, 27 Jun 2020 04:18:18 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833266</link>
        <description><![CDATA[core-i7: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833257'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T19:51:43+00:00">26.06.20, 19:51</time></span><div class='quote '>А на ВМ проц типа стартует сразу с разогнанной частоты, поэтому и показывает её? </div></div><br>
..имхо на вирту вообще не нужно делать ставки, поскольку она живёт своей жизнью<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833263'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T22:17:22+00:00">26.06.20, 22:17</time></span><div class='quote '>Доделал вроде как вполне приличную тестилку скорости кода</div></div><br>
прикольно получилось - зачёт&#33;  :good:]]></description>
        <author>core-i7</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833263</guid>
        <pubDate>Fri, 26 Jun 2020 22:17:22 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833263</link>
        <description><![CDATA[Jin X: Доделал вроде как вполне приличную тестилку скорости кода.<br>
Пока только под 64 бита.<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">format &nbsp;PE64 Console 5.0</div><div class="code_line">include &#39;win64axp.inc&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">;-- CODE SECTION -------------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">.code</div><div class="code_line">&nbsp;</div><div class="code_line">entry:</div><div class="code_line">&nbsp;</div><div class="code_line">frame</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; -1 is handle of current process (GetCurrentProcess), -2 is handle of current thread (GetCurrentThread)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SetProcessAffinityMask, -1, 1 ; to aviod CPU migration</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SetPriorityClass, -1, REALTIME_PRIORITY_CLASS ; available only when running with administrator rights</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SetThreadPriority, -2, THREAD_PRIORITY_TIME_CRITICAL</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall SpeedTestInit, -1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall SpeedTestMsg, test1, &#39;Testing 1...&#39;, &#60;&#39; %llu ticks%s&#39;,10&#62;, &#39; (CPU migration is detected)&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall SpeedTestMsg, test2, &#39;Testing 2...&#39;, &#60;&#39; %llu ticks%s&#39;,10&#62;, &#39; (CPU migration is detected)&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall SpeedTestMsg, test3, &#39;Testing 3...&#39;, &#60;&#39; %llu ticks%s&#39;,10&#62;, &#39; (CPU migration is detected)&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SetThreadPriority, -2, THREAD_PRIORITY_NORMAL</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SetPriorityClass, -1, NORMAL_PRIORITY_CLASS</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cinvoke printf, &#39;Press a key to exit...&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cinvoke getch</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;ExitProcess, 0</div><div class="code_line">endf</div><div class="code_line">&nbsp;</div><div class="code_line">align 16</div><div class="code_line">test1:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor eax,eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cpuid</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">&nbsp;</div><div class="code_line">align 16</div><div class="code_line">test2:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ecx,65536</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: dec ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz @B</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">&nbsp;</div><div class="code_line">align 16</div><div class="code_line">test3:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ecx,65536</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;loop &nbsp; &nbsp;$</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">&nbsp;</div><div class="code_line">;-- SPEED TEST PROCEDURES ----------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">; Speed-test procedures for Windows x64, v1.00a</div><div class="code_line">; (c) 2020 by Jin X (jin_x@list.ru)</div><div class="code_line">&nbsp;</div><div class="code_line">SPEEDTEST_REPEATS = 256 &nbsp; &nbsp; &nbsp; &nbsp; ; number of code execution repeats (must be power of two!!!)</div><div class="code_line">SPEEDTEST_WARMUPS = 1 shl (bsr SPEEDTEST_REPEATS / 2) ; number of warming-up executions</div><div class="code_line">&nbsp;</div><div class="code_line">assert SPEEDTEST_WARMUPS &#62;= 0 &amp; SPEEDTEST_REPEATS &#62; 0 &amp; bsf SPEEDTEST_REPEATS = bsr SPEEDTEST_REPEATS</div><div class="code_line">&nbsp;</div><div class="code_line">; Initialize speed-test and show message if needed (via printf)</div><div class="code_line">; Parameters: ecx = show message flags: bit 0 - when rdtscp is NOT supported, bit 1 - when invariant TSC is NOT supported, bit 2 - when everything&#39;s ok (ecx = -1 - all messages)</div><div class="code_line">; Returns: rax = unsupported feature flags: bit 0 - rdtscp is NOT supported, bit 1 - invariant TSC is NOT supported (eax = 0 - both features are supported)</div><div class="code_line">proc &nbsp; &nbsp; &nbsp; &nbsp;SpeedTestInit &nbsp; uses rbx, MsgFlags</div><div class="code_line">frame</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r8b,3 &nbsp; &nbsp; &nbsp; ; temp result</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r9d,ecx &nbsp; &nbsp; ; show message flags</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov eax,0x80000000</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cpuid</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r10d,eax &nbsp; &nbsp;; max extended cpuid leaf level</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; RDTSCP instruction support check</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov eax,0x80000001</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp r10d,eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jb &nbsp;.no_inv &nbsp; &nbsp; ; both features are NOT supported</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cpuid</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;bt &nbsp;edx,27 &nbsp; &nbsp; &nbsp;; rdtscp support bit</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnc .no_rdtscp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;and r8b,not 1 &nbsp; ; mark as supported</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [SpeedTestGetTSC],SpeedTestRDTSCP ; use RDTSC instruction</div><div class="code_line">&nbsp;&nbsp; &nbsp;.no_rdtscp:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Invariant TSC support check</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov eax,0x80000007</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp r10d,eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jb &nbsp;.no_inv</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cpuid</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;bt &nbsp;edx,8 &nbsp; &nbsp; &nbsp; ; invariant TSC support bit</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnc .no_inv</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;and r8b,not 2 &nbsp; ; mark as supported</div><div class="code_line">&nbsp;&nbsp; &nbsp;.no_inv:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov bl,r8b</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov bh,bl &nbsp; &nbsp; &nbsp; ; save result mask</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test &nbsp; &nbsp;bl,bl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setz &nbsp; &nbsp;cl</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;shl cl,2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;or &nbsp;bl,cl &nbsp; &nbsp; &nbsp; ; set bit 2 in r8d if both features are supported</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;and bl,r9b &nbsp; &nbsp; &nbsp;; bit mask for messages</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Messages</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test &nbsp; &nbsp;bl,1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;@F</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cinvoke printf, &#60;&quot;Warning: RDTSCP instruction is not supported, RDTSC will be used instead (CPU migration can&#39;t be detected)!&quot;, 10&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: test &nbsp; &nbsp;bl,2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;@F</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cinvoke printf, &#60;&quot;Warning: invariant TSC is not supported (results may be inaccurate)!&quot;, 10&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: test &nbsp; &nbsp;bl,4</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;@F</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cinvoke printf, &#60;&quot;Success: both RDTSCP instruction and invariant TSC are supported.&quot;, 10&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Measure overhead</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor eax,eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [SpeedTestOverhead],rax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall SpeedTest, SpeedTestEmptyFunc ; overhead test</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [SpeedTestOverhead],rax</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;movzx &nbsp; eax,bh &nbsp; &nbsp; &nbsp;; results</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">endf</div><div class="code_line">endp ; SpeedTestInit</div><div class="code_line">&nbsp;</div><div class="code_line">; Measure procedure speed and show message (via printf)</div><div class="code_line">; Parameters:</div><div class="code_line">; &nbsp; * rcx = proc address</div><div class="code_line">; &nbsp; * rdx = starting message (0 - no message, -1 - &#39;Testing...&#39; message);</div><div class="code_line">; &nbsp; * r8 = result message (0 - no message, -1 - just a number of ticks and new line), should contain &#39;%llu&#39; for result TSC count and then &#39;%s&#39; (optional) for CPU migration message (specified by r9);</div><div class="code_line">; &nbsp; * r9 = CPU migration message (optional, should be used only is r8 message contains &#39;%s&#39;).</div><div class="code_line">; Returns: rax = TSC count (always positive value), zf = 1 if no CPU migration is occured</div><div class="code_line">proc &nbsp; &nbsp; &nbsp; &nbsp;SpeedTestMsg &nbsp; &nbsp;ProcAddr, PreMsg, ResultMsg, MigMsg</div><div class="code_line">SpeedTestMsg% = 0 &nbsp; ; turn off parameter count check</div><div class="code_line">frame</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [ProcAddr],rcx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [ResultMsg],r8</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [MigMsg],r9</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Starting message</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test &nbsp; &nbsp;rdx,rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;.no_start</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp rdx,-1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jne @F</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rdx,.testing_msg</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: cinvoke printf, &#39;%s&#39;, rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp;.no_start:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Test speed</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall SpeedTest, [ProcAddr]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [ProcAddr],rax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setz &nbsp; &nbsp;byte [PreMsg] &nbsp; ; save zf</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Result message</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r8,.no_message</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;@F &nbsp; &nbsp; &nbsp;; jump if no CPU migration</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r8,[MigMsg]</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: mov rcx,[ResultMsg]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test &nbsp; &nbsp;rcx,rcx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;.no_results</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp rcx,-1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jne @F</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rcx,.just_ticks</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: cinvoke printf, rcx, rax, r8</div><div class="code_line">&nbsp;&nbsp; &nbsp;.no_results:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Return values</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rax,[ProcAddr]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec byte [PreMsg] &nbsp; ; restore zf</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">endf</div><div class="code_line">.testing_msg &nbsp; &nbsp;db &nbsp;&#39;Testing...&#39;,0</div><div class="code_line">.just_ticks db &nbsp;&#39; %llu&#39;,10</div><div class="code_line">.no_message db &nbsp;0</div><div class="code_line">endp ; SpeedTestMsg</div><div class="code_line">&nbsp;</div><div class="code_line">; Measure procedure speed</div><div class="code_line">; Parameters: rcx = proc address</div><div class="code_line">; Returns: rax = TSC count (always positive value), zf = 1 if no CPU migration is occured</div><div class="code_line">proc &nbsp; &nbsp; &nbsp; &nbsp;SpeedTest &nbsp; uses rbx rsi rdi r12 r13 r14 r15, ProcAddr</div><div class="code_line">frame</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r12,rcx</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Warming-up calls</div><div class="code_line">&nbsp;&nbsp;if SPEEDTEST_WARMUPS &#62; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov esi,SPEEDTEST_WARMUPS</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: stdcall r12</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz @B</div><div class="code_line">&nbsp;&nbsp;end if</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Main tests</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rdi,SpeedTestResults</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor r15d,r15d</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov esi,SPEEDTEST_REPEATS</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@:; &nbsp; &nbsp;invoke &nbsp;SwitchToThread &nbsp;; try to update thread time slice</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SpeedTestGetTSC ; get ticks in rax, CPU id in ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r13,rax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r14d,ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall r12 &nbsp; &nbsp; ; main call</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp;SpeedTestGetTSC ; get ticks in rax, CPU id in ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub rax,r13</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub rax,[SpeedTestOverhead] ; result TSC count</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stosq &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; store to SpeedTestResults</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub ecx,r14d &nbsp; &nbsp;; detect CPU migration</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;or &nbsp;r15d,ecx &nbsp; &nbsp;; migration flag for all tests</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz @B</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if SPEEDTEST_REPEATS &#62; 2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Sort results</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rcx,SpeedTestResults</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rdx,SPEEDTEST_REPEATS</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;stdcall InsertionSort64</div><div class="code_line">&nbsp;&nbsp;end if</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;; Calculate average CPU ticks</div><div class="code_line">&nbsp;&nbsp;if SPEEDTEST_REPEATS &#60;= 2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ecx,SPEEDTEST_REPEATS</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ecx,SPEEDTEST_REPEATS/2 ; use only 50% of results from array middle (assuming that 25% at the start and end are errors)</div><div class="code_line">&nbsp;&nbsp;end if</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor eax,eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor edx,edx</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@: add rax,[SpeedTestResults+(SPEEDTEST_REPEATS/4)*8 + rdx*8] ; sum of all relevant results</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inc edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz @B</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if SPEEDTEST_REPEATS &#62; 2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sar rax,bsr (SPEEDTEST_REPEATS/2) ; average value</div><div class="code_line">&nbsp;&nbsp;else if SPEEDTEST_REPEATS = 2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sar rax,bsr SPEEDTEST_REPEATS ; average value</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test &nbsp; &nbsp;rax,rax</div><div class="code_line">&nbsp;&nbsp;end if</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmovs &nbsp; eax,ecx &nbsp; &nbsp; ; zero result if negative</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test &nbsp; &nbsp;r15d,r15d &nbsp; ; zf = 1 if no CPU migration is occured</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">endf</div><div class="code_line">endp ; SpeedTest</div><div class="code_line">&nbsp;</div><div class="code_line">; Read TSC via RDTSC [for internal use]</div><div class="code_line">; Returns: rax = current TSC counter value, ecx = 0 (processor id detection is not supported)</div><div class="code_line">; Changes ebx !!!</div><div class="code_line">if used SpeedTestRDTSC</div><div class="code_line">SpeedTestRDTSC:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor eax,eax &nbsp; &nbsp; ; cpuid execution time may vary depending on eax value</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cpuid &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; serialization</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor ecx,ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;shl rdx,32</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;or &nbsp;rax,rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mfence</div><div class="code_line">SpeedTestEmptyFunc:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">end if ; used SpeedTestRDTSC</div><div class="code_line">&nbsp;</div><div class="code_line">; Read TSC via RDTSCP [for internal use]</div><div class="code_line">; Returns: rax = current TSC counter value, ecx = processor id</div><div class="code_line">if used SpeedTestRDTSCP</div><div class="code_line">SpeedTestRDTSCP:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtscp</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;shl rdx,32</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;or &nbsp;rax,rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mfence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">end if ; used SpeedTestRDTSCP</div><div class="code_line">&nbsp;</div><div class="code_line">if used InsertionSort64</div><div class="code_line">; Insertion sort of 64-bit elements</div><div class="code_line">; Parameters: rcx = array address, rdx = number of elements</div><div class="code_line">InsertionSort64:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r8d,1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; start key_index</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp rdx,r8</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jle .exit &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; jump if number of element &#60;= 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;.loop1:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov rax,[rcx+r8*8] &nbsp; &nbsp; &nbsp;; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r9,r8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; el_index</div><div class="code_line">&nbsp;&nbsp; &nbsp;.loop2:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov r10,[rcx+(r9-1)*8] &nbsp;; prev_el</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp r10,rax &nbsp; &nbsp; &nbsp; &nbsp; ; prev_el &#60;=&#62; key ?</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jng @F</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [rcx+r9*8],r10 &nbsp; &nbsp; &nbsp;; if (prev_el &#62; key) el = prev_el</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec r9 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; --el_index</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz .loop2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; repeat if el_index &#62; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov [rcx+r9*8],rax &nbsp; &nbsp; &nbsp;; el = key</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inc r8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; ++key_index</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp r8,rdx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jb &nbsp;.loop1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; repeat if key_index &#60; number of elements</div><div class="code_line">&nbsp;&nbsp; &nbsp;.exit:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret</div><div class="code_line">end if ; used InsertionSort64</div><div class="code_line">&nbsp;</div><div class="code_line">;-- DATA SECTION -------------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">.data</div><div class="code_line">&nbsp;</div><div class="code_line">if used SpeedTestInit</div><div class="code_line">SpeedTestGetTSC dq &nbsp;SpeedTestRDTSC &nbsp; &nbsp; &nbsp;; TSC read procedure</div><div class="code_line">SpeedTestOverhead rq &nbsp; &nbsp;1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; TSC read overhead tick count</div><div class="code_line">SpeedTestResults rq SPEEDTEST_REPEATS &nbsp; ; Temporary result array</div><div class="code_line">end if ; used SpeedTestInit</div><div class="code_line">&nbsp;</div><div class="code_line">;-- IMPORT SECTION -----------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">section &#39;.idata&#39; import data readable</div><div class="code_line">&nbsp;</div><div class="code_line">library kernel32, &#39;kernel32.dll&#39;,\</div><div class="code_line">&nbsp;&nbsp; &nbsp;msvcrt, &#39;msvcrt.dll&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;import_kernel32</div><div class="code_line">&nbsp;&nbsp; &nbsp;all_api</div><div class="code_line">&nbsp;</div><div class="code_line">import &nbsp;msvcrt,\</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf, &#39;printf&#39;,\</div><div class="code_line">&nbsp;&nbsp; &nbsp;getch, &#39;_getch&#39;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<span class="b-attach" data-size="8935" data-hits="816" data-attach-id="62258" data-attach-post-id="3833263">
			<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=3833263&amp;attach_id=62258' title='Скачать файл' target='_blank'>speedtest64.fasm</a> (, : 816)
		</span>]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833257</guid>
        <pubDate>Fri, 26 Jun 2020 19:51:43 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833257</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833252'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>core&#045;i7 &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T18:54:31+00:00">26.06.20, 18:54</time></span><div class='quote '>овер биоса на неё не влияет</div></div>А на ВМ проц типа стартует сразу с разогнанной частоты, поэтому и показывает её? <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="2020-06-26T19:59:21+00:00">26.06.20, 19:59</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833252'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>core&#045;i7 &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T18:54:31+00:00">26.06.20, 18:54</time></span><div class='quote '>Спасибо вот Jin X поправил.</div></div>Я в том году поинтереснее код для теста начал писать, но не доделал. Хотя, осталось чуть-чуть.<br>
Я вот только думаю, есть ли смысл выравнивать тестовый код по 16 байтам? :rolleyes:<br>
Как я понял, основная фишка этого выравнивания в том, чтобы весь код попал в один 16-байтный блок. Т.е. если код занимает, скажем, 8 байт (ну или 24), то он может начинаться с любого адреса от 0 до 7 (в младшем полубайте), разницы не будет никакой.<br>
<br>
<strong class='tag-b'>update:</strong> Вот инфа по этому поводу. Получается, что так и есть.<br>
<span class="b-attach" data-size="104232" data-hits="1256" data-attach-id="62246" data-attach-post-id="3833257">
			<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=3833257&amp;attach_id=62246' title='Скачать файл' target='_blank'>code_align.png</a> (, : 1256)
		</span>]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833252</guid>
        <pubDate>Fri, 26 Jun 2020 18:54:31 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833252</link>
        <description><![CDATA[core-i7: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833220'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T13:42:01+00:00">26.06.20, 13:42</time></span><div class='quote '>А именно&#33; QPC не точнее лишь потому, что там - API,</div></div><br>
не совсем так..<br>
Чтобы получить реальное время, нужно иметь счётчик и частоту, на которой этот счётчик работает. Например если взять счётчик процессора TSC и разделить его не на частоту процессора, а частоту таймера HPET, то получим не правильное время. Именно поэтому пара QPC+QPF должны всегда ходить вместе. Если замерить, сколько раз простучит QPC в течении одной секунды, то непременно получим значение, которое вернёт нам QPF. Это-же касается и пары RDTSC+CPUfreq.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833237'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:23:26+00:00">26.06.20, 15:23</time></span><div class='quote '>поправь-таки код.</div></div><br>
да.. он кривой, т.к. я его набросал на коленке. Спасибо вот <strong class='tag-b'>Jin X</strong> поправил.  ;) <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833240'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:47:08+00:00">26.06.20, 15:47</time></span><div class='quote '>А х32- программах индусы всё же сделали что&#39;бы они не плавали.</div></div><br>
я имел в виду, что индусы точили набор функций NtCreateProfile(), с которыми я кстати так и разобрался до конца.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833240'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:47:08+00:00">26.06.20, 15:47</time></span><div class='quote '>Там не 100 Мгц, а частота RDTSC. Только младшие биты 4-5 бит они не контролируют. </div></div><br>
вполне возможно, только эта частота у меня всегда совпадает с физической частотой системной шины, без множителя CPU.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833248'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T17:04:52+00:00">26.06.20, 17:04</time></span><div class='quote '>Это что, так Invariant TSC работает?</div></div><br>
именно так он и работает&#33; <br>
На новых чипсетах TSC выделен в отдельный домен, и идёт напрямую от системного клокера, - овер биоса на неё не влияет.<br>
<span class="b-attach" data-size="10112" data-hits="1098" data-attach-id="62244" data-attach-post-id="3833252">
			<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=3833252&amp;attach_id=62244' title='Скачать файл' target='_blank'>tscp.png</a> (, : 1098)
		</span>]]></description>
        <author>core-i7</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833248</guid>
        <pubDate>Fri, 26 Jun 2020 17:04:52 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833248</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833242'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:50:02+00:00">26.06.20, 15:50</time></span><div class='quote '>Как вариант</div></div>У меня этот код в виртуальной Win98 показывает время пустого кода минус несколько тысяч тактов, в 10-ке в районе -20 (в среднем), на домашнем около нуля (+/-). Любопытненько, однако...<br>
И ещё на домашнем частота 3300 измеряется, на вирт. 3700. Хотя всякие там CPU-Z показывают 3700. На самом деле у меня небольшой штатный разгон: 3300 -&gt; 3700.<br>
Это что, так Invariant TSC работает?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833240'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:47:08+00:00">26.06.20, 15:47</time></span><div class='quote '>1) Для виртуализации TSC сохраняется в контексте процесса и после загружается обратно. Причем виндоус использует это всегда.</div></div>А если поподробнее?]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833243</guid>
        <pubDate>Fri, 26 Jun 2020 16:03:10 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833243</link>
        <description><![CDATA[JoeUser: <div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833236'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:19:24+00:00">26.06.20, 15:19</time></span><div class='quote '>Не понимаю, о чём ты?</div></div><br>
Это и хорошо&#33; 30 гратусов тов. Цельсия в тени меня сводят с ума - и я уже кидаюсь на всех аки собака Баскервили)</div></div>]]></description>
        <author>JoeUser</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833242</guid>
        <pubDate>Fri, 26 Jun 2020 15:50:02 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833242</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833237'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:23:26+00:00">26.06.20, 15:23</time></span><div class='quote '>core-i7, поправь-таки код</div></div>Как вариант:<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><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">format &nbsp;PE Console 4.0</div><div class="code_line">entry &nbsp; start</div><div class="code_line">&nbsp;</div><div class="code_line">include &#39;win32axp.inc&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">;-- CODE SECTION -------------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">macro &nbsp; ReadTSC</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mfence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mfence</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">.code</div><div class="code_line">&nbsp;</div><div class="code_line">start:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp; SetThreadPriority, -2, THREAD_PRIORITY_TIME_CRITICAL</div><div class="code_line">&nbsp;</div><div class="code_line">;====== Частота процессора</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReadTSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp; Sleep,1000</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReadTSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sbb &nbsp; &nbsp; &nbsp;edx,ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; edx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fild &nbsp; &nbsp; qword[esp]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;add &nbsp; &nbsp; &nbsp;esp,8</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fidiv &nbsp; &nbsp;[N1M]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fistp &nbsp; &nbsp;[cpuFreq]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cinvoke &nbsp; printf,&#60;10,&#39; &nbsp;CPU freq: %d MHz&#39;,0&#62;,[cpuFreq]</div><div class="code_line">&nbsp;</div><div class="code_line">;====== Частота таймера</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp; QueryPerformanceFrequency,qpf</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fild &nbsp; &nbsp; [qpf]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fidiv &nbsp; &nbsp;[N1M]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fstp &nbsp; &nbsp;[fpuBuff]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cinvoke &nbsp; printf,&#60;10,&#39;Timer freq: %f MHz&#39;,0&#62;,dword[fpuBuff],dword[fpuBuff+4]</div><div class="code_line">&nbsp;</div><div class="code_line">;====== Погрешность = 2 инструкции: сериализация LFENCE, и чтение TSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReadTSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReadTSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; &nbsp;[fix],eax &nbsp; &nbsp;; запомнить &nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">;***************************</div><div class="code_line">; Профайлер</div><div class="code_line">;***************************</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReadTSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;</div><div class="code_line">;&#60;----- Сюда вставляем профилируемые инструкции</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReadTSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,[fix]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fild &nbsp; &nbsp; dword [esp] &nbsp; ; такты</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fidiv &nbsp; &nbsp;[cpuFreq] &nbsp; &nbsp; ; разделить на частоту процессора</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fstp &nbsp; &nbsp; [fpuBuff] &nbsp; &nbsp; ; время в микросекундах</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cinvoke &nbsp; printf,&#60;10,&#39;%i ticks = %f microsec&#39;,0&#62;,\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;eax, dword[fpuBuff], dword[fpuBuff+4]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cinvoke &nbsp; getch</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp; ExitProcess, 0</div><div class="code_line">&nbsp;</div><div class="code_line">;-- DATA SECTION -------------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">.data</div><div class="code_line">&nbsp;</div><div class="code_line">N1M &nbsp; &nbsp; dd &nbsp; &nbsp; &nbsp; 1000000</div><div class="code_line">cpuFreq dd &nbsp; &nbsp; &nbsp; ?</div><div class="code_line">fix &nbsp; &nbsp; dd &nbsp; &nbsp; &nbsp; ?</div><div class="code_line">qpf &nbsp; &nbsp; dq &nbsp; &nbsp; &nbsp; ?</div><div class="code_line">fpuBuff dq &nbsp; &nbsp; &nbsp; ?</div><div class="code_line">&nbsp;</div><div class="code_line">;-- IMPORT SECTION -----------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">section &#39;.idata&#39; import data readable</div><div class="code_line">&nbsp;</div><div class="code_line">library kernel32, &#39;kernel32.dll&#39;,\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;msvcrt, &#39;msvcrt.dll&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;import_kernel32</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;all_api</div><div class="code_line">&nbsp;</div><div class="code_line">import &nbsp;msvcrt,\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf, &#39;printf&#39;,\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;getch, &#39;_getch&#39;</div></ol></div></div></div></div></div></div>]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833240</guid>
        <pubDate>Fri, 26 Jun 2020 15:47:08 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833240</link>
        <description><![CDATA[Pavia: Подкину дровишек.  <br>
1) Для виртуализации TSC сохраняется в контексте процесса и после загружается обратно. Причем виндоус использует это всегда. <br>
2) <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>е RDTSC+CPUfreq. Однако эти функции точились индусами специально для профайлеров,</div></div> В давние времена да. <br>
Суть в том что если делать x64 программы то там эта комбинация плавает в отрицательные области. А х32- программах индусы всё же сделали что&#39;бы они не плавали.<br>
  <br>
3)<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>таймер локального контролёра LAPIC. Этот таймер работает на частоте шины FSB/DMI (100..200 MHz), </div></div><br>
Там не 100 Мгц, а частота RDTSC. Только младшие биты 4-5 бит они не контролируют. <br>
4) Для профилирования есть PerformanceCounter нужен драйвер. У интела есть IntelPerformanceCounterMonitor-PCM-V2.10 нужно только GUI или API прекрутить.]]></description>
        <author>Pavia</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833239</guid>
        <pubDate>Fri, 26 Jun 2020 15:37:16 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833239</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833237'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T15:23:26+00:00">26.06.20, 15:23</time></span><div class='quote '>Что любопытно, XP (виртуальная) выдаёт 3ГГц, а 7ка уже 10МГц</div></div>В 98 вообще 1.19 МГц :)<br>
Там таймер 8254 используется :)]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833237</guid>
        <pubDate>Fri, 26 Jun 2020 15:23:26 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833237</link>
        <description><![CDATA[Qraizer: Что любопытно, XP (виртуальная) выдаёт 3ГГц, а 7ка уже 10МГц <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="2020-06-26T15:27:21+00:00">26.06.20, 15:27</time></span></span><br>
<strong class='tag-b'>core-i7</strong>, поправь-таки код. Частота путает уменьшаемое и вычитаемое, все замеры путают знаковую и беззнаковую арифметику, а целочисленную арифметику замени на 64-битную, ибо странно наблюдать отрицательные Micro/sec]]></description>
        <author>Qraizer</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833236</guid>
        <pubDate>Fri, 26 Jun 2020 15:19:24 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833236</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833232'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T14:42:16+00:00">26.06.20, 14:42</time></span><div class='quote '>Эх ... удалил такое искреннее сообщение от себя  За два года модерства - расслабился, потерял чуйку&#33;</div></div>Не понимаю, о чём ты?<br>
Если надо, можно найти сообщение (отредактированное, удалённое). Но с этим лучше в Л.С., чтобы не засорять обсуждение.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833232'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T14:42:16+00:00">26.06.20, 14:42</time></span><div class='quote '>Ну мож быть ... тебе виднее - но я заметил именно профилирование.</div></div>Не в заголовке суть, а в великих речах, глаголящих истину :P]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833232</guid>
        <pubDate>Fri, 26 Jun 2020 14:42:16 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833232</link>
        <description><![CDATA[JoeUser: <div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body">Эх ... удалил такое искреннее сообщение от себя  :wall: За два года модерства - расслабился, потерял чуйку&#33;  :wall: </div></div> <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="2020-06-26T14:51:57+00:00">26.06.20, 14:51</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833224'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T14:13:42+00:00">26.06.20, 14:13</time></span><div class='quote '>т.к. оно включает в себя больше всего, нежели замер времени.</div></div><br>
Ну мож быть ... тебе виднее - но я заметил именно профилирование. Но спорить не хочу совсем - мне диалог дальнейший интересен. Мое мнение ... та-сяк ... слушать интереснее, особенно если собеседники плотно в теме.]]></description>
        <author>JoeUser</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833225</guid>
        <pubDate>Fri, 26 Jun 2020 14:17:04 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833225</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833211'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>core&#045;i7 &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T12:31:36+00:00">26.06.20, 12:31</time></span><div class='quote '>10 илн, это значит 10 MHz чтоли? (т.к. там в наносек блоках)</div></div>QFP выдаёт частоту, т.е. 10 млн - это 10 МГц. При чём тут наносекунды?]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833220</guid>
        <pubDate>Fri, 26 Jun 2020 13:42:01 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833220</link>
        <description><![CDATA[JoeUser: <span class="tag-color tag-color-named" data-value="red" style="color: red">[cut по просьбе автора]</span><br>
Лично мне вот интересно, предложения <strong class='tag-b'>core-i7</strong> смогут ли улучшить точность С++ шного  <em class='tag-i'>std::chrono::high_resolution_clock</em>? И чуйка мне подсказывает &quot;несомненно&quot; (я всегда надеюсь на лучшее, прогрессивное и спортивное)&#33;<br>
<span class="tag-color tag-color-named" data-value="red" style="color: red">[cut по просьбе автора]</span><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833199'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T09:04:00+00:00">26.06.20, 09:04</time></span><div class='quote '>Хм... я всегда думал, что QPC тоже использует использует rdtsc или rdtscp</div></div><br>
В качестве антиоффтопика ... когда я увидел код от <strong class='tag-b'>core-i7</strong>, сразу побежал интересоваться незнакомыми мне командами :) Статья-за-статьей, статья-за-статьей ... и у меня есть ответ на твой вопрос (частично). А именно&#33; QPC не точнее кода от <strong class='tag-b'>core-i7</strong> лишь потому, что там - API, и под капотом у которого стопицот индусов, которых погоняют 10 брахманов (даже если они используют <strong class='tag-b'>rdtsc</strong> или <strong class='tag-b'>rdtscp</strong>). А у <strong class='tag-b'>core-i7</strong> в примере - только инструкции камня. Ну это чисто мое ИМХО. Мнений конечно дохрена, но я пока вот такое выбрал за истину.]]></description>
        <author>JoeUser</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833211</guid>
        <pubDate>Fri, 26 Jun 2020 12:31:36 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833211</link>
        <description><![CDATA[core-i7: Женя, салам&#33;<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833199'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-06-26T09:04:00+00:00">26.06.20, 09:04</time></span><div class='quote '>но QPF выдал 10 млн, что наводит на размышления.<br>
Зачем же тогда там эти rdtsc?</div></div><br>
10 илн, это значит 10 MHz чтоли? <em class='tag-i'>(т.к. там в наносек блоках)</em><br>
У меня на буке тоже не подымается выше 10-ти, хотя это HPET и частота его 14 MHz. <br>
а rdtsc наверное там для какой-нибудь калибровки.]]></description>
        <author>core-i7</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833199</guid>
        <pubDate>Fri, 26 Jun 2020 09:04:00 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833199</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>core-i7</strong>, привет, Тимур  ;) <br>
Хм... я всегда думал, что QPC тоже использует использует <strong class='tag-b'>rdtsc</strong> или <strong class='tag-b'>rdtscp</strong> (по крайней мере, эта инструкция там есть) и сдвигает результат на 10 бит, но QPF выдал 10 млн, что наводит на размышления.<br>
Зачем же тогда там эти rdtsc? :huh: <br>
<br>
Т.к. <strong class='tag-b'>lfence</strong> ставит барьер только на чтение и не гарантирует, что перед <strong class='tag-b'>rdtsc</strong> влезет одна из <em class='tag-i'>последующих</em> инструкций, я бы делал так всё же:<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">mfence</div><div class="code_line">rdtsc</div><div class="code_line">mfence</div></ol></div></div></div></div><br>
Вот хорошая дока по этой теме:<br>
<a class='tag-url' href='http://www.mkurnosov.net/uploads/Main/mkurnosov-rdtsc-2014.pdf' target='_blank'>http://www.mkurnosov.net/uploads/Main/mkur...-rdtsc-2014.pdf</a><br>
<br>
А есть ещё инструкция <strong class='tag-b'>rdpmc</strong>, которая как раз для профайлинга предназначена, но она сложнее в использовании и не всегда нужна. К тому же, она привилегированная (в винде, в линуксе, видимо, тоже), нужно драйвер писать, хотя у Агнера Фога уже есть: <a class='tag-url' href='https://www.agner.org/optimize/#testp' target='_blank'>https://www.agner.org/optimize/#testp</a> <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="2020-06-26T09:17:17+00:00">26.06.20, 09:17</time></span></span><br>
Можно ещё приоритет потока выставлять по максимуму, кстати.]]></description>
        <author>Jin X</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833104</guid>
        <pubDate>Wed, 24 Jun 2020 18:32:44 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833104</link>
        <description><![CDATA[core-i7: ..что-то в этом роде:<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">;====== Частота процессора</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; &nbsp;ecx,2</div><div class="code_line">@@: &nbsp; &nbsp; push &nbsp; &nbsp; ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lfence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp; Sleep,500</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; &nbsp;ebx,500000</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cdq</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;div &nbsp; &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec &nbsp; &nbsp; &nbsp;ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz &nbsp; &nbsp; &nbsp;@b</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; &nbsp;[cpuFreq],eax &nbsp; &nbsp; ; запомнить</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cinvoke &nbsp; printf,&#60;10,&#39; CPU freq..: %d MHz&#39;,0&#62;,eax</div><div class="code_line">&nbsp;</div><div class="code_line">;====== Частота таймера</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;invoke &nbsp; QueryPerformanceFrequency,qpf</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; &nbsp;eax,[qpf]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; &nbsp;ebx,1000000</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cdq</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;div &nbsp; &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cinvoke &nbsp; printf,&#60;10,&#39; Timer freq: %d.%d MHz&#39;,0&#62;,eax,edx</div><div class="code_line">&nbsp;</div><div class="code_line">;====== Погрешность = 2 инструкции: сериализация LFENCE, и чтение TSC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lfence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lfence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; &nbsp;[fix],eax &nbsp; &nbsp;; запомнить &nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">;***************************</div><div class="code_line">; Профайлер</div><div class="code_line">;***************************</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lfence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;</div><div class="code_line">;&#60;----- Сюда вставляем профилируемые инструкции</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lfence</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rdtsc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;ebx &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sub &nbsp; &nbsp; &nbsp;eax,[fix]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp; eax</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fild &nbsp; &nbsp; dword[esp] &nbsp; &nbsp;; такты</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fidiv &nbsp; &nbsp;[cpuFreq] &nbsp; &nbsp; ; разделить на частоту процессора</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fstp &nbsp; &nbsp; [fpuBuff] &nbsp; &nbsp; ; время в нано/секундах</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop &nbsp; &nbsp; &nbsp;eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cinvoke &nbsp; printf,&#60;10,&#39;%u Takt = %.3f Micro/sec&#39;,0&#62;,\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;eax, dword[fpuBuff], dword[fpuBuff+4]</div></ol></div></div></div></div><br>
Здесь я вывел частоту таймера QPF, чтобы сравнить её с частотой процессора. Если QPF возвратит 3.5 MHz, значит система использует в качестве основного ACPI-таймер (3.579545 MHz), если больше 10 MHz - HPET (в идеале 14). В любом случае, QPF в десятки раз отстаёт от процессора.]]></description>
        <author>core-i7</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833101</guid>
        <pubDate>Wed, 24 Jun 2020 16:22:54 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833101</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419072&view=findpost&p=3833095'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>core&#045;i7 &#064; <time class="tag-quote__quoted-time" datetime="2020-06-24T11:38:21+00:00">24.06.20, 11:38</time></span><div class='quote '>Поэтому логичней, взять за основу сразу частоту CPU 1..3 GHz, и его счётчик тактов TSC. Бонусом, не помешала-бы и сериализация на входе/выходе через инструкцию LFENCE.. т.е. учитывать спекулятивное выполнение кода процессором.</div></div><br>
А можно пример кода, как это запрограммить?]]></description>
        <author>JoeUser</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833095</guid>
        <pubDate>Wed, 24 Jun 2020 11:38:21 +0000</pubDate>
        <title>Измерение времени выполнения кода</title>
        <link>https://forum.sources.ru/index.php?showtopic=419072&amp;view=findpost&amp;p=3833095</link>
        <description><![CDATA[core-i7: Имхо замерять время выполнения всей программы наоборот не имеет смысла - если снимать профайл, то с отдельных её участков. Если вместо связки QPC/QPF использовать RDTSC/CPU.freq, то это позволит вычислять время вплоть до нано/секунд, т.е. даже единичные инструкции (например узнать, насколько в цикле лучше DEC,чем LOOP). <br>
<br>
Сейчас-же, всё зависит от частоты таймера QPerfFrequency(), макс.значение которого всего 14 MHz (и то, если задействован HPET, а так 3). Поэтому логичней, взять за основу сразу частоту CPU 1..3 GHz, и его счётчик тактов TSC. Бонусом, не помешала-бы и сериализация на входе/выходе через инструкцию LFENCE.. т.е. учитывать спекулятивное выполнение кода процессором. <br>
<br>
А вообще, для таких случаев в составе Ntdll.dll имеется набор спец.функций NtCreateProfile(), которые в качестве метронома используют таймер локального контролёра LAPIC. Этот таймер работает на частоте шины FSB/DMI (100..200 MHz), а значит и он уступает связке RDTSC+CPUfreq. Однако эти функции точились индусами специально для профайлеров, так-что сбрасывать их со-счетов было-бы глупо.<br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Эта тема была разделена из темы &quot;<a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=419018' target='_blank'>КТЗ&#33;</a>&quot;</span></span>]]></description>
        <author>core-i7</author>
        <category>Assembler</category>
      </item>
	
      </channel>
      </rss>
	