<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[SSE] Zahl von Vektor abziehen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab hier eine Funktion, die von einem Vektor eine Zahl abziehen soll. Da der Vektor ziemlich lange ist, benütze ich dafür SSE.</p>
<p>Also, die Funktion sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">SSE_Subtract(std::vector&lt;int,alignment_allocator&lt;int,16&gt; &gt;&amp; vector,int subtract_value, size_t begin_index, size_t end_index)
</code></pre>
<p>vector ist natürlich der Vektor, subtract_value die Zahl die abgezogen werden soll.<br />
begin_index ist der Index der ersten Zahl, end_index der Index der letzten Zahl von der subtract_Value abgezogen werden soll.</p>
<p>Wenn ich nun jetzt diesen Vektor habe:</p>
<pre><code>0, 1, 2, 3, 4, 5, 6, 7, 8
</code></pre>
<p>dann sollte</p>
<pre><code class="language-cpp">SSE_Subtract(vector, 2, 4, 7)
</code></pre>
<p>folgendes auswerfen:</p>
<pre><code>0, 1, 2, 3, 2, 3, 4, 5, 8
</code></pre>
<p>Bei SSE müssen ja die Zahlen auf einer Adresse liegen, die durch 16 teilbar ist. Also kann ich hier nur Zahlen hernehmen, die auf einem Index liegen für den gilt: Index % 4 == 0<br />
Und gleichzeitig muss ich bei einem Index dann aufhören, für den wieder das gleiche gilt, ansonsten überschreibe ich ja die Daten dahinter.</p>
<p>So sieht meine Fnktion jetzt aus:<br />
(Hinweis a % 4 == a &amp; 3)</p>
<pre><code class="language-cpp">//SSE function
#if OSG_USE_SSE
	void CNumberSeriesCache::SSE_Subtract(std::vector&lt;int,alignment_allocator&lt;int,16&gt; &gt;&amp; vector,int subtract_value, size_t begin_index, size_t end_index)
	{
		/*
		complicated, ugly and can only be understand by pros :D
		don't change this because optimization is the root of all evil
		(and Bush will bomb your house!)
		*/

		size_t size = end_index - begin_index;
		size_t sse_begin_index;
		size_t sse_end_index; 
		//size_t sse_vector_size = vector_size - vector_size%4; //the number of elements, that can be used in sse
		//optimization (does the same as the code above):
		//size_t sse_vector_size = vector_size - (vector_size &amp; 3); //remind the brackets!!!
		//further optimization [man, i am good today :D]
		size_t sse_size = size  &amp; ~3;
		size_t pos;

		__m128i* p_sse_source;
		__m128i  sse_subtract_value;

		if(/*start_pos%4 &gt; 0*/ (begin_index &amp; 3) &gt; 0)
		{
			//sse_start_pos = start_pos+4 - start_pos % 4
			sse_begin_index = begin_index+4 - (begin_index &amp; 3); //remind the brackets!!!

			for(pos = begin_index; pos&lt;sse_begin_index &amp;&amp; pos&lt;=end_index; pos++)
			{
				vector.at(pos) -= subtract_value;
			}
		}
		else
		{
			pos = sse_begin_index = begin_index;
		}

		sse_end_index = end_index - (end_index &amp; 3);

		//now start speedy SSE
		if(sse_begin_index &lt;= end_index)
			p_sse_source = (__m128i*) &amp;(vector.at(sse_begin_index));

		sse_subtract_value = _mm_set1_epi32(subtract_value); //sse_subtract_value = add_value;

		for( ; pos &lt;= sse_end_index; pos+=4)
		{
			*p_sse_source = _mm_sub_epi32(*p_sse_source, sse_subtract_value); //p_sse_source[0,1,2,3] -= sse_subtract_value 

			//go to the next
			++p_sse_source;	
		}

		//now do the rest of the vector that could not be handled with SSE, because vector.size()%4 != 0
		for( ; pos &lt;= end_index; ++pos)
		{
			vector.at(pos) -= subtract_value;
		}
	}
#endif
</code></pre>
<p>Irgendwie funktioniert das ganze aber noch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> .<br />
Wenn end_index = vector.size() ist, dann zieht er subtract_value nicht mehr vom letzten Element ab...</p>
<p>Hat jemand ne Idee, wie man das ganze vielleicht einfacher angehen könnt. Langsam blicke ich da selber nicht mehr durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184651/sse-zahl-von-vektor-abziehen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 21:47:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184651.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Jun 2007 18:36:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [SSE] Zahl von Vektor abziehen on Sun, 17 Jun 2007 18:36:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab hier eine Funktion, die von einem Vektor eine Zahl abziehen soll. Da der Vektor ziemlich lange ist, benütze ich dafür SSE.</p>
<p>Also, die Funktion sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">SSE_Subtract(std::vector&lt;int,alignment_allocator&lt;int,16&gt; &gt;&amp; vector,int subtract_value, size_t begin_index, size_t end_index)
</code></pre>
<p>vector ist natürlich der Vektor, subtract_value die Zahl die abgezogen werden soll.<br />
begin_index ist der Index der ersten Zahl, end_index der Index der letzten Zahl von der subtract_Value abgezogen werden soll.</p>
<p>Wenn ich nun jetzt diesen Vektor habe:</p>
<pre><code>0, 1, 2, 3, 4, 5, 6, 7, 8
</code></pre>
<p>dann sollte</p>
<pre><code class="language-cpp">SSE_Subtract(vector, 2, 4, 7)
</code></pre>
<p>folgendes auswerfen:</p>
<pre><code>0, 1, 2, 3, 2, 3, 4, 5, 8
</code></pre>
<p>Bei SSE müssen ja die Zahlen auf einer Adresse liegen, die durch 16 teilbar ist. Also kann ich hier nur Zahlen hernehmen, die auf einem Index liegen für den gilt: Index % 4 == 0<br />
Und gleichzeitig muss ich bei einem Index dann aufhören, für den wieder das gleiche gilt, ansonsten überschreibe ich ja die Daten dahinter.</p>
<p>So sieht meine Fnktion jetzt aus:<br />
(Hinweis a % 4 == a &amp; 3)</p>
<pre><code class="language-cpp">//SSE function
#if OSG_USE_SSE
	void CNumberSeriesCache::SSE_Subtract(std::vector&lt;int,alignment_allocator&lt;int,16&gt; &gt;&amp; vector,int subtract_value, size_t begin_index, size_t end_index)
	{
		/*
		complicated, ugly and can only be understand by pros :D
		don't change this because optimization is the root of all evil
		(and Bush will bomb your house!)
		*/

		size_t size = end_index - begin_index;
		size_t sse_begin_index;
		size_t sse_end_index; 
		//size_t sse_vector_size = vector_size - vector_size%4; //the number of elements, that can be used in sse
		//optimization (does the same as the code above):
		//size_t sse_vector_size = vector_size - (vector_size &amp; 3); //remind the brackets!!!
		//further optimization [man, i am good today :D]
		size_t sse_size = size  &amp; ~3;
		size_t pos;

		__m128i* p_sse_source;
		__m128i  sse_subtract_value;

		if(/*start_pos%4 &gt; 0*/ (begin_index &amp; 3) &gt; 0)
		{
			//sse_start_pos = start_pos+4 - start_pos % 4
			sse_begin_index = begin_index+4 - (begin_index &amp; 3); //remind the brackets!!!

			for(pos = begin_index; pos&lt;sse_begin_index &amp;&amp; pos&lt;=end_index; pos++)
			{
				vector.at(pos) -= subtract_value;
			}
		}
		else
		{
			pos = sse_begin_index = begin_index;
		}

		sse_end_index = end_index - (end_index &amp; 3);

		//now start speedy SSE
		if(sse_begin_index &lt;= end_index)
			p_sse_source = (__m128i*) &amp;(vector.at(sse_begin_index));

		sse_subtract_value = _mm_set1_epi32(subtract_value); //sse_subtract_value = add_value;

		for( ; pos &lt;= sse_end_index; pos+=4)
		{
			*p_sse_source = _mm_sub_epi32(*p_sse_source, sse_subtract_value); //p_sse_source[0,1,2,3] -= sse_subtract_value 

			//go to the next
			++p_sse_source;	
		}

		//now do the rest of the vector that could not be handled with SSE, because vector.size()%4 != 0
		for( ; pos &lt;= end_index; ++pos)
		{
			vector.at(pos) -= subtract_value;
		}
	}
#endif
</code></pre>
<p>Irgendwie funktioniert das ganze aber noch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> .<br />
Wenn end_index = vector.size() ist, dann zieht er subtract_value nicht mehr vom letzten Element ab...</p>
<p>Hat jemand ne Idee, wie man das ganze vielleicht einfacher angehen könnt. Langsam blicke ich da selber nicht mehr durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1307941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1307941</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Sun, 17 Jun 2007 18:36:44 GMT</pubDate></item><item><title><![CDATA[Reply to [SSE] Zahl von Vektor abziehen on Sun, 17 Jun 2007 20:29:01 GMT]]></title><description><![CDATA[<p>Hi, mal abgesehen davon das ich mal ganz flüchtig von SSE was gehört habe, habe ich dennoch ein paar Sachen zu bemerken.</p>
<p>XCooperation schrieb:</p>
<blockquote>
<p>Wenn ich nun jetzt diesen Vektor habe:</p>
<pre><code>0, 1, 2, 3, 4, 5, 6, 7, 8
</code></pre>
<p>...<br />
end_index = vector.size()</p>
</blockquote>
<p>Ist dir klar das size() dir in diesem Falle 9 zurück geben würde.<br />
Dann wäre vec[9] ungültig.</p>
<p>Zudem ist es gebräuchlich das man nicht End-Index übergibt, sondern eher die Anzahl, der ab begin_index zu löschenden Zeichen.<br />
Würde ich jedenfalls so machen.</p>
<p>Hoffe mal, das ich dir etwas helfen konnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308012</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 17 Jun 2007 20:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to [SSE] Zahl von Vektor abziehen on Mon, 18 Jun 2007 10:48:17 GMT]]></title><description><![CDATA[<p>Ups, ja klar, meinte natürlich:<br />
end_index = vector.size() - 1</p>
<p>Naja, ich hab halt in meinem Programm als Eingabe nur end_index und nicht die Länge.<br />
Gut, die ließe sich ja berechnen:</p>
<pre><code class="language-cpp">size = end_index - begin_index + 1
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1308282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308282</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Mon, 18 Jun 2007 10:48:17 GMT</pubDate></item></channel></rss>