<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Visual C++ 6.0 / .NET (unmanaged)</title><link>https://www.dotnetzone.gr:443/cs/forums/30/ShowForum.aspx</link><description>Για τους hardcore developers, C/C++ forum για windows εφαρμογές!</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18633.aspx</link><pubDate>Mon, 16 Oct 2006 21:35:12 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18633</guid><dc:creator>thAAAnos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18633.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18633</wfw:commentRss><description>&lt;P&gt;Βασικά η ιδέα ήταν απλά vector dot arithmetic πχ εγώ να γράφω&lt;BR&gt;&lt;BR&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;v&amp;lt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;double&lt;/span&gt;,4&amp;gt;&amp;lt;DOUBLE,4&amp;gt; V,A,B,G&lt;/span&gt;&lt;BR&gt;...&lt;BR&gt;V=A+B*G&lt;BR&gt;&lt;BR&gt;μέσω template expressions να μην δημιουργώ τα temp vector variables δηλαδή&lt;BR&gt;&lt;BR&gt;να έχω στην τελική&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt;(k=0;k&amp;lt;4;k++) V[k]=A[k]+B[k]*G[k]&lt;/span&gt;&lt;BR&gt;και μέσω SSE να κόψω τις πράξεις στο μισό πχ&lt;BR&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt;(i=0;i&amp;lt;4;i+=2) V[i,i+1]=A[i,i+1]+B[i,i+1]*G[i,i+1]&lt;/span&gt;&lt;BR&gt;&lt;BR&gt;άντε και κανένα unroll μετά...&lt;BR&gt;&lt;BR&gt;λες οτι θα έχει πολύ pointer dereferencing σε native arrays θα τα έχω...??&lt;BR&gt;&lt;BR&gt;Όλα αυτά για χρήση σε γεωμετρικά προβλήματα με το αποτέλεσμα στο opengl pipeline&lt;BR&gt;&lt;BR&gt;ps απλά δεν γίνεται να υλοποιησω αλγοριθμους υπολογιστικής γεωμετριας πανω σε SSE χρειάζομαι αυτό το extra indirection για να παιζω με τύπους exact/inexact&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18303.aspx</link><pubDate>Mon, 09 Oct 2006 22:22:29 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18303</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18303.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18303</wfw:commentRss><description>Ζητάς πράγματα τα οποία δεν παντρεύονται εύκολα, επιτάχυνση μέσω hardware και templates. Ένα από τα μεγαλύτερα bottlenecks όταν χρησιμοποιείς SSE είναι η μνήμη και η πρόσβαση σε αυτή. Το τελευταίο που θες είναι να καθυστερείς τον επεξεργαστή με pointer dereferencing, ειδικά αν θέλεις να εκμεταλλευτείς τις δυνατότητες streaming. Ίσως να είναι καλύτερο να σχεδιάσεις πρώτα τον αλγόριθμο με SSE και μετά να βρεις τρόπο να τον προσαρμόσεις σε templates.&lt;br /&gt;
&lt;br /&gt;
Όσον αφορά την παράλληλη επεξεργασία, η Visual C++ υποστηρίζει το OpenMP, το οποίο σε βοηθάει σε μεγάλο βαθμό να φτιάξεις αλγόριθμους που δεν εξαρτώνται από τον αριθμό των επεξεργαστών του μηχανήματος, και τον τρόπο επικοινωνίας των επεξεργαστών. Το documentation περιλαμβάνει αρκετά παραδείγματα. Το σίγουρο πάντως είναι ότι η σχεδίαση των αλγορίθμων απαιτεί άλλη φιλοσοφία από αυτή που έχουμε συνηθίσει. Εκεί που ένα loop νομίζεις ότι θα πάει πιο γρήγορα με παράλληλη επεξεργασία, μπορεί να το δεις να πηγαίνει μερικές δεκάδες φορές πιο αργά!&lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18293.aspx</link><pubDate>Mon, 09 Oct 2006 20:27:29 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18293</guid><dc:creator>thAAAnos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18293.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18293</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;pkanavos wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;Δοκίμασες τις βιβλιοθήκες της Intel? Έχουν υλοποιήσεις όχι μόνο για vectors, αλλά ολόκληρων βιβλιοθηκών όπως η LAPACK. Για παράλληλη επεξεργασία υπάρχει το OpenMP στη Visual C++, αλλά έχει και η Intel επιπλέον δικές της βιβλιοθήκες.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;&lt;br&gt;Δεν κάνουν την δουλεία που θέλω... η LAPACK ουσιαστικά εχει C api και καθολου template expressions, ενω οι πιο κοντά σε αυτό που θέλω όπως η Blitz++, MTL (Matrix Template Lib)&lt;br&gt;δεν έχουν τίποτα από SSE...&lt;br&gt;&lt;br&gt;Η παράλληλη επεξεργασία δεν με απασχολεί ακόμα... Αλήθεια υπάρχει τίποτα για dual Core επεξεργαστες?&lt;br&gt;</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18144.aspx</link><pubDate>Fri, 06 Oct 2006 08:10:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18144</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18144.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18144</wfw:commentRss><description>Επιστρέφω στο αρχικό post για να πώ οτι αν μη τι άλλο, σ' ευχαριστούμε για τη μετάφραση. Ήταν ένα καταπληκτικό ερέθισμα να κοιτάξουμε λίγο στη βιβλιοθήκη μας απο το πανεπιστήμιο, οι άνθρωποι που ζούμε ως επι το πλείστον πλέον στον managed κόσμο :]</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18023.aspx</link><pubDate>Thu, 05 Oct 2006 22:00:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18023</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18023.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18023</wfw:commentRss><description>Δοκίμασες τις βιβλιοθήκες της Intel? Έχουν υλοποιήσεις όχι μόνο για vectors, αλλά ολόκληρων βιβλιοθηκών όπως η LAPACK. Για παράλληλη επεξεργασία υπάρχει το OpenMP στη Visual C++, αλλά έχει και η Intel επιπλέον δικές της βιβλιοθήκες.</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18021.aspx</link><pubDate>Thu, 05 Oct 2006 21:13:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18021</guid><dc:creator>thAAAnos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18021.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18021</wfw:commentRss><description>Κάποτε είχα δοκιμάσει να φτιάξω μια vector class με template specialization για κάθε τύπο (ints,floats) και με template expressions , loop unrolling , και πράξεις με SSE. Δεν τα κατάφερα όμως, :)  Ο κώδικας είχε γίνει τόσο περιπλοκος έτσι ώστε όταν έβαζα ένα feature, εσπαζα κατι άλλο...&lt;br /&gt;
&lt;br /&gt;
Μήπως έχει υπόψη του κάποιος κάτι τέτοιο? λέω μπας και ?</description></item><item><title>Re: Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18009.aspx</link><pubDate>Thu, 05 Oct 2006 20:19:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18009</guid><dc:creator>a.ka. Andr3w</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18009.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18009</wfw:commentRss><description>&lt;P&gt;Μα από εκεί το πήρα ένα μεγάλο reference, μιας και είναι παρα πολύ καλο για starters&lt;/P&gt;
&lt;P&gt;*Edit* : θα πρέπει να κάνω κάποιες διορθώσεις στα τυπογραφικά λάθη και σε κάποιες προτάσεις... θα το κάνω το βραδυ &amp;gt;_&amp;gt;, εάν έχω χρόνο θα γράψω και κάτι που δεν το αναφέρει το άρθρο αυτό που είναι Optimizing Normalized signed high-float Matrices in Assembly. Μέχρι τότε... back το work for now&lt;/P&gt;</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18004.aspx</link><pubDate>Thu, 05 Oct 2006 19:44:08 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18004</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18004.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18004</wfw:commentRss><description>Γιατί σκέφτηκα ακριβώς το ίδιο και έψαξα ακριβώς το ίδιο πράγμα ρε Παναγιώτη?</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/18003.aspx</link><pubDate>Thu, 05 Oct 2006 19:42:36 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:18003</guid><dc:creator>elam</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/18003.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=18003</wfw:commentRss><description>Στο άρθρο που αναφέρει ο Παναγιώτης, παίζει με struct και παίζει σωστά!&lt;br&gt;Η δομή του αλλάζει και στο Applied Shuffling αποκτά το τέταρτο μέλος της.&lt;br&gt;
&lt;br&gt;</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/17996.aspx</link><pubDate>Thu, 05 Oct 2006 18:48:47 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:17996</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/17996.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=17996</wfw:commentRss><description>Λοιπόν, το άρθρο σου μοιάζει πολύ με το &lt;A href="http://www.3dbuzz.com/vbforum/showthread.php?t=104753"&gt;&lt;STRONG&gt;HowTo: Inline Assembly &amp;amp; SSE: Vector normalization done fast!&lt;/STRONG&gt; &lt;/A&gt;. Ίδια ονόματα μεταβλητών, παρόμοια comments, ακόμα και το κείμενο του άρθρου είναι ίδιο στα περισσότερα σημεία. Μήπως ξέχασες να βάλεις στα references από που προέρχεται το άρθρο?</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/17981.aspx</link><pubDate>Thu, 05 Oct 2006 17:21:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:17981</guid><dc:creator>Νατάσα Μανουσοπούλου</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/17981.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=17981</wfw:commentRss><description>Στον κώδικά σου δηλώνεις επανειλημμένα το:&lt;br&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVec { &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;float&lt;/span&gt; index[3]; };&lt;/span&gt;&lt;br&gt;Ενώ στο σχόλιο από πάνω αναφέρεις τέσσερα στοιχεία του πίνακα. Επίσης σε άλλα σημεία χρησιμοποιείς (σωστά) τα στοιχεία 0-2 του sampleVec::index, ενώ σε άλλα χρησιμοποιείς το sampleVec::index[3], το οποίο βεβαίως είναι εκτός ορίων του array και πανωγράφει άσχετη μνήμη στο stack.&lt;br&gt;Δε βλέπω πώς θα μπορούσε να δουλέψει σωστά ο κώδικας που δίνεις.&lt;br&gt;</description></item><item><title>Απ: Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/17969.aspx</link><pubDate>Thu, 05 Oct 2006 13:57:23 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:17969</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/17969.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=17969</wfw:commentRss><description>Χμμμ, ίσως θα ήταν καλύτερο αντί να γράψουμε τόση assembly να χρησιμοποιήσουμε τα keywords του compiler για MMX και άνω. Η υποστήριξη υπάρχει από τη Visual C++ 6 και μετά. Π.χ. για να χρησιμοποιήσουμε την MULPS μπορούμε να καλέσουμε το __mm_mul_ps(a,b); Πέρα από το ότι δεν χρειάζεται να ανακατώσουμε assembly με τον κώδικα, γλυτώνουμε και λίγη από τη "λάτζα" που απαιτεί η assembly με το στήσιμο των registers.&lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Nomalizing in C++ via Assebly done Easy!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/17968.aspx</link><pubDate>Thu, 05 Oct 2006 11:58:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:17968</guid><dc:creator>a.ka. Andr3w</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/17968.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=17968</wfw:commentRss><description>&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Επειδή είδα κάποια post regarding assembly και C++ (και κυρίως MMX,SSE,SSE2 etc) είπα να κάνω και γω ένα post που μπορεί να βοηθήσει κάποιους η ακόμα δώσει εναύσματα σε κάποιους για περαιτέρω διάβασμα! Βασικά αυτό είναι ένα άρθρο παρα post... οποιος έχει όρεξη να κάτσει να ασχοληθεί παραπάνω ας μου πει...γιατί πάνω σε τέτοια έχω κάψει πολλά βραδια! Για να το διαβάσει κανεις αυτό το άρθρο θα πρέπει να έχει στοιχειώδης γνώσεις assembly και C++, δεν θα μπω σε λεπτομέρειες ούτε να γίνω πολύ περιεκτικός πάνω σε αυτό διότι είναι πολύ εξειδικευμένο θέμα από την μάνα του και θα είναι δυσανάγνωστο! Επίσης έχω ένα πρόβλημα στο να γράφω ελληνικά και χρησιμοποιώ με copy paste το πολύ χρήσιμο εργαλείο που μου έδωσε ο KelMan (τον ευχαριστώ πολύ) και ότι βλέπετε είναι σε greeklish και&amp;nbsp;copy paste από αυτό :P. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Βασικά επειδή και πολύ ακόμα αρέσκονται στο game development θα δείξω ένα πολύ interesting topic (κατ εμέ ofc) πως θα φτιάξουμε ένα αλγόριθμο ο οποιος θα κάνει πολύ γρήγορα Vector Normalization. Να υπενθυμίσω πως Vector είναι στα ελληνικά το διάνυσμα, όπου ο μαθηματικός ορισμός του διανύσματος είναι ένα μέγεθος το οποιο έχει φορα, κατεύθυνση και μέτρο. Όπως πριν αρχίσουμε πρέπει να ξέρουμε πως ο υπολογιστής αποθηκεύει τους Vector, τον αποθηκεύει με την Μορφή πινάκων και συγκεκριμένα με την μορφή:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Sample Vector Struct&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Where sampleVec.index[0] [ x coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[1] [ y coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[2] [ z coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[3] [ d coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note d is a dummy var and should be set always to 1, this is an essential step to define it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// as it's required for the matrix math to work! :O&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVec {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;float&lt;/span&gt; index[3];&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVecObsolete {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; index[2];&lt;br /&gt;&lt;br /&gt;};&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Τώρα λίγα λόγια για την assembly. Όπως έχει βγάλει η ISO το standard για τις C++ για την assembly (ISO-14882) μας δίνη native την επιλογή να χρησιμοποιήσουμε Native asm code μέσα στα C++ φιλε μας. Αυτό ήταν ένα πολύ βασικό πλεονέκτημα έναντι άλλων γλωσσών μιας και δίνη την δυνατότητα να παράγεις παρα πολύ γρήγορο κώδικα μιας και η assembly είναι (αν όχι) η γρηγορότερη γλώσσα προγραμματισμού, με το κόστος φυσικά του χρόνου καθώς ο προγραμματισμός σε assembly απαιτεί γνώσεις πάθος και μαζοχισμό...Όπως ένα υπάρχει ένα κακό αυτό το στάνταρ δεν κάνει ακριβές define το πως πρέπει να έχει γίνει το implementation των asm εντολών σε κάθε compiler (για περισσότερες λεπτομέρειες αναζητήστε κάτι που λέγεται manual :P) όμως επειδή πιστεύω πως οι περισσότεροι χρησιμοποιείτε MS Compiler θα δώσω ένα link του msdn στο τέλος για περισσότερες πληροφορίες! Όμως η Microsoft όπως πάντα έχει το δικό της δρόμο και δεν ακόλουθη στο ISO-asm sdr και χρησιμοποιεί αντί για asm έναν δικό της keyword το __asm! Ένα παράδειγμα είναι πχ:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; main( &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;/* main func args */&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Application Entry code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// ....&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// asm code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            __asm { ;Assembly code &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; placed here }&lt;br /&gt;&lt;br /&gt;           &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// More Application Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;           &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// blah blah!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt;; &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// End&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Επίσης παρατηρήστε πως μέσα στα __asm { }&amp;nbsp;brakets δεν ακολουθούνται πια οι κανόνες τις C/C++ παρα μονο τις assembly Note πως το ";" δεν χρειάζεται για να&amp;nbsp;τελειώσεις μια γραμμή αλλα για να κανεις Notes! Τελοσπάντων enough said, ας πιάσουμε δουλειά!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Είμαι σίγουρος πως όσοι δεν γνωρίζετε assembly θα αναρωτιέστε πως λειτουργεί ο assember. Well για να πω την αλήθεια τα πιο σημαντικά κομμάτια του assembler είναι οι Registers,&amp;nbsp;imagine em&amp;nbsp;σαν πολύ μικρά κομμάτια μνήμης που βρίσκονται στον επεξεργαστή όπου μπορούν να αποθηκευτούν δεδομένα. Όμως αυτό τι διαφορα έχει από τις κοινές μας μεταβλητές, που ουσιαστικά και αυτές ικανοποιούν τον ίδιο σκοπό? Η διαφορα ιάνει πως η μια (variable) έχει types δηλαδή int, int64, float etc ενώ η άλλη (συνήθως) δεν έχει types είναι just 0 η 1 :p. επειδή δεν θέλω να το κάνω πολύπλοκο θα παίξουμε με του γενικού τύπου Registers (dunno εάν το μετέφρασα κανονικά είναι General Purpose Registers κανονικά, arg αυτά τα Greek!), αυτές είναι στην περίπτωση μας EAX, EBX, ECX και EDX. Κάθε μια από αυτές είναι 32 bits και χωράει να κάνουμε store μια 32bit int μεταβλητή (όχι int64 etc) εάν θέλετε πάλι δείτε ποσο χώρο στον compiler θέλει ο κάθε type τις C/C++ χρησιμοποιήστε την sizeof() για να δείτε ακριβώς τα bits που χρειάζονται. Ok τώρα ας παίξουμε λίγο με τις Registers! ^_^&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; sampleFunction( &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;/* fun args */&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Normal Variable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      unsgined &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; i &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Enter assembly mode :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      __asm {&lt;br /&gt;&lt;br /&gt;               mov eax, i    ; This line moves i variable to eax register&lt;br /&gt;&lt;br /&gt;               add eax, 12 ; This line adds 12 to the eax register, meaning that now eax equals eax+12 or i+12&lt;br /&gt;&lt;br /&gt;               mov eax, i    ; This line moves back eax register to i variable&lt;br /&gt;&lt;br /&gt;               ; 3 Lines to make a simple Addition Operation... heh, pretty much&lt;br /&gt;&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit assembly mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Now our i variable equals to 12 since it was initialy 0, let's return it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt; i;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Aμα την τρέξετε αυτή την function θα δείτε πως το αποτέλεσμα θα είναι 12. ΠΡΟΣΟΧΉ! Ο assembler έχει δικό του notation και καλο θα ήταν εάν θέλετε να μια πλήρη γεύση για το τι παίζει καλύτερα να κάνετε κάποια μικροπαραδείγματα just to get the feel of it! θα δώσω άλλο ένα παράδειγμα με τις χρήσεις των registers για να δείτε:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; sampleFunction( &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;/* fun args */&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Normal Variable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      unsigned &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; i &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 5;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Enter assembly mode :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      __asm {&lt;br /&gt;&lt;br /&gt;               mov eax, i    ; This line moves i variable to eax register&lt;br /&gt;&lt;br /&gt;               _LABEL1:     ; This &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; a jump Label&lt;br /&gt;&lt;br /&gt;               dec eax       ; This line Decriments eax by 1&lt;br /&gt;&lt;br /&gt;               jz _PROCCED ; If the result of the previous operation was Zero jump to _PROCCED label &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;else&lt;/span&gt; procced to the next line&lt;br /&gt;&lt;br /&gt;               jmp _LABEL1 ; This line forces the program to Jump to _LABEL1&lt;br /&gt;&lt;br /&gt;               _PROCCED ; This &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; a jump Label&lt;br /&gt;&lt;br /&gt;               xor eax,  0xFFFFFFFF ; Notice the Hex number here!&lt;br /&gt;&lt;br /&gt;               mov eax, i    ; This line moves back eax register to i variable&lt;br /&gt;&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit assembly mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Now our i variable equals to  the max number that a 32 bit can store, let's return it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt; i;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Το τι κάνει το πρόγραμμα το αφήνω να το κάνετε compile και να το δείτε μονοι σας...;). Επίσης εάν θέλετε να πειραματιστείτε βάλτε και αλλα intructions ανάμεσα στα labels και δείτε πως αντιδράει το πρόγραμμα επίσης δοκιμάστε να αλλάξετε τον τύπο της μεταβλητής&amp;nbsp;"i" από unsigned σε signed ;)&lt;/P&gt;
&lt;P&gt;Τώρα θα πάμε σε κάτι όχι και τόσο βασικό (για αρχαριους) που λέγεται SIMD. Επειδή δεν θέλω να αραδιάσω 6-7 σελίδες με geek technical stuff, για αυτό&amp;nbsp;θα σας δείξω με λίγα λόγια τι κάνει. Όταν θες να κανεις manipulate κάτι είτε αυτό είναι σε assembly είτε σε C++ είσαι υποχρεωμένος να κανεις ένα πράγμα την φορα για παράδειγμα εάν θέλουμε να προσθέσουμε στο j και στο η +1 θα πρέπει:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; j,i &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0;&lt;br /&gt;&lt;br /&gt;j &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 10;&lt;br /&gt;&lt;br /&gt;i &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 12;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// One instruction for i&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;i++;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// One instruction for j&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;j++;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Aρα για να το κάνουμε αυτό θέλουμε 2 εντολές και ας πραγματοποιούμε την ίδια διαδικασία (δηλαδή increment) και στις 2 εντολές που δώσαμε, Αυτό το technique λέγεται και αλλιώς&amp;nbsp;SISD (Single-Instruction-Single-Data),&amp;nbsp;δηλαδή ότι βασικά ο CPU μπορεί να κάνει calculate ένα value at a time, ενώ εάν θες να κανεις calculate 2 values θα πρέπει να δώσεις 2 statements καταναλώνοντας έτσι διπλό χρόνο από ότι ένα μονο calculation.&lt;/P&gt;
&lt;P&gt;Τώρα ας μπούμε στο θέμα, imagine the world of 3D graphics&amp;nbsp;full apo Matrices, Vectors και όλα να είναι&amp;nbsp;multidimentinal data τα οποια πρέπει να επεξεργαστούν όσο πιο γρήγορα γίνετε!! Εάν ήθελες να προσθέσεις 2 Vectors με SISD θα εγγραφες κάτι σαν και αυτό:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// imagive 2 instances of sampleVecObsolete struct named as Vec1, Vec2;Now to add them we would use&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vec1.x &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Vec1.x &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;+&lt;/span&gt; Vec2.x;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vec1.y &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Vec1.y &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;+&lt;/span&gt; Vec2.y;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// z&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vec1.z &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Vec1.z &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;+&lt;/span&gt; Vec2.z;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// d is a dummy value required for matrix operation (multiplication) and not here ( it's declared in the other Struct)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Never add the last value of any matrix in 3D Graphics...it's a tip... to avoid dissasters&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Αλλα φανταστείτε τώρα να υπήρχε η&amp;nbsp;δυνατότητα από την CPU να πραγματοποιήσουμε και τα 3 instructions μαζί δηλαδή να προσθέσουμε και τα 3 compoments των 2 vectors μαζί χωρίς περαιτέρω κόπο, in fact that's what's SISD is all about! Πιστεύετε το η όχι το SISD υποστηρίζεται από τα περισσότερα CPU τις αγοράς. Από την εισαγωγή των εντολών&amp;nbsp;MMX τις Intel που ήταν μονο για Integer values (μεγάλο breakthough για την εποχή) ήρθε και η ώρα να λανσαριστούν και οι εντολές&amp;nbsp;SSE που&amp;nbsp;SSE είναι short για Streaming SISD Extentions και έδωσε την δυνατότητα για να κάνουμε πολύ fast multimedia programming για πρώτη φορα! Διότι έφερε το SISD σε float variables. Με την πρώτη εκδώσει των ΣΕ μπορείς να εκτέλεσις 4 32bit floats το οποιο είναι extremely useful όταν εξής να κανεις με&amp;nbsp;3D Programing ( 3D Vectors [x,y,z,d], 3D Matrices [2x2,3x3 or 4x4 array], High Color Graphics [ R,G,B,A] etc ). Ωραία τα λόγια αλλα πως μπορούμε να το χρησιμοποιήσουμε στις εφαρμογές μας? Πολύ απλά, σήμερα σχεδόν όλοι οι CPU έχουνε τις&amp;nbsp;SSE αλλα όχι όλοι για να είμαστε σίγουροι θα πρέπει να τσεκάρουμε το CPUid το οποιο υπάρχει σε κάθε Intel compatible CPU. Στις εφαρμογές σας θα πρέπει να έχετε 2 implementation ένα που θα το χρησιμοποιεί εάν είναι διαθέσιμες οι εντολές SSE και μια όταν δεν είναι, έτσι θα είστε ασφαλισμένοι 100 %. Ένα τέτοιο πρόγραμμα το οποιο ελέγξει εάν είναι supported θα έμοιαζε κάπως έτσι:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; main( &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;/* function args */&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;                &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Set up our Values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                unsigned &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; cpeinfo;&lt;br /&gt;                unsigned &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; cpsse3;&lt;br /&gt;                &lt;br /&gt;&lt;br /&gt;               &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Enter asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                  __asm &lt;br /&gt;&lt;br /&gt;                        {&lt;br /&gt;                                mov eax, 01h        ;01h &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; the parameter &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt; the CPUID command below&lt;br /&gt;                                cpuid                    ; We took the CPUid, now let's store the info where we want&lt;br /&gt;                                mov cpeinfo, edx   ;Get the info stored by CPUID&lt;br /&gt;                                mov cpsse3, ecx    ;info about SSE3 &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; stored &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;in&lt;/span&gt; ECX&lt;br /&gt;                         }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// End asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Now let's out put our results&lt;/span&gt;&lt;br /&gt;             &lt;br /&gt;&lt;br /&gt;             cout &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"1 - Instruction set is supported by CPU\n"&lt;/span&gt;;&lt;br /&gt;             cout &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"0 - Instruction set not supported\n"&lt;/span&gt;; &lt;br /&gt;             cout &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"--------------------------------\n"&lt;/span&gt;;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Here we check for the support !!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;             cout &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"MMX:  "&lt;/span&gt; &amp;lt;&amp;lt; ((cpeinfo &amp;gt;&amp;gt; 23) &amp;amp; 0x1 ) &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"\tSSE:  "&lt;/span&gt; &amp;lt;&amp;lt; ((cpeinfo &amp;gt;&amp;gt; 25) &amp;amp; 0x1 ) &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"\tSSE2: "&lt;/span&gt; &amp;lt;&amp;lt; ((cpeinfo &amp;gt;&amp;gt; 26) &amp;amp; 0x1 ) &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"\n"&lt;/span&gt;; &lt;br /&gt;             cout &amp;lt;&amp;lt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"SSE3: "&lt;/span&gt; &amp;lt;&amp;lt; ((cpsse3       ) &amp;amp; 0x1 ); &lt;br /&gt;}&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Τώρα για να δούμε εάν ο compiler μας σίγουρα μπορεί να καταλάβει ΣΕ προσπαθήστε να κάνετε compile το παρακάτω:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVecObsolete {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; index[2];&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; main( &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;/* func args */&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Make a Vector Instance&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         samleVecObsolete Vec1;&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Assign some Values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         Vec1.index[0] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0.5;&lt;br /&gt;&lt;br /&gt;         Vec1.index[1] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 1.5;&lt;br /&gt;&lt;br /&gt;         Vec1.index[2] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 3.141;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Now enter asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         __asm&lt;br /&gt;&lt;br /&gt;                  {&lt;br /&gt;&lt;br /&gt;                           &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Some mystrery code...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                           movups xmm1, Vec1&lt;br /&gt;&lt;br /&gt;                           mulps xmm1, xmm1&lt;br /&gt;&lt;br /&gt;                           movps Vec1, xmm1&lt;br /&gt;&lt;br /&gt;                  }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// End asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;           &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt; (&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; i =0;i&amp;lt;3;i++)&lt;br /&gt;&lt;br /&gt;                  {&lt;br /&gt;&lt;br /&gt;                           cout &amp;lt;&amp;lt; Vec1.index&lt;img src="/cs/emoticons/emotion-55.gif" alt="Idea" /&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;                  }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Εάν το κάνατε σωστά θα πρέπει να πήρατε έξοδο 0.25 2.25 9.86588, τι έγινε? Πολύ απλά πήρε θα νούμερα του Vector μας και τα ύψωσε στο τετράγωνο. Πως? Με τον μαγικό κώδικα που γράψαμε σε asm, nice heh. Anyway ας γυρίσουμε πίσω στους Registers, θυμάστε στην 32bit EAX? στην ΣΕ έχουμε κάτι παρόμοιο μονο που τώρα οι Registers είναι 128bit και δεν είναι απαραίτητο να περιέχουν 1 τιμή. Τώρα τα&amp;nbsp;"special" Registers&amp;nbsp;είναι τα XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7 (8 στο σύνολο, και είναι ακριβώς για να μπορέσουμε να κάνουμε operations με ένα 4x4 matrix, handy ;). Όπως είπαμε και πριν κάθε μια από αυτές τις "special"&amp;nbsp;Registers καταλαμβάνουν 128 bits of memory και χωράνε 4 32 bit, όπου το πρώτο καταλαμβάνει τα 0-31, το δεύτερο τα 32-63, το τρίτο τα 64-95 και το τελευταίο τα 96-127. Αυτό επίσης είναι γνώριμο πως λέγεται με τον ορισμό "Packet Single". Me to instruction Movups (Move Unaligned Packet Single) κάνουμε copy τον vector μας στην xmm1 Register (θα μπορούσαμε κάλλιστα να χρησιμοποιήσουμε και μια από τις άλλες) και χρησιμοποιούμε την movups γιατί δεν γνωρίζουμε εάν το address του διανύσματος μας Vec1, έχει γίνει aligned σε 16Byte Border στην μνήμη. Εάν γνωρίζετε ότι τα data σας έχουνε γίνει algined τότε σας προτείνω να χρησιμοποιείτε το Movaps είναι πολύ πιο γρήγορο!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Τώρα πίσω στο αρχικό μας στόχο, να φτιάξουμε ένα γρήγορο αλγόριθμο για να κάνουμε Normalize τα vectors μας! θα αρχίζω παραθέτοντας την γενική formula του normalization και μετά να την μετατρέψω σε κώδικα. Μιας και καλο θα ήταν να υπάρχει και μια non-SSE έκδοση του κώδικα σας μήπως και δεν υποστηρίζονται. Για να πετύχουμε ένα normalized Vector θα πρέπει να διατηρήσουμε την φορα και κατεύθυνση σου και να μειώσουμε το πλάτος του από 0 &amp;lt;= Mag &amp;lt;= 1, δηλαδή με απλά λόγια είναι κάτι σαν να πάρουμε το διάνυσμα μας και να το βάλουμε στην μοναδιαία σφαίρα όπου η ουρα του θα βρίσκετε το σημείο Ο(0,0) και η κορυφή του στο περίβλημα της. Η γενική formula για κάθε 3D-Vector είναι η ακόλουθη:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our Sample vector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;v3=[x,y,z,d];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Magnitute Calculation&lt;/span&gt;&lt;br /&gt;|v3| &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; sqrt(x²+y²+z²)&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Assign Normalized Magnitute&lt;/span&gt;&lt;br /&gt;v3_normalized &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; v3/|v3|&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Sw κώδικα C++ θα πρέπει να ήταν ως εξής:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Sample Vector Struct&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Where sampleVec.index[0] [ x coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[1] [ y coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[2] [ z coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[3] [ d coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note d is a dummy var and should be set always to 1, this is an essential step to define it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// as it's required for the matrix math to work! :O&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVec {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;float&lt;/span&gt; index[3];&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our Normalizing function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sampleVec Normalize4x1Matrix( sampleVec Vec1 )&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Calc Initial Magnitute&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;float&lt;/span&gt; length &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; sqrt( (Vec1.index[0] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;*&lt;/span&gt; Vec1.index[0]) &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;+&lt;/span&gt; (Vec1.index[1] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;*&lt;/span&gt; Vec1.index[1]) &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;+&lt;/span&gt; (Vec1.index[2] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;*&lt;/span&gt; Vec1.index[2]) );&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Now Normalize&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt;(i=0;i&amp;lt;3;i++)&lt;br /&gt;&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                     Vec1.index&lt;img src="/cs/emoticons/emotion-55.gif" alt="Idea" /&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Vec1.index&lt;img src="/cs/emoticons/emotion-55.gif" alt="Idea" /&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;/&lt;/span&gt; length;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Return the Product&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;         &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt; Vec1;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Στις γραμμές στις οποιες θα πρέπει να δοθεί βάση είναι αυτές που κάνουν τον υπολογισμό τις τετραγωνικής ρίζας και την διαίρεση με το υπολογισμένο magnitute. Όπως βλέπουμε στην πρώτη γραμμή έχουμε 3 προσθέσεις και 3 υπολογισμούς δυνάμεων και μια πολύ πολύ αργή sqrt() την οποια θα την εξετάσουμε με λεπτομέρεια αργότερα. Δεν θα ήταν πολύ ωραία να μπορούσαμε να κάνουμε τα 3 additions και τα 3 muls με την μια? Και όμως γίνετε, αλλα πριν προχωρήσουμε άλλο θα πρέπει να κάνουμε introduce μια άλλη τεχνική που λέγεται shuffe! Αυτή είναι η μια από τις δυσκολότερες εντολές (αν όχι η δυσκολότερη εντολή) από τις&amp;nbsp;SSE για να την μάθεις, για αυτό δώστε μεγάλη προσοχή!&lt;/P&gt;
&lt;P&gt;Το μεγαλύτερο πρόβλημα που αντιμετωπίζουμε είναι ότι με τις Registers Structure μας μπορούμε να κάνουμε operations με ίδιες συντεταγμένες δηλαδή με την Vec1.x και Vec2.x και όχι με Vec1.y και Vec2.x. και όπως δυστυχώς καταλαβαίνετε αυτό χρειαζόμαστε να κάνουμε εδώ :S! Θέλουμε να προσθέσουμε 3 συντεταγμένες του ιδιου Vector μαζί, και γεννιέται και εύλογο ερώτημα, πως θα το καταφέρουμε αυτό? Μα φυσικά με το shuffe που δεν είναι τίποτε άλλο από το να κάνει μείξεις με ανάμεσα στις Registers (καλά δεν είναι ακριβώς έτσι...αλλα για τις ανάγκες τις απλότητας το αφήνω εδώ :) ). Η πιθανή λύση αυτού του trivial "ερωτιμας" είναι να πάρουμε κάποια data από ένα block τις register και να τα κάνουμε copy σε ένα άλλο, αλλα αυτό είναι λάθος! γιατί το να μεταφέρνουμε data με τις&amp;nbsp;SSE είναι πολύ αργό, εδώ θα πρέπει να αναφέρω πως το να κάνουμε copy data από την Ram στις Register είναι πολύ αργό (αργότερο και από τα General Purpose Registers) και άμα θέλουμε να πάρουμε 2 compoments θα ήτανε ακόμα πιο αργό.. blah blah...αφήστε το καλύτερα :P. Παρολαυτά υπάρχει ένας τρόπος να πάρουμε τα data που θέλουμε από τις Registers μολονότι δεν είναι και εύκολος...!&lt;/P&gt;
&lt;P&gt;Η εντολή που κάνουμε όλη αυτή την φασαρία είναι η Shuffle (a.ka. Shuffled Packed Single). Αυτή η εντολή περιμένει 2 SSE-Registers και ένα byte Hex-String as operands. Οι πρώτες 2 θέσεις (0-63) θα διαγραφτούν και θα γραφτούν από 2 οποιαδήποτε στοιχεια του Destination Register (το πρώτο Register που δίνουμε ως operand) και οι 2 υπόλοιπες θέσεις (64-127) θα διαγραφτούν και θα γραφτούν από 2 οποιαδήποτα στοιχεια του Source Register(το δεύτερο Register που δίνουμε ως operand) Τα elements τα οποια έγιναν copy τα προσδιορίζει το 1 byte hex-string, ένα παράδειγμα είναι:&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;shufps xmm0, xmm1, 0x4e ; This shows the use and syntax of shuffe,  xmm0 &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; the First Register (a.ka. Destination), xmm1 &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; the Second Register (a.ka. Source), and 0x4e &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;is&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;                                        ; our 1 &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;byte&lt;/span&gt; hex &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Φανερά φαίνεται πως&amp;nbsp;θέλουμε να κάνουμε shuffle την xmm0 και αυτό σημαίνει πως όλα τα data τις xmm0 μπορεί να γίνουν overwrite ενώ η xmm1 είναι read only. Τώρα να εξηγήσουμε την χρήση της 1ής παραμέτρου (1 byte Hex-String) και για αρχή να κάνουμε decode το 4E πίσω στην διάδικοι τις μορφή... (p.s. υποθέτω πως ξέρετε πως να το "κανενε" αυτό, εάν όχι μάθετε το αλλιώς δεν θα μπορείτε να ασχοληθείτε και πολύ με τον assembler :P)&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; [4E]_16 &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; [0100 1110]_2 &lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Νομίζω πως φαίνεται ότι μπορούμε να ξεχωρίσουμε την διάδικοι (8bit) του μορφή σε 4 ομάδες των 2bit οι οποιες είναι 01, 00, 11, 10. Μήπως σας λέει κάτι αυτό το pattern? Αυτό το Hex-String μας λέει actually τι θα γίνει copy...καλο? Παρολαυτά θα πρέπει να έχετε υπόψη πως τα PC διαβάζουν το least significant bit first για αυτό θα πρέπει να τα διαβάζετε από τα αριστερά στα δεξιά...(don't&amp;nbsp;bother why,&amp;nbsp;just&amp;nbsp;do it ;)).&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Και τώρα να τι κάνει το shuffe που γράψαμε στην προηγουμενη γραμμή!&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;shufps xmm0, xmm1, 0x4e:&lt;br /&gt;;First element of XMM0 will be set to element 10 (the third element) of XMM0&lt;br /&gt;;2nd element of XMM0 will be set to element 11 (the fourth element) of XMM0&lt;br /&gt;;3rd element of XMM0 will be set to element 00 (the first element) of XMM1&lt;br /&gt;;4th element of XMM0 will be set to element 01 (the second element) of XMM1&lt;br /&gt;&lt;br /&gt;; kewl!!&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Ελπίζω να σας έγινε ξεκάθαρο πια... εάν όχι... παίξτε με τον παρακάτω κώδικα.. θα σας βοηθήσει να το καταλάβετε ακόμα καλύτερα!&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Sample Vector Struct&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Where sampleVec.index[0] [ x coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[1] [ y coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[2] [ z coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[3] [ d coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note d is a dummy var and should be set always to 1, this is an essential step to define it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// as it's required for the matrix math to work! :O&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVec {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;float&lt;/span&gt; index[3];&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our Programs entry point&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; main()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our sample vector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      vectorSample Vec1;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Let's set up some random values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      Vec1.index[0] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0.5;&lt;br /&gt;&lt;br /&gt;      Vec1.index[1] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 1.5;&lt;br /&gt;&lt;br /&gt;      Vec1.index[2] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 3.141;&lt;br /&gt;&lt;br /&gt;      Vec1.index[3] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 2; &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note we are doing here actual math...that's why I am assigning a value don't do it!! or either set it up back to 1 when you want to make multiplication&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Enter asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      __asm&lt;br /&gt;&lt;br /&gt;               {&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// The Magic Code ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                        movups xmm0, Vec1&lt;br /&gt;                        movaps xmm1, xmm0&lt;br /&gt;                        mulps xmm1, xmm1&lt;br /&gt;                        shufps xmm0, xmm1, 0x4e ; This line shuffes our registers!!&lt;br /&gt;                        movups Vec1, xmm0&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Finally output the result!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt;( &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; i=0; i&amp;lt;3;i++) {&lt;br /&gt;&lt;br /&gt;       cout &amp;lt;&amp;lt; Vec1.index&lt;img src="/cs/emoticons/emotion-55.gif" alt="Idea" /&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Τι γίνετε επάνω? Πρώτα από όλα κάνουμε store το Vec1 στην xmm0 και το Vec^2 στην xmm1, μετά πραγματοποιούμε αρκιβώς το ίδιο shuffe που εξηγήσαμε παραπάνω! Εάν θέλετε δοκιμάστε να μαντέψετε τα output values χωρίς να το τρέξετε... και να είστε 100 % σίγουροι πως το κατανοήσατε πλήρως μιας και αυτό είναι πολύ σημαντικό βήμα για να καταλάβετε τα υπόλοιπα. Εάν το βρήκατε δύσκολο μην σας νoιαζει είναι από τα λίγα στοιχεια των SSE που θέλουν προσοχή... Προσπαθήστε να παίξετε λίγο με τα hex-string values να δείτε πως αλλάζουν τα shuffling των registers και μονο όταν είναι 100 % πως τα καταλάβετε να συνεχίσετε να διαβάζετε :Ο!&lt;/P&gt;
&lt;P&gt;Applied Shuffling ftw!! Καιρός να βάλουμε όλα αυτά που δείξαμε στην πράξη!&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Sample Vector Struct&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Where sampleVec.index[0] [ x coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[1] [ y coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[2] [ z coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[3] [ d coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note d is a dummy var and should be set always to 1, this is an essential step to define it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// as it's required for the matrix math to work! :O&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVec {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;float&lt;/span&gt; index[3];&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our Programs entry point&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; main()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our sample vector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      vectorSample Vec1, Vec2;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Let's set up some random values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      Vec1.index[0] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0.5;&lt;br /&gt;&lt;br /&gt;      Vec1.index[1] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 1.5;&lt;br /&gt;&lt;br /&gt;      Vec1.index[2] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 3.141;&lt;br /&gt;&lt;br /&gt;      Vec1.index[3] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0; &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note we are doing here actual math...that's why I am assigning a value don't do it!! or either set it up back to 1 when you want to make multiplication&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Enter asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      __asm&lt;br /&gt;&lt;br /&gt;               {&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// The Magic Code ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                       movups xmm0, Vec1   &lt;br /&gt;                       mulps xmm0, xmm0 ;Calculate squares&lt;br /&gt;                       movaps xmm1, xmm0 &lt;br /&gt;                       shufps xmm0, xmm1, 0x4e ;Shuffle #1&lt;br /&gt;                       addps xmm0, xmm1 ;Add #1&lt;br /&gt;                       movaps xmm1, xmm0&lt;br /&gt;                       shufps xmm1, xmm1, 0x11 ;Shuffle #2&lt;br /&gt;                       addps xmm0, xmm1 ;Add #2&lt;br /&gt;                       movups Vec2, xmm0&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Finally output the result!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt;( &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; i=0; i&amp;lt;3;i++) {&lt;br /&gt;&lt;br /&gt;       cout &amp;lt;&amp;lt; Vec1.index&lt;img src="/cs/emoticons/emotion-55.gif" alt="Idea" /&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Αυτό το κομμάτι είναι παρα πολύ γρήγορο στην εκτέλεση... αλλα έχουμε και το πρόβλημα τις sqrt() το οποίο θα πρέπει να λύσουμε... τελευταίο και καλύτερο ;). Επίσης προσέξτε ότι πρέπει το last Value του Vector μας να είναι 0 (σε αυτή την περίπτωση) για να δουλέψει το shuffle...A! και "χριεαζομαστε" 2 shuffle για να κάνουμε την δουλειά μας σωστά.. το γιατί θα σας αφήσω να το βρείτε εσείς!&lt;/P&gt;
&lt;P&gt;Τελευταίο πρόβλημα είναι ο υπολογισμός της Sqrt() και όπως φυσικά θα γνωρίζετε εάν έχετε διαβάσει κάποιο σοβαρό βιβλίο αγλορύθμων θα έχει ένα ξεχωριστό κεφαλαιο αφιερωμένο στον γρήγορο υπολογισμό τους! Πολλοί compilers και libraries δεν έχουν πολλές version του sqrt() και exoum μια και καλή δηλαδή με διπλό accurancy (64bit). Αυτό όμως έχει μεγάλο αντίκτυπο μιας και είναι πολύ αργή και μπορείς να σώσεις μονο τα 32bit (στα 32bit systems) το οποιο φυσικά είναι πολύ ενοχλητικό...Ακόμα χειρότερα το κάνει ο "αλγοριμος" που ως επί το πλείστον χρησιμοποιείτε από τα libraries που ψάχνει την square-root κάνοντας προσεγγιστικές πράξις μέχρι να φτάσει το δοσμένο accurancy αυτό συνεπάγεται σε ένα μεγάλο αντίχτυπο στο performance! Η λύση σε όλο αυτό είναι πραγματικά απλή... θα θυσιάσουμε accurancy για perfomance (περίπου..δηλαδή). Αυτό θα ήταν έγκλημα για Scientific applications αλλα για Graphics και Multimedia Algorythms είναι ότι πρέπει! Επίσης θα πρέπει να γνωρίζουμε πως σε αυτές τις περίπτωσις χρησιμοποιούμε ένα trick το οποιο είναι οι Loop-Up Tables, που αυτό είναι να υπολογίσουμε κάποια typical values στην αρχή του προγράμματος μας όμως αυτό για να το κάνει κάποιος πρέπει να είναι πολύ καλός γνωστης μαθηματικών και έμπειρος προγραμματιστής. για καλή μας τύχη αυτό το έχει ήδη implemented το SSE για αυτό cheer! &lt;/P&gt;
&lt;P&gt;Η εντολή στην υποία θα αναφερθούμε είναι η RSQRTPS (reciproce square root of packed single)&amp;nbsp;και παίρνει 2 registers και υπολογίζει το αντίστροφο (reciprocal) τις sqrt() δηλαδή 1/sqrt() από τον "ενσωματομετο" στον CPU Loop-Up Table για κάθε element του Destination Register&amp;nbsp;και του Source Register. Αυτό όμως έχει και αλλα πλεονεκτήματα μιας και μετατρέπει την διαίρεση μας σε πολλαπλασιασμό! Θα πεταχτείτε και θα πείτε τι λέει αυτός ο τρελός και που βρήκε την διαίρεση... Η διαίρεση είναι μετά τον υπολογισμό του Magnitude μας από την Sqrt() και θα πρέπει να το διαιρέσουμε με κάθε element του Vec1 μας. Επίση λοιπόν η διαίρεση είναι πολύ πιο χρονοβόρα από το τον πολλαπλασιασμό είναι σαν να έχουμε έτοιμη την formula μας! Αλλα αφού είναι Vec1 / length η Vec1 / sqrt() και μας το μετατρέπει σε Vec1 * (1/sqrt()) μιας και βρίσκει το reciprocal&amp;nbsp;της sqrt() μας λύνει τα χερια! Δεν θα μπω σε details όπως τι γίνετε εάν δώσουμε αρνητικές τιμές etc... ξεφεύγει από το scope του topic! Σας αφήνω να το κοίταξε te μονοι σας! Και τώρα το τελευταίο μας polished Normalizing Program!&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Sample Vector Struct&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Where sampleVec.index[0] [ x coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[1] [ y coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[2] [ z coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;//           sampleVec.index[3] [ d coordinate compoment of Vector ]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note d is a dummy var and should be set always to 1, this is an essential step to define it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// as it's required for the matrix math to work! :O&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;struct&lt;/span&gt; sampleVec {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;float&lt;/span&gt; index[3];&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our Programs entry point&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; main()&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Our sample vector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      vectorSample Vec1;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Let's set up some random values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      Vec1.index[0] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0.5;&lt;br /&gt;&lt;br /&gt;      Vec1.index[1] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 1.5;&lt;br /&gt;&lt;br /&gt;      Vec1.index[2] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 3.141;&lt;br /&gt;&lt;br /&gt;      Vec1.index[3] &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 0; &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Note we are doing here actual math...that's why I am assigning a value don't do it!! or either set it up back to 1 when you want to make multiplication&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Enter asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      __asm&lt;br /&gt;&lt;br /&gt;               {&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// The Magic Code ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                       movups xmm0, Vec1&lt;br /&gt;                       movaps xmm2, xmm0&lt;br /&gt;                       mulps xmm0, xmm0&lt;br /&gt;                       movaps xmm1, xmm0&lt;br /&gt;                       shufps xmm0, xmm1, 0x4e&lt;br /&gt;                       addps xmm0, xmm1&lt;br /&gt;                       movaps xmm1, xmm0&lt;br /&gt;                       shufps xmm1, xmm1, 0x11&lt;br /&gt;                       addps xmm0, xmm1&lt;br /&gt;                       rsqrtps xmm0, xmm0 &lt;br /&gt;                       mulps xmm2, xmm0&lt;br /&gt;                       movups Vec1, xmm2&lt;br /&gt;&lt;br /&gt;               }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit asm mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Finally output the result!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;for&lt;/span&gt;( &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt; i=0; i&amp;lt;3;i++) {&lt;br /&gt;&lt;br /&gt;       cout &amp;lt;&amp;lt; Vec1.index&lt;img src="/cs/emoticons/emotion-55.gif" alt="Idea" /&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Exit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Δεν θα βάλω comments ελπίζοντας πως μετά από όλο αυτό θα καταλαβαίνετε τι συμβαίνει.. έστω στο περίπου! Έχει πάει 5 το πρωί κουράστηκα... δεν μπορώ να γράψω άλλο... σας αφήνω... ελπίζω να μην σας κούρασε και να ήταν εύκολο στο διάβασμα... δεν ξέρω εάν βγήκε καλο έχω συνηθίσει να γράφω στα αγγλικά τέτοιου είδους stuff! tesp τώρα τα links που σας υποσχέθηκα!&lt;/P&gt;
&lt;P&gt;Microsoft Info Regarding the Inline Assembler:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/vclang/html/_core_assembler_.28.inline.29_.topics.asp"&gt;http://msdn.microsoft.com/library/en-us/vclang/html/_core_assembler_.28.inline.29_.topics.asp&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Developers Info @ Intel (for SEE and Stuff)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.intel.com/design/pentium4/manuals/index_new.htm"&gt;http://www.intel.com/design/pentium4/manuals/index_new.htm&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Nice article about SISD&lt;/P&gt;
&lt;P&gt;&lt;A href="http://arstechnica.com/articles/paedia/cpu/simd.ars"&gt;http://arstechnica.com/articles/paedia/cpu/simd.ars&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The article has Heavy References from&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.3dbuzz.com/vbforum/showthread.php?t=104753"&gt;http://www.3dbuzz.com/vbforum/showthread.php?t=104753&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Above all!! Happy Programming and wish me kali 3ekourasi!! :P&lt;/P&gt;
&lt;P&gt;Vrika xrono mono na kanw to edit twra 8a prepi na douleboun xarma... anyway otan vrw ligo xrono akoma 8a to simplirwsw gia to optimization pou ipa, till then c ya&lt;/P&gt;</description></item></channel></rss>