<?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=417632&amp;view=findpost&amp;p=3831578</guid>
        <pubDate>Thu, 28 May 2020 10:27:04 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831578</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417632&view=findpost&p=3831571'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Black_Dragon &#064; <time class="tag-quote__quoted-time" datetime="2020-05-28T12:08:37+03:00">28.05.20, 09:08</time></span><div class='quote '>JoeUser<br>
Те же цифры. </div></div><br>
Просто код поскромнее  :lol:]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831571</guid>
        <pubDate>Thu, 28 May 2020 09:08:37 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831571</link>
        <description><![CDATA[Black_Dragon: <strong class='tag-b'>JoeUser</strong><br>
Те же цифры.  :) <br>
<br>
Просто какая цель задачи, просто попробовать сделать параллельный код или реально повысить быстродействие.<br>
Во втором случае, надо все целиком рассматривать.<br>
<br>
Например, есть точка, и куча отрезков. Надо найти ближайший к точке. Вообщем вычислялось расстояние. А так как нам надо было найти отрезок, а не знать расстояние, то я из формулы расстояние убрал корень.<br>
Т.е. в начале делаешь как положено и понятно, отлаживаешь все. А потом начинает оптимизировать, упрощать, придумывать новые идеи. <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-05-28T09:49:38+00:00">28.05.20, 09:49</time></span></span><br>
+<br>
Вот время работы программы, где велись геометрические расчеты и использовались разные уловки<br>
<br>
Начальное время расчета (4 минуты)<br>
00:04:36.0053614<br>
<br>
Использование хеш-сетки для исключения не нужных отрезков (4 сек)<br>
00:00:04.8520328<br>
<br>
Использование OpenMP на 12 потоков<br>
00:00:34.4000643<br>
<br>
Использование хеша + 12 потоков<br>
00:00:03.4497785]]></description>
        <author>Black_Dragon</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831569</guid>
        <pubDate>Thu, 28 May 2020 08:16:42 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831569</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Black_Dragon</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">#include &#60;chrono&#62;</div><div class="code_line">auto start = std::chrono::high_resolution_clock::now();</div><div class="code_line">// ... тут помещаем замеряемый код</div><div class="code_line">auto stop = std::chrono::high_resolution_clock::now();</div><div class="code_line">std::cout &#60;&#60; &quot;Прошло:&quot; &#60;&#60; std::chrono::duration_cast&#60;std::chrono::milliseconds&#62;(stop - start).count() &#60;&#60; &quot;ms&quot; &#60;&#60; std::endl;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831563</guid>
        <pubDate>Thu, 28 May 2020 06:05:17 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831563</link>
        <description><![CDATA[Black_Dragon: Сделал еще один тест<br>
Добавил два нолика к количеству<br>
тип заменил на char, перевел код на 64-бита.<br>
Первая часть результатов без OpenMP, вторая с ним для генерации исходных данных.<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body">D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=1.08864<br>
t3=0.842568<br>
D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=1.11564<br>
t3=0.837306<br>
D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=1.08041<br>
t3=0.853024<br>
D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=1.08604<br>
t3=0.819968<br>
D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=0.474971<br>
t3=0.844585<br>
D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=0.485372<br>
t3=0.928686<br>
D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=0.441639<br>
t3=0.789672<br>
D:&#092;Project&#092;VS&#092;Test2&#092;x64&#092;Release&gt;Test2.exe<br>
t2=0.508216<br>
t3=0.788921</div></div><br>
Вообщем, когда время расчета уже становиться большим, появляется эффект.]]></description>
        <author>Black_Dragon</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831562</guid>
        <pubDate>Thu, 28 May 2020 04:46:05 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3831562</link>
        <description><![CDATA[Black_Dragon: <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">#include &#60;iostream&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int numberOfObjects = 10000000;</div><div class="code_line">int arraySize = numberOfObjects + 1;</div><div class="code_line">int *object = new int[numberOfObjects];</div><div class="code_line">int *shiftArray = new int[arraySize];</div><div class="code_line">#ifdef _MSC_VER</div><div class="code_line">#define NOMINMAX</div><div class="code_line">#include &#60;windows.h&#62;</div><div class="code_line">__forceinline double time()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;LARGE_INTEGER counter, frequency;</div><div class="code_line">&nbsp;&nbsp; &nbsp;QueryPerformanceCounter(&amp;counter);</div><div class="code_line">&nbsp;&nbsp; &nbsp;QueryPerformanceFrequency(&amp;frequency);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return double(counter.QuadPart) / double(frequency.QuadPart);</div><div class="code_line">}</div><div class="code_line">#else</div><div class="code_line">#include &#60;sys/time.h&#62;</div><div class="code_line">inline __attribute__((always_inline)) double time()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;timeval t1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;gettimeofday(&amp;t1, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return t1.tv_sec + t1.tv_usec * 0.000001;</div><div class="code_line">}</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">void genarr()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 0; i &#60; numberOfObjects; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;object[i] = 1 + (i % 10);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int shiftValue = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;double t1, t2, t3;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t1 = time();</div><div class="code_line">&nbsp;&nbsp; &nbsp;genarr();</div><div class="code_line">&nbsp;&nbsp; &nbsp;t2 = time();</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 0; i &#60; numberOfObjects; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;shiftArray[i] = shiftValue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;shiftValue += object[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;shiftArray[numberOfObjects] = shiftValue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t3 = time();</div><div class="code_line">&nbsp;&nbsp; &nbsp;delete[] shiftArray;</div><div class="code_line">&nbsp;&nbsp; &nbsp;delete[] object;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;t2=&quot; &#60;&#60; (t2 - t1) &#60;&#60; &quot;\nt3=&quot; &#60;&#60; (t3 - t2);</div><div class="code_line">}</div></ol></div></div></div></div><br>
У меня на рабочем компе время плавает от 0.015, до 0.07.<br>
Это медлено?<br>
<br>
Так же замечу, при таких малых значениях, внедрение OpenMP может увеличить итоговое время расчета (особенно, если это где-то еще в выше стоящих циклах используется), так как накладные расходы высокие. <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-05-28T04:59:41+00:00">28.05.20, 04:59</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">void genarr()</div><div class="code_line">{</div><div class="code_line">#pragma omp parallel for</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 0; i &#60; numberOfObjects; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;object[i] = 1 + (i % 10);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
Время этого кода в тех же пределах.]]></description>
        <author>Black_Dragon</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825600</guid>
        <pubDate>Sun, 15 Mar 2020 04:14:21 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825600</link>
        <description><![CDATA[Славян: 1. Сначала, Джо, нужно потратить 4 такта общего времени, чтобы получить сумму тех моих синих хвостов и длину красных блоков, коя у вас и вышла в: 6; 22; 38; 54.<br>
2. Далее, тратим один (&#33;&#33;&#33;) такт, чтобы красный блок добавить ко второму блоку, получая: 4+6; 9+6; 15+6 и 22+6. Т.е. все ваши верные суммы: 10; 15; 21; <strong class='tag-b'>28</strong>.<br>
3. Далее, снова тратим ОДИН такт, чтобы красный блок добавить к третьему блоку, получая: 8+28; 17+28; 27+28; 38+28. Т.е. все ваши верные суммы: 36; 45-у вас опечатка; 55; <strong class='tag-b'>66</strong>.<br>
4. Наконец, снова тратим ОДИН такт, чтобы красный блок добавить к 4-му блоку, получая: 12+66; 25+66; 39+66; 54+66. Т.е. все ваши верные суммы: 78; 91; 105; 120.<br>
Итого: 4+1+1+1 = 7 тактов&#33;&#33;]]></description>
        <author>Славян</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825596</guid>
        <pubDate>Sat, 14 Mar 2020 22:28:07 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825596</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>amk</strong>, что-то я запутался в твоей методике  :-? Посмотри, так  ли я понял... я взял 16 цифр от 0 до 15 и разбил их на 4 &quot;процессора&quot;:<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">0 &nbsp; 1 &nbsp; 2 &nbsp; 3 &nbsp;| &nbsp;4 &nbsp; 5 &nbsp; 6 &nbsp; 7 &nbsp;| &nbsp; 8 &nbsp; 9 &nbsp;10 &nbsp;11 &nbsp;| &nbsp;12 &nbsp;13 &nbsp;14 &nbsp;15</div><div class="code_line">---------------+-----------------+------------------+----------------</div><div class="code_line">0 &nbsp; 1 &nbsp; 3 &nbsp; 6 &nbsp;| &nbsp;4 &nbsp; 9 &nbsp;15 &nbsp;22 &nbsp;| &nbsp; 8 &nbsp;17 &nbsp;27 &nbsp;38 &nbsp;| &nbsp;12 &nbsp;25 &nbsp;39 &nbsp;54</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | 10 &nbsp;15 &nbsp;21 &nbsp;28 &nbsp;| &nbsp;14 &nbsp;23 &nbsp;33 &nbsp;44 &nbsp;| &nbsp;18 &nbsp;31 &nbsp;45 &nbsp;60</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp;36 &nbsp;45 &nbsp;55 &nbsp;66 &nbsp;| &nbsp;40 &nbsp;53 &nbsp;67 &nbsp;82</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp;78 &nbsp;91 105 120</div><div class="code_line">---------------+-----------------+------------------+----------------</div><div class="code_line">Проверка:</div><div class="code_line">---------------+-----------------+------------------+----------------</div><div class="code_line">0 &nbsp; 1 &nbsp; 3 &nbsp; 6 &nbsp;| 10 &nbsp;15 &nbsp;21 &nbsp;28 &nbsp;| &nbsp;36 &nbsp;45 &nbsp;55 &nbsp;66 &nbsp;| &nbsp;78 &nbsp;91 105 120</div></ol></div></div></div></div><br>
Не пойму, что в лоб на одном &quot;проце&quot; считать = 16 тактов, что на четырех = 4 серии по 4 такта.<br>
Где чего я не понимаю?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825575</guid>
        <pubDate>Sat, 14 Mar 2020 13:22:00 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825575</link>
        <description><![CDATA[gordey: Спасибо всем большое за идею распараллеливания.]]></description>
        <author>gordey</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825566</guid>
        <pubDate>Sat, 14 Mar 2020 11:19:51 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825566</link>
        <description><![CDATA[amk: Предположим у нас есть N чисел, для которых нам надо посчитать кумулятивные суммы.<br>
При прямом подсчёте нам понадобится N операций сложения<br>
Если мы разобьём их на s частей, то накопление сумм для каждой части займёт N/s, потом в единственном потоке мы произведём суммирование накопленных сумм для групп - это s операций, и наконец параллельно откорректируем все суммы - ещё N/s операций. Итого это займёт 2*N/s + s времени. Эта величина минимальна при s = sqrt(2*N). Немного поменяв начальную разбивку, можно общую оценку уменьшить до 2*n/s + s/2, но это мало что меняет.<br>
Видно, что нет смысла бить вычисление на два потока, но уже три дают экономию в 33% времени. <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-03-14T11:46:58+00:00">14.03.20, 11:46</time></span></span><br>
Насчёт разбивки данных ошибся, время не меняется но организовав процесс вычисления поправок можно свести время до 2*N/s + log(s), что, впрочем, при s&lt;&lt;N всё равно ничего не даёт.<br>
Кстати, при наличии K процессорных ядер имеет смысл бить исходный массив на K+1 отрезок<br>
На первом этапе считаем кумулятивные суммы для первых K участков. Для первого они же будут и окончательными.<br>
На втором этапе суммируем общие суммы, чтобы получить начальные суммы для участков со второго по K+1<br>
На третьем корректируем суммы для участков со 2 по K и считаем их &quot;с нуля&quot; для участка K+1. Можно и для остальных посчитать &quot;с нуля&quot;, в таком случае на первом этапе можно не накапливать кумулятивные суммы<br>
<br>
Второй этап можно чуточку ускорить (но, думаю, не имеет смысла - обеспечение синхронности съест весь выигрыш)<br>
Пусть K = 8, и после первого этапа мы получили суммы S1, S2, S3, S4, S5, S6, S7, S8<br>
1. S2 += S1; S4 += S3; S6 += S5; S8 += S7; s1 может уже начать корректировать отрезок 2 используя S1, как начальную сумму<br>
2. S3 += S2; S4 += S2; S7 += S6; S8 += S6; s2 может начать корректировать отрезок 3 на S2<br>
3. S5 += S4; S6 += S4; S7 += S4; S8 += S4; s3 и s4 могут начать коррекцию отрезков 4 и 5<br>
4. s5, s6 и s7 могут начинать коррекцию участков 6, 7 и 8; s8 может начать вычисление сумм для участка 9<br>
Можно суммировать и в другом порядке, но думаю, идея понятна.]]></description>
        <author>amk</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825558</guid>
        <pubDate>Sat, 14 Mar 2020 09:27:39 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825558</link>
        <description><![CDATA[Славян: 2. Итак, мы хотим параллельно посчитать что-то вроде: a[i] = сумма всех предыдущих + сам_я.<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">for( int i=1; i&#60;n; i++) a[i] += a[i-1]; // так делается</div></ol></div></div></div></div><br>
<span class="b-attach" data-size="3754" data-hits="3401" data-attach-id="61461" data-attach-post-id="3825558">
			<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=3825558&amp;attach_id=61461' title='Скачать файл' target='_blank'>shemaOMP.PNG</a> (, : 3401)
		</span><br>
а) Разобьём все наши миллионы на столько-то потоков.<br>
б) в каждый a<sub class='tag-sub'>i</sub> надо занести ВСЕХ предыдущих, но тогда будет зависимость тяжёлая. А мы посчитаем синие хвостики (см. рис), сумму оных, в какой-то отдельный массив b. Их будет n/потоков. И суммироваться будет всё это параллельно&#33;<br>
в) ну а дальше надо будет снова пробежаться s(кол-во потоков) раз, добавляя к каждому a<sub class='tag-sub'>i</sub>-му красный блок, кой посчитан на предыдущем шаге.<br>
<br>
П.С. может быть, не всё понятно, но я постарался суть схемы передать. :oops: <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-03-14T09:30:05+00:00">14.03.20, 09:30</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417632&view=findpost&p=3825557'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2020-03-14T09:09:00+00:00">14.03.20, 09:09</time></span><div class='quote '>неужели затраты времени на примитивную операцию сложения существеннее доступа к памяти по куче адресов?</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">const int n = 100;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a[n], sum;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#pragma omp parallel shared(a) reduction (+: sum) num_threads(nthread)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;#pragma omp for</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(long i = 0; i &#60; n; ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sum += a[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></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-03-14T09:35:14+00:00">14.03.20, 09:35</time></span></span><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>я</span><div class='quote '>Их будет n/потоков.</div></div>Тьфу, снова немного попутал&#33; :wall:<br>
Их (элементов в массиве b) будет как раз равно количеству потоков s. А вот количество суммирований в каждом потоке будет именно равно n/s. Таким образом, мы посчитаем хвосты за время n/s. Т.е. во столько раз выиграем&#33;]]></description>
        <author>Славян</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825557</guid>
        <pubDate>Sat, 14 Mar 2020 09:09:00 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825557</link>
        <description><![CDATA[MBo: Хм, действительно есть параллельные алгоритмы: <a class='tag-url' href='https://en.wikipedia.org/wiki/Prefix_sum#Parallel_algorithms' target='_blank'>https://en.wikipedia.org/wiki/Prefix_sum#Parallel_algorithms</a><br>
<br>
Но неужели затраты времени на примитивную операцию сложения существеннее доступа к памяти по куче адресов? (хотя этот доступ тоже, видимо, многоканальный)]]></description>
        <author>MBo</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825554</guid>
        <pubDate>Sat, 14 Mar 2020 08:43:21 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825554</link>
        <description><![CDATA[Славян: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>MBo</span><div class='quote '>Распараллелить вряд ли получится из-за зависимости по данным - для вычисления каждого элемента нужно знать предыдущий.</div></div>И, тем не менее, таковое всё же возможно. И даже вполне несложно. Сейчас нарисую/напишу схему. :blush: <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-03-14T09:02:59+00:00">14.03.20, 09:02</time></span></span><br>
1. Первым делом, вынесем=посчитаем все нужные числа в массив a[i], i=0..n. n = те самые 10 млн.<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">#pragma &nbsp;omp parallel shared(shiftArray) reduction (+: sum) num_threads(12) // или какое-то другое число потоков</div><div class="code_line">#pragma omp for</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(long i = 0; i &#60; n; i++) shiftArray[i] = object[ i ].GetNumberOfChilds();</div></ol></div></div></div></div><br>
2. Сейчас=далее будет схема.]]></description>
        <author>Славян</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825552</guid>
        <pubDate>Sat, 14 Mar 2020 07:31:48 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825552</link>
        <description><![CDATA[MBo: Распараллелить вряд ли получится из-за зависимости по данным - для вычисления каждого элемента нужно знать предыдущий. Однако для 10 миллионов целых чисел выполнение должно быть порядка 10 мс.<br>Это время выглядит вполне приемлемым для разовой операции. <br><br>Другое дело - если исходный массив постоянно меняется - в этом случае нужно думать о смене структуры данных - например, дерево Фенвика может подойти, если логарифмическое время доступа устроит (модификация будет тоже за логарифм)]]></description>
        <author>MBo</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825540</guid>
        <pubDate>Fri, 13 Mar 2020 20:41:14 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825540</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417632&view=findpost&p=3825538'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>gordey &#064; <time class="tag-quote__quoted-time" datetime="2020-03-13T19:49:04+00:00">13.03.20, 19:49</time></span><div class='quote '>Да, это сравнение было лишним. Понятно, что без сравнения цикл отработает быстрее.<br>
<br>
Есть варианты распараллеливания этого цикла?</div></div><br>
я не знаю.<br>
Можно поставить эксперимент и померить время выполнения<br>
2-х вариантов:<br>
1. этого<br>
2. заменить массивы с инкрементом индекса на указатели с инкрементом.<br>
3. Вот это &quot;GetNumberOfChilds()&quot; - исключить.<br>
---<br>
И вообще ассемблерный листиг посмотреть.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825538</guid>
        <pubDate>Fri, 13 Mar 2020 19:49:04 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825538</link>
        <description><![CDATA[gordey: Да, это сравнение было лишним. Понятно, что без сравнения цикл отработает быстрее.<br><br>Есть варианты распараллеливания этого цикла?<br>И 10 млн. это не предел, на самом деле у меня там объектов под млрд. :)]]></description>
        <author>gordey</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825537</guid>
        <pubDate>Fri, 13 Mar 2020 19:43:10 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825537</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417632&view=findpost&p=3825534'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Славян &#064; <time class="tag-quote__quoted-time" datetime="2020-03-13T19:03:40+00:00">13.03.20, 19:03</time></span><div class='quote '>Это ну совершенно несущественный шаг, <strong class='tag-b'>ЫукпШ</strong>.</div></div><br>
10 миллионов лишних операций сравнения. <br>
Получилось дольше или быстрее ?]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825535</guid>
        <pubDate>Fri, 13 Mar 2020 19:06:34 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825535</link>
        <description><![CDATA[gordey: Тем более, что в оригинале у меня именно так и написано  ;)]]></description>
        <author>gordey</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825534</guid>
        <pubDate>Fri, 13 Mar 2020 19:03:40 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825534</link>
        <description><![CDATA[Славян: Это ну совершенно несущественный шаг, <strong class='tag-b'>ЫукпШ</strong>.]]></description>
        <author>Славян</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825526</guid>
        <pubDate>Fri, 13 Mar 2020 18:02:45 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825526</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417632&view=findpost&p=3825524'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>gordey &#064; <time class="tag-quote__quoted-time" datetime="2020-03-13T17:29:05+00:00">13.03.20, 17:29</time></span><div class='quote '>Помогите, пожалуйста, ускорить процесс заполнения массива</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">int numberOfObjects = 10000000;</div><div class="code_line">int arraySize = numberOfObjects + 1;</div><div class="code_line">int *shiftArray = new int[arraySize];</div><div class="code_line">int shiftValue = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">for(int i=0; i &#60; numberOfObjects; i++)</div><div class="code_line">{</div><div class="code_line">&nbsp;shiftArray[i] = shiftValue;</div><div class="code_line">&nbsp;shiftValue += object[ i ].GetNumberOfChilds();</div><div class="code_line">}</div><div class="code_line">shiftArray[numberOfObjects] = shiftValue;</div><div class="code_line">&nbsp;</div><div class="code_line">delete []shiftArray;</div></ol></div></div></div></div>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Прочее</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825524</guid>
        <pubDate>Fri, 13 Mar 2020 17:29:05 +0000</pubDate>
        <title>Ускорить процесс подготовки &amp;quot;Карты смещений&amp;quot;</title>
        <link>https://forum.sources.ru/index.php?showtopic=417632&amp;view=findpost&amp;p=3825524</link>
        <description><![CDATA[gordey: Привет.<br>
Есть, например, 10 миллионов объектов. Каждый объект знает количество своих потомков.<br>
Нужно максимально быстро подготовить &quot;карту смещений&quot; для объектов.<br>
<br>
Карта смещений — это некий массив, размер которого равен количеству объектов + 1. Этот массив нужен для того, чтобы узнавать количество потомков у любого из объектов.<br>
Например:<br>
0 объект содержит 4 потомка.<br>
1 объект содержит 3 потомка.<br>
2 объект содержит 4 потомка.<br>
3 объект содержит 2 потомка.<br>
<br>
Размерность массива получится равной 4 + 1.<br>
Массив смещений должен содержать следующие значения: 0,4,7,11,13.<br>
Количество потомков у любого из объектов определяется следующим образом: количество потомков = массив[номер объекта + 1] - массив[номер объекта].<br>
<br>
Мне нужно максимально быстро заполнять такой массив смещений.<br>
Помогите, пожалуйста, ускорить процесс заполнения массива с помощью OpenMP или другого способа.<br>
<br>
int numberOfObjects = 10000000;<br>
int arraySize = numberOfObjects + 1;<br>
int *shiftArray = new int[arraySize];<br>
int shiftValue = 0;<br>
<br>
for( int i = 0; i &lt;= numberOfObjects; i++ )<br>
{<br>
    shiftArray[i] = shiftValue;<br>
    if ( i &lt; numberOfObjects )<br>
        shiftValue += object[ i ].GetNumberOfChilds();<br>
}<br>
<br>
<br>
delete []shiftArray;<br>
<br>
Спасибо&#33;]]></description>
        <author>gordey</author>
        <category>C/C++: Прочее</category>
      </item>
	
      </channel>
      </rss>
	