<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Buy Cafergot Without Prescription</title>
	<atom:link href="http://assemblyrequired.crashworks.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://assemblyrequired.crashworks.org</link>
	<description>Technical Notes On Game Development</description>
	<lastBuildDate>Tue, 13 Mar 2012 19:31:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2012/03/13/ai-driven-dynamic-dialog-at-gdc-2012/</link>
		<comments>http://assemblyrequired.crashworks.org/2012/03/13/ai-driven-dynamic-dialog-at-gdc-2012/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 17:00:56 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=504</guid>
		<description><![CDATA[At last week's Game Developers' Conference I delivered a talk titled "AI-driven Dynamic Dialog" Buy Zithromax Without Prescription, , describing the dialog system used in Left4Dead, Dota, and basically all of Valve's games since The Orange Box. A PDF export of the slides for my talk is now available here. I've also created a support [...]]]></description>
			<content:encoded><![CDATA[<p> At last week's Game Developers' Conference I delivered <a href="http://schedule.gdconf.com/session/6437/AI-driven_Dynamic_Dialog_through_Fuzzy_Pattern_Matching._Empower_Your_Writers">a talk titled "AI-driven Dynamic Dialog"</a> <b>Buy Zithromax Without Prescription</b>, , describing the dialog system used in <em>Left4Dead</em>, <em>Dota</em>, and basically all of Valve's games since <em>The Orange Box</em>.<img src="http://assemblyrequired.crashworks.org/wp-content/uploads/2012/03/the-general-idea-300x168.jpg" alt="Summary graphic of voice-rules database" title="The General Idea - AI-Driven Dynamic Dialog - GDC2012 " width="300" height="168" class="size-medium wp-image-503" style="float:right; padding:2em" /></p>
<p>A PDF export of the slides for my talk is now available <a href="http://crashworks.org/gdc12/GDC2012_Ruskin_Elan_DynamicDialog.pdf">here</a>. I've also created <a href="http://assemblyrequired.crashworks.org/gdc2012-dynamic-dialog/">a support page</a> where I'll gather all information, <b>buy generic Zithromax</b>, <b>Zithromax used for</b>, bibliography, and followup associated with that particular talk, <b>Zithromax alternatives</b>.  <b>Zithromax images</b>, I've also posted the the videos mentioned in the slides (since obviously they can't be embedded into a PDF):</p>
<p><ol><br />
	<li><a href="http://www.youtube.com/watch?v=j4eIu6LxdZg">Two Bots: Environment-Aware Speech</a></li><br />
	<li><a href="http://www.youtube.com/watch?v=pYpCeql993M">Two Bots: Starting a Conversation</a></li><br />
	<li><a href="http://www.youtube.com/watch?v=2aozwfumnH4" title="Two Bots: Memory and Context">Two Bots: Memory and Context</a></li><br />
	<li><a href="http://www.youtube.com/watch?v=T5-2EnX5-K0">Left4Dead2: Variety</a></li><br />
	<li><a href="http://www.youtube.com/watch?v=fy29rWa21qg">Left4Dead2: Automatic Barks</a></li><br />
	<li><a href="http://www.youtube.com/watch?v=-1CuB7FtPPk">Left4Dead2: Environmentally Triggered Dialog</a></li><br />
</ol></p>
<p></p>
<p></p>
<p></p>
<p>Thanks to everyone who stuck with me through late flights and laptop failures to the last session of GDC 2012.  Rx free Zithromax.  Zithromax dose.  Zithromax pharmacy.  Zithromax forum.  Zithromax photos.  Zithromax price, coupon.  Zithromax long term.  Purchase Zithromax.  Buy Zithromax no prescription.  Real brand Zithromax online.  Zithromax recreational.  Generic Zithromax.  No prescription Zithromax online.  Zithromax no rx.  Australia, uk, us, usa.  Japan, craiglist, ebay, overseas, paypal.  Doses Zithromax work.  Buy Zithromax from mexico.  What is Zithromax.  Online buying Zithromax hcl.  Buy Zithromax without a prescription.  Zithromax overnight.  Is Zithromax safe.  Buying Zithromax online over the counter.  Where can i buy cheapest Zithromax online.  Zithromax duration.  Zithromax trusted pharmacy reviews.  Online Zithromax without a prescription.  Order Zithromax online overnight delivery no prescription.  Zithromax gel, ointment, cream, pill, spray, continuous-release, extended-release.  Order Zithromax from mexican pharmacy.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=22'>Buy Clonidine Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=329'>Clomid For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=213'>Buy Flagyl Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=18'>Tramadol over the counter</a>. <a href='http://assemblyrequired.crashworks.org/?p=25'>Buy Celebrex from mexico</a>.<br />
<b>Trackbacks from:</b> <a href='http://kimberlyjarman.net/?p=12129'>Buy Zithromax Without Prescription</a>. <a href='http://www.audaciousrecords.com/?p=324'>Buy Zithromax Without Prescription</a>. <a href='http://blog.simplybill.com/?p=129'>Buy Zithromax Without Prescription</a>. <a href='http://quiltguildindy.net/?p=1781'>Buy cheap Zithromax no rx</a>. <a href='http://sportygirlnation.com/?p=963'>Zithromax images</a>. <a href='http://www.anstallningslos.se/hlund/?p=152'>Buy Zithromax without prescription</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2012/03/13/ai-driven-dynamic-dialog-at-gdc-2012/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2011/03/11/why-is-it-called-a-core-dump-anyway/</link>
		<comments>http://assemblyrequired.crashworks.org/2011/03/11/why-is-it-called-a-core-dump-anyway/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 02:01:02 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Talks]]></category>
		<category><![CDATA[gdc11talk]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=415</guid>
		<description><![CDATA[Amoxicillin For Sale, The diagnostic file emitted by a crashing process in a modern operating system can contain a variety of useful information, including exception type, current instruction, CPU state, call stack, and sometimes the entire contents of the current thread's stack or even the entire process heap. So why is it called a "core [...]]]></description>
			<content:encoded><![CDATA[<p> <img src="http://assemblyrequired.crashworks.org/wp-content/uploads/2011/03/Warp_core_breach_flashpoint-300x229.jpg" alt="Star Trek: TNG Warp Core Breach" title="Warp_core_breach_flashpoint" width="250" height="191" class="alignright size-medium wp-image-412" style="padding-left: 1em;" /> <b>Amoxicillin For Sale</b>, The diagnostic file emitted by a crashing process in a modern operating system can contain a variety of useful information, including exception type, current instruction, CPU state, call stack, and sometimes the entire contents of the current thread's stack or even the entire process heap. So why is it called a "core dump", <b>comprar en línea Amoxicillin, comprar Amoxicillin baratos</b>.  <b>Amoxicillin description</b>, For years I thought this was an amusing <em>Star Trek</em> reference by the original implementors of UNIX, after all the episodes in which the <em>Enterprise</em>'s reactor threatens to explode and Geordi has to save them by "<a href="http://memory-alpha.org/wiki/Warp_core_ejection_system">dumping the warp core</a>, <b>Amoxicillin blogs</b>, <b>Buy Amoxicillin without prescription</b>, " but it turns out the actual explanation is much more prosaic.</p>
<p><a href="http://assemblyrequired.crashworks.org/wp-content/uploads/2011/03/Ferrite_core_memory.jpg"><img src="http://assemblyrequired.crashworks.org/wp-content/uploads/2011/03/Ferrite_core_memory-300x287.jpg" alt="Ferrite Core Memory" title="Ferrite_core_memory" width="300" height="287" class="alignleft size-medium wp-image-411" style="padding: 1em;" /></a>In the days before computers used <a href="http://en.wikipedia.org/wiki/Dynamic_random_access_memory">capacitor-based dRAM</a>, <b>Amoxicillin photos</b>, <b>Amoxicillin gel, ointment, cream, pill, spray, continuous-release, extended-release</b>, the dominant technology for main memory was <a href="http://en.wikipedia.org/wiki/Magnetic_core_memory">to store bits as magnetic polarization in a grid of tiny ferrite cores</a> (iron rings). Thus a machine's main memory was literally called <em>core memory</em>, <b>Amoxicillin from mexico</b>, <b>Canada, mexico, india</b>, or simply <em>core</em>. When a computer of this era crashed, it would simply output the entire contents of main memory to the punchcard printer, literally <em>dumping core</em> to output, <b>Amoxicillin For Sale</b>. Later, <b>Amoxicillin trusted pharmacy reviews</b>, <b>Amoxicillin use</b>, these core dumps became large files on the machine's drum or disk drive, and eventually core memory became obsolete in favor of static and dynamic RAM, <b>about Amoxicillin</b>, <b>Online Amoxicillin without a prescription</b>, but the name remained.</p>
<p>If that sounds painful, <b>Amoxicillin used for</b>, <b>Amoxicillin wiki</b>, consider the <a href="http://en.wikipedia.org/wiki/MIT_Whirlwind">Whirlwind </a>computer developed at MIT around 1951 (pictured below). When this 2kB, <b>after Amoxicillin</b>, <b>Amoxicillin online cod</b>, 0.04mHz behemoth crashed, it would simply display the entire contents of memory as a string of octal numbers on a dedicated CRT screen, <b>Amoxicillin alternatives</b>.  <b>Australia, uk, us, usa</b>, Then, an automated camera would take a picture of this CRT on microfilm<sup>1</sup>, <b>my Amoxicillin experience</b>.  <b>Amoxicillin For Sale</b>, You, the programmer, would get the developed microfilm the next morning and display it on a projector, which would be your crash debugger.  <b>Buy Amoxicillin no prescription</b>, Operand highlighting was done with a brightly colored marker on the film transparency, and the disassembler was a guy you called on the phone to ask what instruction 0125715 meant, <b>buy no prescription Amoxicillin online</b>.  <b>Cheap Amoxicillin no rx</b>, At least the dump files themselves were small &mdash; about 35 millimeters, more or less, <b>Amoxicillin dosage</b>.  <b>Amoxicillin natural</b>, <br clear="all" /><br />
[caption id="attachment_414" align="aligncenter" width="600" caption="Control room for MIT&#039;s Whirlwind computer, circa 1951"]<a href="http://assemblyrequired.crashworks.org/wp-content/uploads/2011/03/whirlwind_control_room_640x4001.jpg"><img src="http://assemblyrequired.crashworks.org/wp-content/uploads/2011/03/whirlwind_control_room_640x4001.jpg" alt="1951 computer control room with CRT display and vacuum tubes" title="Whirlwind Control Room" width="600" height="450" class="size-full wp-image-414" /></a>[/caption]</p>
<p><sup>1</sup>Everett, <b>purchase Amoxicillin for sale</b>, <b>Ordering Amoxicillin online</b>, R.R. The Whirlwind I Computer, <b>herbal Amoxicillin</b>.  <b>Buy Amoxicillin online cod</b>, <em>Proceedings of the 1951 Joint AIEE-IRE Computer Conference</em>, pp, <b>Amoxicillin pharmacy</b>.  <b>Kjøpe Amoxicillin på nett, köpa Amoxicillin online</b>, 70-74, Philadelphia, <b>Amoxicillin without prescription</b>, <b>Where can i cheapest Amoxicillin online</b>, PA, 1951, <b>Amoxicillin brand name</b>.  Order Amoxicillin from United States pharmacy.  Is Amoxicillin addictive.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=92'>Accutane For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=124'>Buy Temovate Cream Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=21'>Lipitor For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=213'>Where can i buy cheapest Flagyl online</a>. <a href='http://assemblyrequired.crashworks.org/?p=448'>Retin-A samples</a>. <a href='http://assemblyrequired.crashworks.org/?p=99'>Ordering Diclofenac online</a>.<br />
<b>Trackbacks from:</b> <a href='http://dearjanedialogues.com/?p=700'>Amoxicillin For Sale</a>. <a href='http://mccbonline.org/?p=141'>Amoxicillin For Sale</a>. <a href='http://tamarindthai.us/?p=1272'>Amoxicillin For Sale</a>. <a href='http://kimberlyjarman.net/?p=12277'>Where can i buy cheapest Amoxicillin online</a>. <a href='http://www.obsinc.net/blog/?p=37'>Amoxicillin maximum dosage</a>. <a href='http://emquinn.com/?p=152'>Amoxicillin interactions</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2011/03/11/why-is-it-called-a-core-dump-anyway/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2011/03/08/annotated-slides-for-gdc11-forensic-debugging/</link>
		<comments>http://assemblyrequired.crashworks.org/2011/03/08/annotated-slides-for-gdc11-forensic-debugging/#comments</comments>
		<pubDate>Tue, 08 Mar 2011 17:00:44 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Talks]]></category>
		<category><![CDATA[gdc11talk]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=400</guid>
		<description><![CDATA[The annotated slides for my "Forensic Debugging" GDC talk are now available here.]]></description>
			<content:encoded><![CDATA[<p> <img src="http://assemblyrequired.crashworks.org/wp-content/uploads/2011/03/qbert_mars-300x265.png" alt="Angry-looking Mars" title="QBert On Mars" width="300" height="265" class="alignright size-medium wp-image-401" style="padding-left: 1em;" /> The <a href="http://crashworks.org/gdc11/elan_ruskin_programming_forensic_debugging.pdf">annotated slides</a> for my GDC talk on <em>Forensic Debugging and Crash Analysis</em> <b>Zithromax For Sale</b>, , containing my speaker's notes and some narration, are now available for <a href="http://crashworks.org/gdc11/elan_ruskin_programming_forensic_debugging.pdf">download in PDF format here</a>. The PowerPoint should appear on the GDC Vault and <a href="http://www.valvesoftware.com/company/publications.html">Valve's Publications webpage</a> soon, <b>online buying Zithromax hcl</b>, <b>Zithromax price, coupon</b>, too.</p>
<p>This week I'm looking into the Steam side of Valve's automated customer crash collecting technology, <b>Zithromax without a prescription</b>, <b>Zithromax description</b>, and what we can do to accumulate and usefully expose customer stability data to all our partners who ship with <a href="http://www.steampowered.com/steamworks/">Steamworks</a>. If you think this would be a useful feature for your studio to use in its games, <b>is Zithromax safe</b>, <b>Zithromax schedule</b>, please let me know. You can either contact me through the comment form here, <b>buy Zithromax without prescription</b>, <b>Zithromax price</b>, or by mailing me directly at my Valve address.  Zithromax from canadian pharmacy.  Discount Zithromax.  Zithromax long term.  Buy Zithromax from mexico.  Buy Zithromax without a prescription.  Purchase Zithromax.  Zithromax coupon.  Online buying Zithromax.  Buy cheap Zithromax no rx.  Zithromax treatment.  Taking Zithromax.  Generic Zithromax.  Zithromax interactions.  Zithromax pics.  Order Zithromax online overnight delivery no prescription.  No prescription Zithromax online.  Zithromax results.  Effects of Zithromax.  Fast shipping Zithromax.  Zithromax no prescription.  Where to buy Zithromax.  Zithromax street price.  Zithromax blogs.  Where can i find Zithromax online.  Buy generic Zithromax.  Buy cheap Zithromax.  Comprar en línea Zithromax, comprar Zithromax baratos.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=389'>Buy Amoxicillin Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=166'>Buy Cafergot Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=31'>Buy Erythromycin Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=92'>Purchase Accutane online</a>. <a href='http://assemblyrequired.crashworks.org/?p=329'>Real brand Clomid online</a>. <a href='http://assemblyrequired.crashworks.org/?p=234'>About Retin-A</a>.<br />
<b>Trackbacks from:</b> <a href='http://rhsheldon.com/?p=1577'>Zithromax For Sale</a>. <a href='http://sportygirlnation.com/?p=966'>Zithromax For Sale</a>. <a href='http://emquinn.com/?p=183'>Zithromax For Sale</a>. <a href='http://tomledin.com/blog/?p=1346'>Zithromax use</a>. <a href='http://www.beauty-cosmetic-guide.com/blog/?p=67'>Zithromax pics</a>. <a href='http://blog.simplybill.com/?p=120'>Zithromax trusted pharmacy reviews</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2011/03/08/annotated-slides-for-gdc11-forensic-debugging/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2011/03/06/forensic-debugging-thanks-are-due/</link>
		<comments>http://assemblyrequired.crashworks.org/2011/03/06/forensic-debugging-thanks-are-due/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 21:44:13 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Talks]]></category>
		<category><![CDATA[gdc11talk]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=389</guid>
		<description><![CDATA[Buy Amoxicillin Without Prescription, While debugging a smashed stack may seem like a heroic feat, the most heroic thing about my talk is the amount of time, effort, and care my friends spent to help me put it together. I would never have made it to the GDC, Amoxicillin pictures, Amoxicillin forum, let alone made [...]]]></description>
			<content:encoded><![CDATA[<p> <b>Buy Amoxicillin Without Prescription</b>, While debugging a smashed stack may seem like a heroic feat, the most heroic thing about my talk is the amount of time, effort, and care my friends spent to help me put it together. I would never have made it to the GDC, <b>Amoxicillin pictures</b>, <b>Amoxicillin forum</b>, let alone made any sense whatsoever onstage, without the support of all my friends inside and outside Valve, <b>Amoxicillin recreational</b>.  <b>Amoxicillin class</b>, A special badge of courage is due those those who bravely offered to sit through my rehearsals, gave me details for slides, <b>where can i order Amoxicillin without prescription</b>, <b>Purchase Amoxicillin online</b>, or in some other way helped distill ninety minutes of inane gibbering into one hour of assembly and win:</p>
<p><ul><br />
<li>Jeep Barnett</li><br />
<li>Dan Berger</li><br />
<li>Iestyn Bleasdale-Shepherd</li><br />
<li>Bank Charnchaichujit</li><br />
<li>John Cook</li><br />
<li>Kerry Davis</li><br />
<li>Bruce Dawson</li><br />
<li>Michelle Garrison</li><br />
<li>Bronwen Grimes</li><br />
<li>Dave Kircher</li><br />
<li>Tejeev Kohli</li><br />
<li>Joe Ludwig</li><br />
<li>Jason Mitchell</li><br />
<li>Kyle Monroe</li><br />
<li>Marc Nagel</li><br />
<li>Olivier Nallet</li><br />
<li>Alfred Reynolds</li><br />
<li>Dave Riller</li><br />
<li>Mike Sartain</li><br />
<li>Dave Saunders</li><br />
</ul></p>
<p>Thanks, guys and gals &mdash; I wouldn't have done it without you, <b>get Amoxicillin</b>.  What is Amoxicillin.  Amoxicillin no rx.  Purchase Amoxicillin online no prescription.  Amoxicillin images.  Amoxicillin cost.  Japan, craiglist, ebay, overseas, paypal.  Amoxicillin steet value.  Online buy Amoxicillin without a prescription.  Doses Amoxicillin work.  Amoxicillin overnight.  Amoxicillin mg.  Real brand Amoxicillin online.  Order Amoxicillin no prescription.  Order Amoxicillin from mexican pharmacy.  Low dose Amoxicillin.  Rx free Amoxicillin.  Order Amoxicillin online c.o.d.  Amoxicillin from canada.  Amoxicillin dangers.  Buying Amoxicillin online over the counter.  Where can i buy Amoxicillin online.  Amoxicillin over the counter.  Amoxicillin dose.  Amoxicillin canada, mexico, india.  Buy Amoxicillin online no prescription.  Amoxicillin australia, uk, us, usa.  Amoxicillin reviews.  Amoxicillin maximum dosage.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=181'>Flagyl For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=16'>Buy Plavix Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=39'>Synthroid For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=384'>Herbal Clomid</a>. <a href='http://assemblyrequired.crashworks.org/?p=19'>Buy Stromectol online cod</a>.<br />
<b>Trackbacks from:</b> <a href='http://www.thelodgeatgovernmentcamp.com/?p=66'>Buy Amoxicillin Without Prescription</a>. <a href='http://formingfloridacorporations.com/?p=27'>Buy Amoxicillin Without Prescription</a>. <a href='http://www.chiang-mai-resort.net/?p=139'>Buy Amoxicillin Without Prescription</a>. <a href='http://sushithaicary.com/Japanese_and_Thai_Restaurant_Cuisine_Cary_NC/?p=1'>Cheap Amoxicillin no rx</a>. <a href='http://joshdulac.com/?p=1407'>Where can i buy Amoxicillin online</a>. <a href='http://blog.axiomone.com/?p=236'>Amoxicillin without a prescription</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2011/03/06/forensic-debugging-thanks-are-due/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2011/03/05/preliminary-gdc-slides-posted/</link>
		<comments>http://assemblyrequired.crashworks.org/2011/03/05/preliminary-gdc-slides-posted/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 00:08:39 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Talks]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=384</guid>
		<description><![CDATA[Until the full slides are available in the GDC Vault, I've exported most of my GDC2011 slide deck as a PDF series of still images, to help fill in the notes of anyone who might have attended but missed a point or two.]]></description>
			<content:encoded><![CDATA[<p> <b>Buy Clomid Without Prescription</b>, Thanks to everyone who came to my "Forensic Debugging" talk at the 2011 Game Developers' Conference. I hope it was valuable to all who attended, <b>Clomid for sale</b>.  <b>Buy Clomid from canada</b>, The lecture covered a great deal of ground in a short time, and so the slides necessarily had to go by rather quickly, <b>Clomid duration</b>.  <b>Clomid samples</b>, Eventually a video of my presentation will be at the GDC vault. In the meantime, <b>where can i buy cheapest Clomid online</b>, <b>Cheap Clomid</b>, I've exported most of the deck as <a href="http://crashworks.org/gdc11/elan_ruskin_programming_forensic_debugging.pdf">a series of annotated PDF images here</a>, to help fill in the notes of anyone who might have attended but missed a point or two, <b>Clomid images</b>.  <b>Where can i buy Clomid online</b>, The intent of my talk was to give a general overview of the forensic mindset, the tools available, <b>cheap Clomid</b>, <b>Order Clomid online c.o.d</b>, and demonstrate that rather than being a dark art, the science of crash analysis is something that everyone can learn, <b>purchase Clomid online</b>.  Kjøpe Clomid på nett, köpa Clomid online.  Clomid schedule.  Clomid duration.  Buy cheap Clomid no rx.  Clomid blogs.  Purchase Clomid for sale.  Rx free Clomid.  Where can i cheapest Clomid online.  Clomid results.  Clomid description.  Herbal Clomid.  Clomid for sale.  Buy Clomid without a prescription.  Buy Clomid online no prescription.  Buy Clomid from canada.  Buy cheap Clomid.  Online Clomid without a prescription.  Is Clomid safe.  Online buying Clomid hcl.  Clomid trusted pharmacy reviews.  Canada, mexico, india.  Taking Clomid.  Clomid australia, uk, us, usa.  Discount Clomid.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=234'>Retin-A For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=89'>Buy Proscar Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=99'>Diclofenac For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=16'>Buying Plavix online over the counter</a>. <a href='http://assemblyrequired.crashworks.org/?p=31'>Erythromycin duration</a>. <a href='http://assemblyrequired.crashworks.org/?p=166'>Cafergot price</a>.<br />
<b>Trackbacks from:</b> <a href='http://quiltguildindy.net/?p=253'>Buy Clomid Without Prescription</a>. <a href='http://mariaespinosa.com/blog/?p=73'>Buy Clomid Without Prescription</a>. <a href='http://www.fractal.gr/?p=46'>Buy Clomid Without Prescription</a>. <a href='http://leaderonomics.com/soundbytes/?p=160'>Clomid online cod</a>. <a href='http://www.battlemouth.com/?p=11640'>Order Clomid online overnight delivery no prescription</a>. <a href='http://truesimple.com/?p=882'>Cheap Clomid</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2011/03/05/preliminary-gdc-slides-posted/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2009/10/20/square-roots-in-vivo-normalizing-vectors/</link>
		<comments>http://assemblyrequired.crashworks.org/2009/10/20/square-roots-in-vivo-normalizing-vectors/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 15:55:59 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=329</guid>
		<description><![CDATA[Following my earlier article on timing various square-root functions on the x86 Clomid For Sale, , commenter LeeN suggested that it would be useful to also test their impact on a more realistic scenario than square-rooting long arrays of independent numbers. In real gameplay code the most common use for sqrts is in finding the [...]]]></description>
			<content:encoded><![CDATA[<p> Following <a href="http://assemblyrequired.crashworks.org/2009/10/16/timing-square-root/">my earlier article on timing various square-root functions on the x86</a> <b>Clomid For Sale</b>, , commenter LeeN suggested that it would be useful to also test their impact on a more realistic scenario than square-rooting long arrays of independent numbers. In real gameplay code the most common use for sqrts is in finding the length of a vector or normalizing it, like when you need to perform a distance check between two characters to determine whether they can see/shoot/etc each other. So, I wrote up a group of normalize functions, each using a different sqrt technique, <b>Cheap Clomid no rx</b>, and timed them.</p>
<p>The testbed was, as last time, an array of 2048 single-precision floating point numbers, this time interpreted as a packed list of 682 three-dimensional vectors. This number was chosen so that both it and the output array were sure to fit in the L1 cache; however, because three floats add up to twelve bytes, <b>is Clomid addictive</b>, this means that three out of four vectors <b>were not aligned</b> to a 16-byte boundary, which is significant for the SIMD test case as I had to use the <code>movups</code> unaligned load op. Each timing case consisted of looping over this array of vectors 2048 times, normalizing each and writing the result to memory, <b>Clomid For Sale</b>.</p>
<p>Each normalize function computed the length of the vector 1/&radic;(x<sup>2</sup> + y<sup>2</sup> + z<sup>2</sup>), multiplied each component by the reciprocal,  and then wrote it back through an output pointer.  <b>Get Clomid</b>, The main difference was in how the reciprocal square root was computed:<br />
<ul><br />
	<li>via the x87 FPU, by simply compiling <code>1.0f/sqrt( x*x + y*y + z*z )</code></li><br />
	<li>via the SSE scalar unit, by compiling <code>1.0f/sqrt( x*x + y*y + z*z )</code> with the <a href="http://msdn.microsoft.com/en-us/library/7t5yh4fd(VS.80).aspx">/arch:SSE2</a> option set; this causes the compiler to issue a <code>sqrtss</code> followed by an <code>fdiv</code> &mdash; <i>ie</i>, it computes the square root and then divides one by it<br />
	<li>via the SSE scalar unit, by using the estimated reciprocal square root intrinsic and then performing one step of Newton-Raphson iteration</li><br />
	<li>via the SSE SIMD unit,  working on the whole vector at once</li><br />
</ul></p>
<p>In all cases the results were accurate to 22 bits of precision. The results for 1, <b>doses Clomid work</b>,396,736 vector normalizations were:</p>
<p><div align="center" ><br />
<table border class="padded"><br />
<tr><br />
 <th>Method</th><th>Total time</th><th>Time per vector</th><br />
</tr><br />
<tr><br />
 <td>Compiler <code>1.0/sqrt(x)</code> <br />x87 FPU <code>FSQRT</code></td><br />
 <td>52.469ms</td><td>37.6ns</td><br />
</tr><br />
<tr><br />
 <td>Compiler <code>1.0/sqrt(x)</code> <br />SSE scalar <code>sqrtss</code></td><br />
 <td>27.233ms</td><td>19.5ns</td><br />
</tr><br />
<tr><br />
 <td>SSE <b>scalar</b> ops<br /><code>rsqrtss</code> with one NR step</td><br />
 <td>21.631ms</td><td>15.5ns</td><br />
</tr><br />
<tr><br />
 <td>SSE SIMD ops <br /><code>rsqrtss</code> with one NR step</td><br />
 <td>20.034ms</td><td>14.3ns</td><br />
</tr><br />
</table><br />
</div></p>
<p>Two things jump out here. First, even when the square root op is surrounded by lots of other math &mdash; multiplies, adds, <b>Clomid use</b>, loads, stores &mdash; optimizations such as this can make a huge difference.  <b>Clomid For Sale</b>, It's not just the cost of the sqrt itself, but also that it's unpipelined, which means it ties up an execution unit and prevents any other work from being done until it's entirely completed.</p>
<p>Second, in this case, SIMD is only a very modest benefit. That's because the input vectors are unaligned, and the two key steps of this operation, <b>online buying Clomid</b>, the dot product and the square root, are scalar in nature. (This is what's meant by "horizontal" SIMD computation &mdash; operations between the components of one vector, rather than between the corresponding words of two vectors. Given a vector V &ni; &lt;x, <b>Comprar en línea Clomid, comprar Clomid baratos</b>, y,z&gt;, the sum x + y + z is <i>horizontal</i>, but with two vectors V<sub>1</sub> and V<sub>2</sub>, V<sub>3</sub> = &lt;x<sub>1</sub>+x<sub>2</sub>, y<sub>1</sub>+y<sub>2</sub>, z<sub>1</sub>+z<sub>2</sub>&gt; is <i>vertical</i>.) So it really doesn't play to SIMD's strengths at all, <b>Clomid price</b>.</p>
<p>On the other hand, if I were to normalize four vectors at a time, so that four dot products and four rsqrts could be performed in parallel in the four words of a vector register, then the speed advantage of SIMD would be much greater, <b>Clomid For Sale</b>. But, again, my goal wasn't to test performance in tight loops over packed data &mdash; it was to figure out the best way to do something like an angle check in the middle of a character's AI, where you usually deal with one vector at a time.</p>
<p>Source code for my testing functions below the jump.  <b>Order Clomid from United States pharmacy</b>, Note that each function writes the normalized vector through an out pointer, but also returns the original vector's length. The hand-written intrinsic versions probably aren't totally optimal, but they ought to be good enough to make the point.</p>
<p></p>
<p></p>
<p>[DDET Naive vector normalize, x87 FPU or SSE scalar]<br />
<u>Source</u><br />
<pre lang="CPP">// Normalizes an assumed 3-element vector starting<br />
// at pointer V, and returns the length of the original<br />
// vector, <b>Clomid used for</b>.<br />
inline float NaiveTestNormalize( float * RESTRICT vOut, const float * RESTRICT vIn )<br />
{<br />
        const float l = vIn[0]*vIn[0] + vIn[1]*vIn[1] + vIn[2]*vIn[2];<br />
        const float rsqt = 1.0f / sqrt(l);<br />
        vOut[0] = vIn[0] * rsqt;<br />
        vOut[1] = vIn[1] * rsqt;<br />
        vOut[2] = vIn[2] * rsqt;<br />
        return rsqt * l;<br />
}</pre></p>
<p><u>Assembly (x87 FPU)</u><br />
<pre lang="asm"><br />
_TEXT   SEGMENT<br />
_vOut$ = 8                                              ; size = 4<br />
_vIn$ = 12                                              ; size = 4<br />
?TestNormalize@@YAMPIAMPIBM@Z PROC                      ; TestNormalize, COMDAT</p>
<p>; 396  :        const float l = vIn[0]*vIn[0] + vIn[1]*vIn[1] + vIn[2]*vIn[2];</p>
<p>        mov     eax, DWORD PTR _vIn$[esp-4]<br />
        fld     DWORD PTR [eax+8]</p>
<p>; 397  :        const float rsqt = 1.0f / sqrt(l);<br />
; 398  :        vOut[0] = vIn[0] * rsqt;</p>
<p>        mov     ecx, DWORD PTR _vOut$[esp-4]<br />
        fld     DWORD PTR [eax+4]<br />
        fld     DWORD PTR [eax]<br />
        fmul    ST(0), <b>Order Clomid online overnight delivery no prescription</b>, ST(0)<br />
        fld     ST(1)<br />
        fmulp   ST(2), ST(0)<br />
        faddp   ST(1), ST(0)<br />
        fld     ST(1)<br />
        fmulp   ST(2), ST(0)<br />
        faddp   ST(1), ST(0)<br />
        fld     ST(0)<br />
        fsqrt<br />
        fld1<br />
        fdivrp  ST(1), ST(0)<br />
        fld     DWORD PTR [eax]<br />
        fmul    ST(0), ST(1)<br />
        fstp    DWORD PTR [ecx]</p>
<p>; 399  :        vOut[1] = vIn[1] * rsqt;</p>
<p>        fld     ST(0)<br />
        fmul    DWORD PTR [eax+4]<br />
        fstp    DWORD PTR [ecx+4]</p>
<p>; 400  :        vOut[2] = vIn[2] * rsqt;</p>
<p>        fld     ST(0)<br />
        fmul    DWORD PTR [eax+8]<br />
        fstp    DWORD PTR [ecx+8]</p>
<p>; 401  :        return rsqt * l;</p>
<p>        fmulp   ST(1), <b>Clomid mg</b>, ST(0)</p>
<p>; 402  : }</p>
<p>        ret     0<br />
?TestNormalize@@YAMPIAMPIBM@Z ENDP                      ; TestNormalize<br />
_TEXT   ENDS<br />
</pre></p>
<p><u>Assembly (compiler-issued SSE scalar)</u><br />
<pre lang="asm"><br />
_TEXT   SEGMENT<br />
_l$ = -4                                                ; size = 4<br />
_vOut$ = 8                                              ; size = 4<br />
_rsqt$ = 12                                             ; size = 4<br />
_vIn$ = 12                                              ; size = 4<br />
?TestNormalize@@YAMPIAMPIBM@Z PROC                      ; TestNormalize, COMDAT</p>
<p>; 392  : {</p>
<p>        push    ecx</p>
<p>; 393  :        const float l = vIn[0]*vIn[0] + vIn[1]*vIn[1] + vIn[2]*vIn[2];</p>
<p>        mov     eax, DWORD PTR _vIn$[esp]<br />
        movss   xmm1, DWORD PTR [eax+4]<br />
        movss   xmm2, DWORD PTR [eax]<br />
        movss   xmm0, <b>Buying Clomid online over the counter</b>, DWORD PTR [eax+8]</p>
<p>; 394  :        const float rsqt = 1.0f / sqrt(l);<br />
; 395  :        vOut[0] = vIn[0] * rsqt;</p>
<p>        mov     eax, DWORD PTR _vOut$[esp]<br />
        movaps  xmm3, xmm2<br />
        mulss   xmm3, xmm2<br />
        movaps  xmm4, xmm1<br />
        mulss   xmm4, xmm1<br />
        addss   xmm3, xmm4<br />
        movaps  xmm4, <b>low dose Clomid</b>, xmm0<br />
        mulss   xmm4, xmm0<br />
        addss   xmm3, xmm4<br />
        movss   DWORD PTR _l$[esp+4], xmm3<br />
        sqrtss  xmm4, xmm3   ;; slow full-precision square root gets stored in xmm4<br />
        movss   xmm3, <b>Purchase Clomid online no prescription</b>, DWORD PTR __real@3f800000  ;; store 1.0 in xmm3<br />
        divss   xmm3, xmm4  ;; divide 1.0 / xmm4 to get the reciprocal square root !?.<br />
        movss   DWORD PTR _rsqt$[esp], xmm3</p>
<p>; 396  :        vOut[1] = vIn[1] * rsqt;<br />
; 397  :        vOut[2] = vIn[2] * rsqt;<br />
; 398  :        return rsqt * l;</p>
<p>        fld     DWORD PTR _rsqt$[esp]<br />
        mulss   xmm2, xmm3<br />
        fmul    DWORD PTR _l$[esp+4]<br />
        mulss   xmm1, xmm3<br />
        mulss   xmm0, xmm3<br />
        movss   DWORD PTR [eax], <b>where can i order Clomid without prescription</b>, xmm2<br />
        movss   DWORD PTR [eax+4], xmm1<br />
        movss   DWORD PTR [eax+8], xmm0</p>
<p>; 399  : }</p>
<p>        pop     ecx<br />
        ret     0<br />
?TestNormalize@@YAMPIAMPIBM@Z ENDP                      ; TestNormalize<br />
_TEXT   ENDS<br />
</pre><br />
[/DDET]</p>
<p>[DDET Vector normalize, hand-written SSE scalar by intrinsics]<br />
<u>Source</u><br />
<pre lang="cpp"><br />
// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration<br />
inline __m128 SSERSqrtNR( const __m128 x )<br />
{<br />
	__m128 recip = _mm_rsqrt_ss( x );  // "estimate" opcode<br />
	const static __m128 three = { 3, <b>Generic Clomid</b>, 3, 3, 3 }; // aligned consts for fast load<br />
	const static __m128 half = { 0.5,0.5,0.5,0.5 };<br />
	__m128 halfrecip = _mm_mul_ss( half, recip );<br />
	__m128 threeminus_xrr = _mm_sub_ss( three, <b>Clomid samples</b>, _mm_mul_ss( x, _mm_mul_ss ( recip, recip ) ) );<br />
	return _mm_mul_ss( halfrecip, threeminus_xrr );<br />
}</p>
<p></p>
<p>inline __m128 SSE_ScalarTestNormalizeFast(  float * RESTRICT vOut, float * RESTRICT vIn )<br />
{<br />
        __m128 x = _mm_load_ss(&vIn[0]);<br />
        __m128 y = _mm_load_ss(&vIn[1]);<br />
        __m128 z = _mm_load_ss(&vIn[2]);</p>
<p>        const __m128 l =  // compute x*x + y*y + z*z<br />
                _mm_add_ss(<br />
                 _mm_add_ss( _mm_mul_ss(x, <b>Clomid online cod</b>, x),<br />
                             _mm_mul_ss(y,y)<br />
                            ),<br />
                 _mm_mul_ss( z, z )<br />
                );</p>
<p></p>
<p>        const __m128 rsqt = SSERSqrtNR( l );<br />
        _mm_store_ss( &vOut[0] , _mm_mul_ss( rsqt, x ) );<br />
        _mm_store_ss( &vOut[1], <b>Clomid no rx</b>, _mm_mul_ss( rsqt, y ) );<br />
        _mm_store_ss( &vOut[2] , _mm_mul_ss( rsqt, z ) );</p>
<p>        return _mm_mul_ss( l , rsqt );<br />
}<br />
</pre></p>
<p><u>Assembly</u><br />
<pre lang="asm"><br />
_TEXT   SEGMENT<br />
_vOut$ = 8                                              ; size = 4<br />
_vIn$ = 12                                              ; size = 4<br />
?SSE_ScalarTestNormalizeFast@@YA?AT__m128@@PIAM0@Z PROC ; SSE_ScalarTestNormalizeFast, <b>Clomid over the counter</b>, COMDAT</p>
<p>    push    ebp<br />
    mov     ebp, esp<br />
    and     esp, -16                                ; fffffff0H</p>
<p>    mov     eax, DWORD PTR _vIn$[ebp]<br />
    movss   xmm0, DWORD PTR [eax]</p>
<p>    movss   xmm3, DWORD PTR [eax+4]</p>
<p>    movaps  xmm7, XMMWORD PTR ?three@?1??SSERSqrtNR@@YA?AT__m128@@T2@@Z@4T2@B<br />
    movaps  xmm2, <b>ordering Clomid online</b>, xmm0<br />
    movss   xmm0, DWORD PTR [eax+8]</p>
<p>    mov     eax, DWORD PTR _vOut$[ebp]<br />
    movaps  xmm4, xmm0<br />
    movaps  xmm0, xmm2<br />
    mulss   xmm0, <b>Australia, uk, us, usa</b>, xmm2<br />
    movaps  xmm1, xmm3<br />
    mulss   xmm1, xmm3<br />
    addss   xmm0, xmm1<br />
    movaps  xmm1, xmm4<br />
    mulss   xmm1, xmm4<br />
    addss   xmm0, xmm1<br />
    movaps  xmm1, <b>Clomid dosage</b>, xmm0<br />
    rsqrtss xmm1, xmm1<br />
    movaps  xmm5, xmm1<br />
    mulss   xmm1, xmm5<br />
    movaps  xmm6, xmm0<br />
    mulss   xmm6, <b>Buy Clomid from mexico</b>, xmm1<br />
    movaps  xmm1, XMMWORD PTR ?half@?1??SSERSqrtNR@@YA?AT__m128@@T2@@Z@4T2@B<br />
    mulss   xmm1, xmm5<br />
    subss   xmm7, xmm6<br />
    mulss   xmm1, xmm7<br />
    movaps  xmm5, xmm1<br />
    mulss   xmm5, xmm2<br />
    movss   XMMWORD PTR [eax], <b>Clomid cost</b>, xmm5<br />
    movaps  xmm2, xmm1<br />
    mulss   xmm2, xmm3</p>
<p>    movss   XMMWORD PTR [eax+4], xmm2<br />
    movaps  xmm2, xmm1<br />
    mulss   xmm2, <b>Clomid forum</b>, xmm4</p>
<p>    movss   XMMWORD PTR [eax+8], xmm2</p>
<p>    mulss   xmm0, xmm1</p>
<p>    mov     esp, ebp<br />
    pop     ebp<br />
    ret     0<br />
?SSE_ScalarTestNormalizeFast@@YA?AT__m128@@PIAM0@Z ENDP ; SSE_ScalarTestNormalizeFast<br />
_TEXT   ENDS<br />
</pre><br />
[/DDET]</p>
<p></p>
<p>[DDET Vector normalize, hand-written SSE SIMD by intrinsics]<br />
<u>Source</u><br />
<pre lang="cpp"><br />
inline __m128 SSE_SIMDTestNormalizeFast( float * RESTRICT vOut, float * RESTRICT vIn  )<br />
{<br />
        // load as a SIMD vector<br />
        const __m128 vec = _mm_loadu_ps(vIn);<br />
        // compute a dot product by computing the square, and<br />
        // then rotating the vector and adding, <b>Clomid street price</b>, so that the<br />
        // dot ends up in the low term (used by the scalar ops)<br />
        __m128 dot = _mm_mul_ps( vec, vec );<br />
        // rotate x under y and add together<br />
        __m128 rotated = _mm_shuffle_ps( dot, dot, _MM_SHUFFLE( 0,3, <b>Clomid overnight</b>, 2,1 ) ); // YZWX ( shuffle macro is high to low word )<br />
        dot = _mm_add_ss( dot, rotated ); // x^2 + y^2 in the low word<br />
        rotated = _mm_shuffle_ps( rotated, rotated, _MM_SHUFFLE( 0,3,2, <b>purchase Clomid</b>,1 ) ); // ZWXY<br />
        dot = _mm_add_ss( dot, rotated ); // x^2 + y^2 + z^2 in the low word</p>
<p>        __m128 recipsqrt = SSERSqrtNR( dot ); // contains reciprocal square root in low term<br />
        recipsqrt = _mm_shuffle_ps( recipsqrt, recipsqrt, _MM_SHUFFLE( 0, 0, <b>Clomid wiki</b>, 0, 0 ) ); // broadcast low term to all words</p>
<p>        // multiply 1/sqrt(dotproduct) against all vector components, and write back<br />
        const __m128 normalized = _mm_mul_ps( vec, recipsqrt );<br />
        _mm_storeu_ps(vOut, normalized);<br />
        return _mm_mul_ss( dot , recipsqrt );<br />
}<br />
</pre></p>
<p><u>Assembly</u><br />
<pre lang="asm"><br />
_TEXT   SEGMENT<br />
_vOut$ = 8                                              ; size = 4<br />
_vIn$ = 12                                              ; size = 4<br />
?SSE_SIMDTestNormalizeFast@@YA?AT__m128@@PIAM0@Z PROC   ; SSE_SIMDTestNormalizeFast, COMDAT</p>
<p></p>
<p>    push    ebp<br />
    mov     ebp, <b>order Clomid from mexican pharmacy</b>, esp<br />
    and     esp, -16                                ; fffffff0H</p>
<p>    mov     eax, DWORD PTR _vIn$[ebp]<br />
    movups  xmm2, XMMWORD PTR [eax] ;; load the input vector<br />
    movaps  xmm5, XMMWORD PTR ?three@?1??SSERSqrtNR@@YA?AT__m128@@T2@@Z@4T2@B ;; load the constant "3"<br />
    mov     ecx, <b>Clomid pharmacy</b>, DWORD PTR _vOut$[ebp]<br />
    movaps  xmm0, xmm2<br />
    mulps   xmm0, xmm2<br />
    movaps  xmm1, xmm0<br />
    shufps  xmm1, xmm0, 57	; shuffle to YZWX<br />
    addss   xmm0, xmm1      ; add Y to low word of xmm0<br />
    shufps  xmm1, <b>buy Clomid online cod</b>, xmm1, 57	; shuffle to ZWXY<br />
    addss   xmm0, xmm1      ; add Z to low word of xmm0</p>
<p>    movaps  xmm1, xmm0<br />
    rsqrtss xmm1, xmm1      ; reciprocal square root estimate<br />
    movaps  xmm3, <b>Real brand Clomid online</b>, xmm1<br />
    mulss   xmm1, xmm3<br />
    movaps  xmm4, xmm0<br />
    mulss   xmm4, xmm1<br />
    movaps  xmm1, XMMWORD PTR ?half@?1??SSERSqrtNR@@YA?AT__m128@@T2@@Z@4T2@B<br />
    mulss   xmm1, xmm3<br />
    subss   xmm5, xmm4<br />
    mulss   xmm1, xmm5      ; Newton-Raphson finishes here; 1/sqrt(dot) is in xmm1's low word</p>
<p>    shufps  xmm1, xmm1, 0   ; broadcast so that xmm1 has 1/sqrt(dot) in all words<br />
    movaps  xmm3, xmm1<br />
    mulps   xmm3, xmm2      ; multiply all words of original vector by 1/sqrt(dot)<br />
    movups  XMMWORD PTR [ecx], xmm3   ; unaligned save to memory</p>
<p>	; return dot * 1 / sqrt(dot) == sqrt(dot) == length of vector<br />
    mulss   xmm0, xmm1</p>
<p>    mov     esp, ebp<br />
    pop     ebp<br />
    ret     0<br />
?SSE_SIMDTestNormalizeFast@@YA?AT__m128@@PIAM0@Z ENDP   ; SSE_SIMDTestNormalizeFast<br />
_TEXT   ENDS<br />
</pre><br />
[/DDET].</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=50'>Buy Spiriva Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=25'>Celebrex For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=415'>Amoxicillin For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=21'>Lipitor recreational</a>. <a href='http://assemblyrequired.crashworks.org/?p=181'>Buy Flagyl from canada</a>. <a href='http://assemblyrequired.crashworks.org/?p=50'>Herbal Spiriva</a>.<br />
<b>Trackbacks from:</b> <a href='http://www.cosmik-debris.net/?p=3645'>Clomid For Sale</a>. <a href='http://www.3dgolfcourse.com/?p=391'>Clomid For Sale</a>. <a href='http://triathlontrainingseries.com/?p=1107'>Clomid For Sale</a>. <a href='http://www.phtaipei.com/blog/?p=913'>Rx free Clomid</a>. <a href='http://newsletter.cuebc.ca/?p=210'>Buy cheap Clomid</a>. <a href='http://dearjanedialogues.com/?p=642'>Clomid cost</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2009/10/20/square-roots-in-vivo-normalizing-vectors/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2009/10/16/timing-square-root/</link>
		<comments>http://assemblyrequired.crashworks.org/2009/10/16/timing-square-root/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 17:05:14 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=234</guid>
		<description><![CDATA[Retin-A For Sale, The square root is one of those basic mathematical operations that's totally ubiquitous in any game's source code, and yet also has many competing implementations and performance superstitions around it. The compiler offers a sqrt() builtin function, and so do some CPUs, but some programmers insist on writing their own routines in [...]]]></description>
			<content:encoded><![CDATA[<p> <b>Retin-A For Sale</b>, The square root is one of those basic mathematical operations that's totally ubiquitous in any game's source code, and yet also has many competing implementations and performance superstitions around it. The compiler offers a sqrt() builtin function, and so do some CPUs, but some programmers insist on writing their own routines in software, <b>Retin-A from canadian pharmacy</b>. And often it's really the reciprocal square root you want, for normalizing a vector, <b>Retin-A reviews</b>, or trigonometry. But I've never had a clear answer for which technique is really fastest, or exactly what accuracy-vs-speed tradeoffs we make with "estimating" intrinsics.</p>
<p>What is the fastest way to compute a square root, <b>where can i find Retin-A online</b>. It would seem that if the CPU has <a href="http://www.sesp.cse.clrc.ac.uk/html/SoftwareTools/vtune/users_guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/mergedProjects/instructions/instruct32_hh/vc117.htm">a native square-root opcode</a>, there's no beating the hardware, but is it really true, <b>Retin-A For Sale</b>.</p>
<p>Such questions vex me, so I went and <em>measured</em> all the different means of computing the square root of a scalar single-precision floating point number that I could think of.  <b>After Retin-A</b>, I ran trials on my Intel Core 2 and on the Xenon, comparing each technique for both speed and accuracy, and some of the results were surprising.</p>
<p>In this article I'll describe my results for the Intel hardware; next week I'll turn to the Xenon PPC, <b>buy Retin-A no prescription</b>.</p>
<p><h2>Experimental setup</h2><br />
I'll post the whole source code for my tests elsewhere, but basically each of these trials consists of iterating N times over an array of floating point numbers, <b>Retin-A recreational</b>, calling square root upon each of them and writing it to a second output array.</p>
<p>[DDET (see pseudocode)]<br />
<pre lang="CPP" line="1"> <b>Retin-A For Sale</b>, inline float TestedFunction( float x )<br />
{<br />
   return sqrt(x); // one of many implementations..<br />
}<br />
void TimeSquareRoot()<br />
{<br />
   float numbersIn[ ARRAYSIZE ];    // ARRAYSIZE chosen so that both arrays<br />
   float numbersOut[ ARRAYSIZE ];  // fit in L1 cache<br />
   // assume that numbersIn is filled with random positive numbers, and both arrays are<br />
   // prefetched to cache...<br />
   StartClockCycleCounter();<br />
   for ( int i = 0 ; i < NUMITERATIONS ; ++i )<br />
      for ( int j = 0 ; j < ARRAYSIZE ; ++j ) // in some cases I unroll this loop<br />
      {<br />
         numbersOut[j] = TestedFunction( numbersIn[j] );<br />
      }<br />
   StopClockCycleCounter();<br />
   printf( "%.3f millisec for %d floats\n", <b>Retin-A steet value</b>,<br />
             ClockCycleCounterInMilliseconds(), ARRAYSIZE * NUMITERATIONS );</p>
<p>   // now measure accuracy<br />
   float error = 0;<br />
   for ( int i = 0 ; i < ARRAYSIZE ; ++i )<br />
   {<br />
       double knownAccurate = PerfectSquareRoot( numbersIn[i] );<br />
       error += fabs( numbersOut[i] - knownAccurate  ) / knownAccurate ;<br />
   }<br />
   error /= ARRAYSIZE ;<br />
   printf( "Average error: %.5f%%\n", <b>Retin-A class</b>, error * 100.0f );<br />
}<br />
</pre><br />
[/DDET]</p>
<p>In each case I verified that the compiler was not eliding any computations (it really was performing ARRAYSIZE &times; NUMITERATIONS many square roots), that it was properly inlining the tested function, and that all the arrays fit into L1 cache so that memory latency wasn't affecting the results. I also <strong>only tested <em>scalar</em> square root functions</strong> &mdash; SIMD would clearly be the fastest way of working on large contiguous arrays, <b>Retin-A brand name</b>, but I wanted to measure the different techniques of computing <b>one</b> square root at a time, as is usually necessary in gameplay code.  <b>Buy Retin-A without prescription</b>, Because some of the speedup techniques involve trading off accuracy, I compared the resulting numbers against the perfectly-accurate double-precision square root library routine to get an average error for each test run.</p>
<p>And I performed each run multiple times with different data, averaging the final results together, <b>Retin-A For Sale</b>.</p>
<p><h2>x86 results</h2></p>
<p>I ran my tests on a 2.66Ghz Intel Core 2 workstation. An x86 chip actually has two different means of performing scalar floating-point math, <b>buy no prescription Retin-A online</b>. By default, the compiler uses the old <a href="http://en.wikipedia.org/wiki/X87">x87 FPU</a>, <b>Buy generic Retin-A</b>, which dates back to 1980 with a stack-based instruction set like one of those old <a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation">RPN calculators</a>. In 1999, Intel introduced <a href="http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions">SSE</a>, which added a variety of new instructions to the processor, <b>Retin-A treatment</b>.  SSE is mostly thought of as a SIMD instruction set &mdash; for operating on four 32-bit floats in a single op &mdash;  but it also includes an entire set of <em>scalar</em> <b>Retin-A For Sale</b>, floating point instructions that operate on only one float at a time. It's faster than the x87 operations and was meant to deprecate the old x87 pathway. However, <b>Effects of Retin-A</b>, both the <a href="http://msdn.microsoft.com/en-us/library/7t5yh4fd(VS.80).aspx">MSVC</a> and <a href="http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/i386-and-x86_002d64-Options.html">GCC</a> compilers default to exclusively using the x87 for scalar math, so unless you edit the "code generation" project properties panel (MSVC) or provide <a href="http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/i386-and-x86_002d64-Options.html">a cryptic obscure command line option (GCC)</a>, you'll be stuck with code that uses the old slow way.</p>
<p>I timed the following techniques for square root:<br />
<ol><br />
<li>The compiler's built in <code>sqrt()</code> function (which compiled to the x87 FSQRT opcode)</li><br />
<li>T<a href="http://www.sesp.cse.clrc.ac.uk/html/SoftwareTools/vtune/users_guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/mergedProjects/instructions/instruct32_hh/vc300.htm">he SSE "scalar single square root" opcode <code>sqrtss</code></a>, <b>order Retin-A no prescription</b>, which <a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx">MSVC</a> emits if you use the <code>_mm_sqrt_ss</code> intrinsic or if you set <code>/arch:SSE2</code></li><br />
<li><a href="http://www.beyond3d.com/content/articles/8/">The "magic number" approximation technique</a> <a href="http://www.beyond3d.com/content/articles/15/">invented by Greg Walsh</a> at <a href="http://en.wikipedia.org/wiki/Ardent_Computer">Ardent Computer</a> and made famous by John Carmack in the Quake III source code.</li><br />
<li>Taking the estimated <em>reciprocal</em> square root of <i>a</i> via the SSE opcode <a href="http://www.sesp.cse.clrc.ac.uk/html/SoftwareTools/vtune/users_guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/mergedProjects/instructions/instruct32_hh/vc281.htm"><code>rsqrtss</code></a>, and multiplying it against <i>a</i> to get the square root via the identity x / &radic;<span style="text-decoration:overline">x</span> = &radic;<span style="text-decoration:overline">x</span>.</li><br />
<li>Method (4), <b>Retin-A without a prescription</b>, with one additional step of <a href="http://en.wikipedia.org/wiki/Newtons_method">Newton-Raphson iteration</a> to improve accuracy.</li><br />
<li>Method (5), with the loop at line 13 of the pseudocode above unrolled to process four floats per iteration.</li><br />
</ol><br />
I also tested three ways of getting the <em>reciprocal</em> square root: <a href="http://www.beyond3d.com/content/articles/8/">Carmack's technique</a>, the <code>rsqrtss</code> SSE op via compiler intrinsic, and <code>rsqrtss</code> with one Newton-Raphson step, <b>Retin-A pics</b>.</p>
<p>The results, for 4096 loops over 4096 single-precision floats, <b>Retin-A without prescription</b>, were:<br />
<div align="center" ><br />
<b><u>SQUARE ROOT</u></b><br />
<table border class="padded"><br />
<tr><br />
 <th>Method</th><th>Total time</th><th>Time per float</th><th>Avg Error</th><br />
</tr><br />
<tr><br />
 <td>Compiler <code>sqrt(x)</code> /<br />x87 FPU <code>FSQRT</code></td><br />
 <td>404.029ms</td><td>24ns</td><td>0.0000%</td><br />
</tr><br />
<tr><br />
 <td>SSE intrinsic <code>ssqrts</code></td><br />
 <td>200.395ms</td><td>11.9ns</td><td>0.0000%</td><br />
</tr><br />
<tr><br />
 <td>Carmack's Magic Number rsqrt * x</td><br />
 <td>72.682ms</td><td>4.33ns</td><td>0.0990%</td><br />
</tr><br />
<tr><br />
 <td>SSE <code>rsqrtss</code> * x</td><br />
 <td>20.495ms</td><td>1.22ns</td><td>0.0094%</td><br />
</tr><br />
<tr><br />
 <td>SSE <code>rsqrtss</code> * x<br />with one NR step</td><br />
 <td>53.401ms</td><td>3.18ns</td><td>0.0000%</td><br />
</tr><br />
<tr><br />
 <td>SSE <code>rsqrtss</code> * x<br />with one NR step, unrolled by four</td><br />
 <td>48.701ms</td><td>2.90ns</td><td>0.0000%</td><br />
</tr><br />
</table><br />
</div><br />
<br /><br />
<div align="center"><br />
<b><u>RECIPROCAL SQRT</u></b><br />
<table border class="padded"><br />
<tr><br />
 <th>Method</th><th>Total time</th><th>Time per float</th><th>Avg Error</th><br />
<tr><br />
 <td>Carmack's Magic Number rsqrt </td><br />
 <td>59.378ms</td><td>3.54ns</td><td>0.0990%</td><br />
</tr><br />
<tr><br />
 <td>SSE <code>rsqrtss</code></td><br />
 <td>14.202ms</td><td>0.85ns</td><td>0.0094%</td><br />
</tr><br />
<tr><br />
 <td>SSE <code>rsqrtss</code> <br />with one NR step</td><br />
 <td>45.952ms</td><td>2.74ns</td><td>0.0000%</td><br />
</tr><br />
<tr><br />
</table></div></p>
<p><h2>Discussion</h2></p>
<p>Looking at these results, it's clear that there's a dramatic difference in performance between different approaches to performing square root; which one you choose really can have a significant impact on framerate and accuracy. My conclusions are:</p>
<p><b>Don't trust the compiler to do the right thing.</b> The received wisdom on performance in math functions is usually "don't reinvent the wheel; the library and compiler are smart and optimal." We see here that <em>this is completely wrong</em>, and in fact calling the library <code>sqrt(x)</code> causes the compiler to do exactly the worst possible thing, <b>Retin-A For Sale</b>. The compiler's output for <code> y = sqrt(x); </code> is worse by orders of magnitude compared to any other approach tested here, <b>Retin-A alternatives</b>.</p>
<p><b>The x87 FPU is really very slow.</b>  Intel has been trying to deprecate the old x87 FPU instructions for a decade now, but no compiler in the business defaults to using the new, <b>Retin-A gel, ointment, cream, pill, spray, continuous-release, extended-release</b>, faster SSE scalar opcodes in place of emulating a thirty-year-old <a href="http://en.wikipedia.org/wiki/Intel_8087">8087</a>. In the case of  <code> y = sqrt(x) </code>, by default MSVC and GCC emit something like<br />
<pre lang="asm"><br />
fld DWORD PTR [ecx]<br />
fsqrt  ;; slow x87 flop<br />
fstp DWORD PTR [eax]<br />
</pre><br />
But if I set the <code>/arch:SSE2</code> option flag, telling the compiler "assume this code will run on a machine with SSE2", <b>Retin-A from canada</b>, it will instead emit the following, which is 2x faster.  <b>Retin-A dose</b>, <pre lang="asm"><br />
sqrtss xmm0, DWORD PTR [ecx]  ;; faster SSE scalar flop<br />
movss DWORD PTR [eax], xmm0<br />
</pre><br />
There was a time when not every PC on the market had SSE2, meaning that there was some sense in using the older, <b>Retin-A price, coupon</b>, more backwards-compatible operations, but that time has long since passed.  SSE2 was introduced <em>in 2001 with the Pentium 4</em> <b>Retin-A For Sale</b>, .  <b>Retin-A canada, mexico, india</b>, No one is ever going to try to play your game on a machine that doesn't support it. If your customer's PC has DirectX 9, it has SSE2.</p>
<p><b>You <em>can</em> beat the hardware.</b> The most surprising thing about these results for me was that it is faster to take a reciprocal square root and multiply it, <b>Retin-A no prescription</b>, than it is to use the native sqrt opcode, by an order of magnitude.  <b>Retin-A pictures</b>, Even Carmack's trick, which I had assumed was obsolete in an age of deep pipelines and load-hit-stores, proved faster than the native SSE scalar op. Part of this is that the reciprocal sqrt opcode <code>rsqrtss</code> is an estimate, accurate to twelve bits; but <a href="http://mathworld.wolfram.com/NewtonsMethod.html">it only takes one step</a> of Newton's Method to converge that estimate to an accuracy of 24 bits while still being four times faster than the hardware square root opcode, <b>Retin-A For Sale</b>.</p>
<p>The question that then bothered me was, <b>no prescription Retin-A online</b>, <em>why</em> is SSE's built-in-to-hardware square root opcode slower than synthesizing it out of two other math operations. The first hint came when I tried unrolling the loop so that it performed four ops inside the inner for():</p>
<p><pre lang="CPP"><br />
   for ( int i = 0 ; i < NUMITERATIONS ; ++i )<br />
      for ( int j = 0 ; j < ARRAYSIZE ; j += 4  ) // in some cases I unroll this loop<br />
      {<br />
         numbersOut[j + 0] = TestedSqrt( numbersIn[j + 0] );<br />
         numbersOut[j + 1] = TestedSqrt( numbersIn[j + 1] );<br />
         numbersOut[j + 2] = TestedSqrt( numbersIn[j + 2] );<br />
         numbersOut[j + 3] = TestedSqrt( numbersIn[j + 3] );<br />
      }</p>
<p>// two implementations of<br />
</pre></p>
<p>As you can see from the results above, <b>Retin-A maximum dosage</b>, when TestedSqrt was the <code>rsqrtss</code> followed by a multiply and one step of Newton iteration, unrolling the loop this way provided a modest 8.8% improvement in speed. But when I tried the same thing with the "precise square root" op <code>sqrtss</code>, the difference was negligible:<br />
<blockquote><pre><br />
SSE sqrt: 200.395 msec<br />
average error 0.0000%</p>
<p>SSE sqrt, <b>Retin-A from mexico</b>, unrolled four: 196.741 msec<br />
average error 0.0000%<br />
</pre></blockquote></p>
<p>What this suggests is that unrolling the loop this way allowed the four rsqrt paths to be <a href="http://en.wikipedia.org/wiki/Instruction_pipeline">pipelined</a>, so that while an individual <code>rsqrtss</code> might take 6 cycles to execute before its result was ready, <b>What is Retin-A</b>, other work could proceed during that time so that the four square root operations in the loop overlapped. On the other hand, the non-estimated <code>sqrtss</code> op apparently cannot be overlapped; one sqrt must finish before the next can begin.  A look at the <a href="http://www.intel.com/products/processor/manuals/">Intel® 64 and IA-32 Architectures Optimization Reference Manual</a> confirms: <code>sqrtss</code> <b>Retin-A For Sale</b>, is an unpipelined instruction.</p>
<p><b>Pipelined operations make a big difference.</b> When the CPU hits an unpipelined instruction, <b>Retin-A natural</b>, every other instruction in the pipeline has to stop and wait for it to retire before proceeding, so it's like putting the handbrake on your processor.  <b>Retin-A photos</b>, You can identify nonpipelined operations in appendix C of the Optimization Reference Manual as the ones that have a throughput equal to latency and greater than 4 cycles.<br />
<!--<br />
Unpipelined operations on the x86 tend to be those that do too much work to fit inside about six cycles. The FSIN opcode, for example, <b>about Retin-A</b>, has to compute a Taylor series, which takes many individual microoperations inside the CPU. When such an instruction is encountered, the CPU has to fetch a tiny subroutine from ROM and fully execute it before allowing any subsequent instructions to enter the pipeline, <b>Retin-A For Sale</b>.  <b>Retin-A interactions</b>, --><br />
In the case of <code>ssqrt</code>, the processor is probably doing the same thing internally that I'm doing in my "fast" function &mdash; taking an estimated reciprocal square root, improving it with Newton's method, and then multiplying it by the input parameter, <b>Retin-A long term</b>.  Taken all together, this is far too much work to fit into a single execution unit, so the processor stalls until it's all done. But if you break up the work so that each of those steps is its own instruction, then the CPU can pipeline them all, and get a much higher <em>throughput</em> even if the latency is the same.<br />
<!--<br />
It's like the difference between getting a separate washing machine and dryer so you can run two loads at once, versus one combination machine that has to wash and dry each load before starting the next one.  <b>Retin-A For Sale</b>, The total time to wash any one garment from start to finish is the same, but the total volume you can process in the space of three hours is different.<br />
--><br />
Pipeline latency and microcoded instructions are <em>a much bigger</em> deal on the 360 and PS3, whose CPUs don't reorder operations to hide bubbles; there the benefit from unrolling is much greater, as you'll see next week.</p>
<p><h2>Conclusion</h2></p>
<p>Not all square root functions are created equal, and writing your own can have very real performance benefits over trusting the compiler to optimize your code for you (at which it fails miserably). In many cases you can trade off some accuracy for a massive increase in speed, but even in those places where you need full accuracy, writing your own function to leverage the <code>rsqrtss</code> op followed by Newton's method can still give you 32 bits of precision at a 4x-8x improvement over what you will get with the built-in <code>sqrtf()</code> function.</p>
<p>And if you have <em>lots</em> of numbers you need to square root, of course SIMD (<code>rsqrtps</code>) will be faster still.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=20'>Buy Atenolol Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=504'>Buy Zithromax Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=22'>Buy Clonidine Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=400'>Order Zithromax online overnight delivery no prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=20'>My Atenolol experience</a>. <a href='http://assemblyrequired.crashworks.org/?p=124'>Low dose Temovate Cream</a>.<br />
<b>Trackbacks from:</b> <a href='http://leaderonomics.com/articles/?p=256'>Retin-A For Sale</a>. <a href='http://treehousegroup.org/blog/?p=1553'>Retin-A For Sale</a>. <a href='http://blog.jordanrounds.com/?p=27'>Retin-A For Sale</a>. <a href='http://www.matthiasgiraud.com/?p=178'>Order Retin-A online c.o.d</a>. <a href='http://www.chiang-mai-resort.net/?p=117'>Retin-A blogs</a>. <a href='http://www.morningbrewcast.com/blog/?p=125'>Discount Retin-A</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2009/10/16/timing-square-root/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2009/01/19/code-for-testing-virtual-function-speed/</link>
		<comments>http://assemblyrequired.crashworks.org/2009/01/19/code-for-testing-virtual-function-speed/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 05:26:30 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=213</guid>
		<description><![CDATA[I've just updated my prior article on virtual function overhead Buy Flagyl Without Prescription, with corrected timing numbers &#8212; I hadn't noticed that my CPU cycle counts were only 32 bits wide so timings of more than 2secs would wrap back around to zero. If you want to run this test on your own hardware, [...]]]></description>
			<content:encoded><![CDATA[<p> I've just updated my <a href="http://assemblyrequired.crashworks.org/2009/01/19/how-slow-are-virtual-functions-really/">prior article on virtual function overhead</a> <b>Buy Flagyl Without Prescription</b>, with corrected timing numbers &mdash; I hadn't noticed that my CPU cycle counts were only 32 bits wide so timings of more than 2secs would wrap back around to zero.</p>
<p>If you want to run this test on your own hardware, I've put my code below the jump. You'll have to build your own <code>CFastTimer</code> class, but it should be pretty clear what it does -- it simply reads out of the CPU clock-cycle counter and computes a difference.</p>
<p></p>
<p><h2>file 1: class definitions header</h2><br />
<pre lang="cpp"><br />
class TestVector4_Virtual<br />
{<br />
public:<br />
	virtual float GetX() const;<br />
	virtual float SetX( float in );<br />
	virtual float GetY() const;<br />
	virtual float SetY( float in );<br />
	virtual float GetZ() const;<br />
	virtual float SetZ( float in );<br />
	virtual float GetW() const;<br />
	virtual float SetW( float in );<br />
private:<br />
	float x,y,z,w;<br />
};</p>
<p>class TestVector4_Direct<br />
{<br />
public:<br />
	__declspec(noinline) float GetX() const;<br />
	__declspec(noinline) float SetX( float in );<br />
	__declspec(noinline) float GetY() const;<br />
	__declspec(noinline) float SetY( float in );<br />
	__declspec(noinline) float GetZ() const;<br />
	__declspec(noinline) float SetZ( float in );<br />
	__declspec(noinline) float GetW() const;<br />
	__declspec(noinline) float SetW( float in );<br />
private:<br />
	float x, <b>Online buy Flagyl without a prescription</b>, y,z,w;<br />
};</p>
<p>class TestVector4_Inline<br />
{<br />
public:<br />
	inline float GetX() const;<br />
	inline float SetX( float in );<br />
	inline float GetY() const;<br />
	inline float SetY( float in );<br />
	inline float GetZ() const;<br />
	inline float SetZ( float in );<br />
	inline float GetW() const;<br />
	inline float SetW( float in );<br />
private:<br />
	float x,y,z,w;<br />
};</p>
<p>inline float TestVector4_Inline::GetX() const<br />
{<br />
	return x;<br />
}<br />
inline float TestVector4_Inline::SetX( float in )<br />
{<br />
	return x = in;<br />
}</p>
<p>/* and so on for GetY, Z, W... */<br />
</pre></p>
<p><h2>file 2: class definitions cpp</h2><br />
These functions are defined here to prevent the compiler from inlining them when they're used.</p>
<p><pre lang="cpp"><br />
float TestVector4_Virtual::GetX() const<br />
{<br />
	return x;<br />
}<br />
float TestVector4_Virtual::SetX( float in )<br />
{<br />
	return x = in;<br />
}<br />
/* and so on for y,z,w.., <b>Buy Flagyl Without Prescription</b>. */</p>
<p>float TestVector4_Direct::GetX() const<br />
{<br />
	return x;<br />
}<br />
float TestVector4_Direct::SetX( float in )<br />
{<br />
	return x = in;<br />
}<br />
/* and so on for y, <b>Flagyl dangers</b>,z,w... */<br />
</pre><br />
<h2>file 3: test loop</h2></p>
<p><pre lang="cpp"><br />
#define ARRAY_SIZE 1024<br />
#define TEST_ITERATIONS 10000</p>
<p>template <class T><br />
void InitWithRandom( T *ptr, int num )<br />
{<br />
	while( num > 0 )<br />
	{<br />
		ptr->SetX( RandomFloat(-1024.f, 1024.0f) );<br />
		ptr->SetY( RandomFloat(-1024.f, 1024.0f) );<br />
		ptr->SetZ( RandomFloat(-1024.f, 1024.0f) );<br />
		ptr->SetW( RandomFloat(-1024.f, 1024.0f) );<br />
		++ptr;<br />
		--num;<br />
	}<br />
}</p>
<p>template <class T><br />
void SumTest( T * RESTRICT in1, <b>Flagyl coupon</b>, T * RESTRICT in2, T * RESTRICT out, const int num )<br />
{<br />
	for ( int i = 0; i < num ; ++i )<br />
	{<br />
		out[i].SetX( in1[i].GetX() + in2[i].GetX() );<br />
		out[i].SetY( in1[i].GetY() + in2[i].GetY() );<br />
		out[i].SetZ( in1[i].GetZ() + in2[i].GetZ() );<br />
		out[i].SetW( in1[i].GetW() + in2[i].GetW() );<br />
	}<br />
}</p>
<p>template <class T><br />
float TestTimings( )<br />
{<br />
	// set up input and output and preheat the cache<br />
	T A[ ARRAY_SIZE ];<br />
	T B[ ARRAY_SIZE ];<br />
	T C[ ARRAY_SIZE ];</p>
<p>	InitWithRandom( A , ARRAY_SIZE );<br />
	InitWithRandom( B , ARRAY_SIZE );<br />
	InitWithRandom( C , ARRAY_SIZE );</p>
<p>	uint64 retval = 0;<br />
	CFastTimer t1;<br />
	int dontOptimizeThisLoopToNothing = 0;<br />
	for ( int i = 0 ; i < N_ITERS ; ++i )<br />
	{<br />
		t1.Start();<br />
		SumTest( A, B, C, ARRAY_SIZE );<br />
		t1.End();<br />
		dontOptimizeThisLoopToNothing  += i;<br />
		retval += t1.GetClockCycleDelta();<br />
	}<br />
	// force compiler to actually use the data so it doesn't vanish the loop above<br />
	float ac = 0;<br />
	for ( int i = 0 ; i < ARRAY_SIZE ; ++i )<br />
	{<br />
		ac += C[i].GetX();<br />
		ac += C[i].GetY();<br />
		ac += C[i].GetZ();<br />
		ac += C[i].GetW();<br />
	}<br />
	printf( "%f %d\n", ac, <b>where can i buy cheapest Flagyl online</b>, dontOptimizeThisLoopToNothing  ); // just ignore these<br />
	return CyclesToMilliseconds(retval) ;<br />
}</p>
<p>void RunTest()<br />
{<br />
	// get timings for each type<br />
	float tVirt, tDirect, tInline;<br />
	tVirt = TestTimings< TestVector4_Virtual >();<br />
	tDirect = TestTimings< TestVector4_Direct >();<br />
	tInline = TestTimings< TestVector4_Inline >();</p>
<p>	printf( "\n%d iterations over %d vectors\n", TEST_ITERATIONS , ARRAY_SIZE );<br />
	printf( "virtual: %.3f ms\n", tVirt );<br />
	printf( "direct: %.3f ms\n", tDirect );<br />
	printf( "inline: %.3f ms\n", tInline );<br />
}<br />
</pre><br />
<h2>Assembly output</h2><br />
And, <b>Japan, craiglist, ebay, overseas, paypal</b>, just in case you're curious, here's the assembly the compiler generates for the different versions of <code>SumTest</code>:<br />
<h4>Direct Function</h4><br />
<pre lang="asm"><br />
; Begin code for function: ??$SumTest@VTestVector4_Direct@@@@YAXPIAVTestVector4_Direct@@00H@Z</p>
<p>; 58   : {</p>
<p>	mflr         r12<br />
	bl           __savegprlr_26<br />
	stfd         fr31,-40h(r1)<br />
	stwu         r1,-90h(r1)<br />
.endprolog<br />
$M89780:</p>
<p>; 59   : 	for ( int i = 0; i < num ; ++i )</p>
<p>	cmpwi        cr6,r6,0<br />
	ble          cr6,$LN1@SumTest@2<br />
	mr           r31,r4<br />
	subf         r27,r4,r3<br />
	subf         r26, <b>my Flagyl experience</b>,r4,r5<br />
	mr           r28,r6<br />
$LL3@SumTest@2:</p>
<p>; 60   : 	{<br />
; 61   : 		out[i].SetX( in1[i].GetX() + in2[i].GetX() );</p>
<p>	add          r30,r27,r31<br />
	add          r29,r26,r31<br />
	mr           r3,r30<br />
	bl           ?GetX@TestVector4_Direct@@QBAMXZ<br />
	mr           r3, <b>Fast shipping Flagyl</b>, r31<br />
	fmr          fr31,fr1<br />
	bl           ?GetX@TestVector4_Direct@@QBAMXZ<br />
	mr           r3,r29<br />
	fadds        fr1,fr31,fr1<br />
	bl           ?SetX@TestVector4_Direct@@QAAMM@Z</p>
<p>; 62   : 		out[i].SetY( in1[i].GetY() + in2[i].GetY() );</p>
<p>	mr           r3,r30<br />
	bl           ?GetY@TestVector4_Direct@@QBAMXZ<br />
	mr           r3,r31<br />
	fmr          fr31,fr1<br />
	bl           ?GetY@TestVector4_Direct@@QBAMXZ<br />
	mr           r3,r29<br />
	fadds        fr1,fr31, <b>where to buy Flagyl</b>,fr1<br />
	bl           ?SetY@TestVector4_Direct@@QAAMM@Z</p>
<p>; 63   : 		out[i].SetZ( in1[i].GetZ() + in2[i].GetZ() );</p>
<p>	mr           r3,r30<br />
	bl           ?GetZ@TestVector4_Direct@@QBAMXZ<br />
	mr           r3,r31<br />
	fmr          fr31,fr1<br />
	bl           ?GetZ@TestVector4_Direct@@QBAMXZ<br />
	mr           r3,r29<br />
	fadds        fr1,fr31,fr1<br />
	bl           ?SetZ@TestVector4_Direct@@QAAMM@Z</p>
<p>; 64   : 		out[i].SetW( in1[i].GetW() + in2[i].GetW() );</p>
<p>	mr           r3,r30<br />
	bl           ?GetW@TestVector4_Direct@@QBAMXZ<br />
	mr           r3, <b>Online buying Flagyl hcl</b>, r31<br />
	fmr          fr31,fr1<br />
	bl           ?GetW@TestVector4_Direct@@QBAMXZ<br />
	mr           r3,r29<br />
	fadds        fr1,fr31,fr1<br />
	bl           ?SetW@TestVector4_Direct@@QAAMM@Z<br />
	addic.       r28,r28,-1		; 0FFFFh<br />
	addi         r31,r31,16		; 10h<br />
	bne          $LL3@SumTest@2<br />
$LN1@SumTest@2:</p>
<p>; 65   : 	}<br />
; 66   : }</p>
<p>	addi         r1, <b>Flagyl over the counter</b>,r1,144		; 90h<br />
	lfd          fr31,-40h(r1)<br />
	b            __restgprlr_26<br />
$M89781:<br />
; End code for function: ??$SumTest@VTestVector4_Direct@@@@YAXPIAVTestVector4_Direct@@00H@Z<br />
</pre><br />
<h4>Virtual Function</h4><br />
<pre lang="asm"><br />
??$SumTest@VTestVector4_Virtual@@@@YAXPIAVTestVector4_Virtual@@00H@Z PROC NEAR ; SumTest<TestVector4_Virtual>, COMDAT</p>
<p>; Begin code for function: ??$SumTest@VTestVector4_Virtual@@@@YAXPIAVTestVector4_Virtual@@00H@Z</p>
<p>; 58   : {</p>
<p>	mflr         r12<br />
	bl           __savegprlr_25<br />
	stfd         fr31,-48h(r1)<br />
	stwu         r1,-0A0h(r1)<br />
.endprolog<br />
$M89754:</p>
<p>; 59   : 	for ( int i = 0; i < num ; ++i )</p>
<p>	cmpwi        cr6,r6,0<br />
	ble          cr6, <b>Fast shipping Flagyl</b>, $LN1@SumTest<br />
	mr           r31,r4<br />
	subf         r30,r4,r3<br />
	subf         r29,r4,r5<br />
	mr           r26,r6<br />
$LL3@SumTest:</p>
<p>; 60   : 	{<br />
; 61   : 		out[i].SetX( in1[i].GetX() + in2[i].GetX() );</p>
<p>	lwz          r11,0(r31)<br />
	add          r28,r29,r31<br />
	lwzx         r25, <b>what is Flagyl</b>,r29,r31<br />
	add          r27,r30,r31<br />
	mr           r3,r31<br />
	lwz          r10,0(r11)<br />
	mtctr        r10<br />
	bctrl<br />
	lwzx         r9,r30,r31<br />
	mr           r3, <b>Flagyl pharmacy</b>, r27<br />
	fmr          fr31,fr1<br />
	lwz          r8,0(r9)<br />
	mtctr        r8<br />
	bctrl<br />
	lwz          r7,4(r25)<br />
	mr           r3,r28<br />
	fadds        fr1,fr31,fr1<br />
	mtctr        r7<br />
	bctrl</p>
<p>; 62   : 		out[i].SetY( in1[i].GetY() + in2[i].GetY() );</p>
<p>	lwz          r6,0(r31)<br />
	mr           r3,r31<br />
	lwz          r5,8(r6)<br />
	lwzx         r25, <b>Flagyl description</b>,r29,r31<br />
	mtctr        r5<br />
	bctrl<br />
	lwzx         r4,r30,r31<br />
	mr           r3,r27<br />
	fmr          fr31,fr1<br />
	lwz          r11,8(r4)<br />
	mtctr        r11<br />
	bctrl<br />
	lwz          r10,0Ch(r25)<br />
	mr           r3, <b>Buy generic Flagyl</b>, r28<br />
	fadds        fr1,fr31,fr1<br />
	mtctr        r10<br />
	bctrl</p>
<p>; 63   : 		out[i].SetZ( in1[i].GetZ() + in2[i].GetZ() );</p>
<p>	lwz          r9,0(r31)<br />
	mr           r3,r31<br />
	lwz          r8,10h(r9)<br />
	lwzx         r25,r29,r31<br />
	mtctr        r8<br />
	bctrl<br />
	lwzx         r7,r30,r31<br />
	mr           r3, <b>buy Flagyl no prescription</b>,r27<br />
	fmr          fr31,fr1<br />
	lwz          r6,10h(r7)<br />
	mtctr        r6<br />
	bctrl<br />
	lwz          r5,14h(r25)<br />
	mr           r3,r28<br />
	fadds        fr1,fr31,fr1<br />
	mtctr        r5<br />
	bctrl</p>
<p>; 64   : 		out[i].SetW( in1[i].GetW() + in2[i].GetW() );</p>
<p>	lwz          r4,0(r31)<br />
	mr           r3, <b>Flagyl recreational</b>, r31<br />
	lwz          r11,18h(r4)<br />
	lwzx         r25,r29,r31<br />
	mtctr        r11<br />
	bctrl<br />
	lwzx         r10,r30,r31<br />
	fmr          fr31,fr1<br />
	mr           r3,r27<br />
	lwz          r9,18h(r10)<br />
	mtctr        r9<br />
	bctrl<br />
	lwz          r8,1Ch(r25)<br />
	fadds        fr1, <b>Flagyl reviews</b>,fr31,fr1<br />
	mr           r3,r28<br />
	mtctr        r8<br />
	bctrl<br />
	addic.       r26,r26,-1		; 0FFFFh<br />
	addi         r31,r31,20		; 14h<br />
	bne          $LL3@SumTest<br />
$LN1@SumTest:</p>
<p>; 65   : 	}<br />
; 66   : }</p>
<p>	addi         r1, <b>Flagyl used for</b>, r1,160		; 0A0h<br />
	lfd          fr31,-48h(r1)<br />
	b            __restgprlr_25<br />
$M89755:<br />
; End code for function: ??$SumTest@VTestVector4_Virtual@@@@YAXPIAVTestVector4_Virtual@@00H@Z<br />
</pre><br />
<h4>Inlined Function</h4> (notice the use of software pipelining to reduce <a href="http://en.wikipedia.org/wiki/Hazard_(computer_architecture)">hazards</a>)<br />
<pre lang="asm"><br />
; Begin code for function: ??$SumTest@VTestVector4_Inline@@@@YAXPIAVTestVector4_Inline@@00H@Z</p>
<p>; 58   : {</p>
<p>	mflr         r12<br />
	bl           __savegprlr_29<br />
	stfd         fr29,-38h(r1)<br />
	stfd         fr30,-30h(r1)<br />
	stfd         fr31,-28h(r1)<br />
.endprolog<br />
$M89879:</p>
<p>; 59   : 	for ( int i = 0; i < num ; ++i )</p>
<p>	li           r7,0<br />
	cmpwi        cr6,r6,4<br />
	blt          cr6,$LC33@SumTest@3<br />
	addi         r11, <b>Flagyl schedule</b>,r6,-4		; 0FFFCh<br />
	addi         r9,r3,16		; 10h<br />
	srwi         r11,r11,2<br />
	addi         r10,r5,8<br />
	addi         r8, <b>Is Flagyl safe</b>, r11,1<br />
	addi         r11,r4,4</p>
<p>; 64   : 		out[i].SetW( in1[i].GetW() + in2[i].GetW() );</p>
<p>	subf         r31,r4,r3<br />
	subf         r30,r4,r5<br />
	subf         r29,r5,r3<br />
	slwi         r7, <b>Flagyl no rx</b>,r8,2<br />
$LL34@SumTest@3:<br />
	lfs          fr0,-4(r11)<br />
	addic.       r8,r8,-1		; 0FFFFh<br />
	lfs          fr13,-10h(r9)<br />
	lfsx         fr12,r31, <b>Flagyl for sale</b>, r11<br />
	fadds        fr11,fr0,fr13<br />
	lfs          fr10,0(r11)<br />
	fadds        fr8,fr12,fr10<br />
	lfsx         fr9,r10,r29<br />
	lfs          fr7,4(r11)<br />
	lfs          fr6,8(r11)<br />
	fadds        fr5, <b>japan, craiglist, ebay, overseas, paypal</b>,fr9,fr7<br />
	lfs          fr4,-4(r9)<br />
	lfs          fr3,0Ch(r11)<br />
	fadds        fr2,fr6,fr4<br />
	lfs          fr1,0(r9)<br />
	lfs          fr0,10h(r11)<br />
	fadds        fr13, <b>Purchase Flagyl for sale</b>, fr3,fr1<br />
	lfs          fr12,4(r9)<br />
	lfs          fr10,14h(r11)<br />
	fadds        fr9,fr0,fr12<br />
	lfs          fr7,8(r9)<br />
	lfs          fr6,18h(r11)<br />
	fadds        fr4,fr10,fr7<br />
	lfs          fr3, <b>discount Flagyl</b>,0Ch(r9)<br />
	lfs          fr1,1Ch(r11)<br />
	fadds        fr0,fr6,fr3<br />
	lfs          fr12,10h(r9)<br />
	lfs          fr10,20h(r11)<br />
	fadds        fr7,fr1,fr12<br />
	lfs          fr6, <b>Flagyl dosage</b>, 14h(r9)<br />
	lfs          fr3,24h(r11)<br />
	fadds        fr1,fr10,fr6<br />
	lfs          fr12,18h(r9)<br />
	fadds        fr6,fr3,fr12<br />
	lfs          fr3,1Ch(r9)<br />
	lfs          fr10,28h(r11)<br />
	fadds        fr10,fr10, <b>no prescription Flagyl online</b>,fr3<br />
	lfs          fr3,20h(r9)<br />
	lfs          fr12,2Ch(r11)<br />
	fadds        fr12,fr12,fr3<br />
	lfs          fr31,30h(r11)<br />
	lfs          fr3,24h(r9)<br />
	fadds        fr3,fr31, <b>Where can i find Flagyl online</b>, fr3<br />
	lfs          fr30,34h(r11)<br />
	lfs          fr31,28h(r9)<br />
	fadds        fr31,fr30,fr31<br />
	lfs          fr29,38h(r11)<br />
	lfs          fr30,2Ch(r9)<br />
	addi         r9,r9,64		; 40h<br />
	fadds        fr30,fr29, <b>order Flagyl online c.o.d</b>,fr30<br />
	stfs         fr11,-8(r10)<br />
	stfsx        fr8,r30,r11<br />
	addi         r11,r11,64		; 40h<br />
	stfs         fr5,0(r10)<br />
	stfs         fr2,4(r10)<br />
	stfs         fr13, <b>Where can i cheapest Flagyl online</b>, 8(r10)<br />
	stfs         fr9,0Ch(r10)<br />
	stfs         fr4,10h(r10)<br />
	stfs         fr0,14h(r10)<br />
	stfs         fr7,18h(r10)<br />
	stfs         fr1,1Ch(r10)<br />
	stfs         fr6,20h(r10)<br />
	stfs         fr10,24h(r10)<br />
	stfs         fr12,28h(r10)<br />
	stfs         fr3,2Ch(r10)<br />
	stfs         fr31, <b>online buying Flagyl</b>,30h(r10)<br />
	stfs         fr30,34h(r10)<br />
	addi         r10,r10,64		; 40h<br />
	bne          $LL34@SumTest@3<br />
$LC33@SumTest@3:</p>
<p>; 59   : 	for ( int i = 0; i < num ; ++i )</p>
<p>	cmpw         cr6,r7,r6<br />
	bge          cr6,$LN32@SumTest@3<br />
	slwi         r11,r7, <b>About Flagyl</b>, 4<br />
	subf         r31,r4,r3<br />
	add          r8,r11,r4<br />
	add          r10,r11,r5<br />
	add          r9,r11,r3<br />
	addi         r11,r8, <b>buy cheap Flagyl</b>,4<br />
	subf         r4,r4,r5<br />
	addi         r10,r10,8<br />
	subf         r5,r5,r3<br />
	subf         r8,r7, <b>Online buy Flagyl without a prescription</b>, r6<br />
$LC3@SumTest@3:</p>
<p>; 60   : 	{<br />
; 61   : 		out[i].SetX( in1[i].GetX() + in2[i].GetX() );</p>
<p>	lfs          fr0,-4(r11)<br />
	addic.       r8,r8,-1		; 0FFFFh<br />
	lfs          fr13,0(r9)</p>
<p>; 62   : 		out[i].SetY( in1[i].GetY() + in2[i].GetY() );</p>
<p>	lfsx         fr12,r31,r11<br />
	fadds        fr11,fr0,fr13<br />
	lfs          fr10,0(r11)</p>
<p>; 63   : 		out[i].SetZ( in1[i].GetZ() + in2[i].GetZ() );</p>
<p>	lfsx         fr9,r10,r5<br />
	fadds        fr8,fr12,fr10<br />
	lfs          fr7,4(r11)</p>
<p>; 64   : 		out[i].SetW( in1[i].GetW() + in2[i].GetW() );</p>
<p>	lfs          fr6,8(r11)<br />
	fadds        fr5,fr9,fr7<br />
	lfs          fr4,0Ch(r9)<br />
	addi         r9,r9,16		; 10h<br />
	fadds        fr3,fr6,fr4<br />
	stfs         fr11,-8(r10)<br />
	stfsx        fr8,r4,r11<br />
	addi         r11,r11,16		; 10h<br />
	stfs         fr5,0(r10)<br />
	stfs         fr3,4(r10)<br />
	addi         r10,r10,16		; 10h<br />
	bne          $LC3@SumTest@3<br />
$LN32@SumTest@3:</p>
<p>; 65   : 	}<br />
; 66   : }</p>
<p>	lfd          fr29,-38h(r1)<br />
	lfd          fr30,-30h(r1)<br />
	lfd          fr31,-28h(r1)<br />
	b            __restgprlr_29<br />
$M89880:<br />
; End code for function: ??$SumTest@VTestVector4_Inline@@@@YAXPIAVTestVector4_Inline@@00H@Z<br />
</pre><br />
.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=329'>Clomid For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=400'>Zithromax For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=18'>Tramadol For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=39'>After Synthroid</a>. <a href='http://assemblyrequired.crashworks.org/?p=18'>Tramadol over the counter</a>. <a href='http://assemblyrequired.crashworks.org/?p=504'>Purchase Zithromax</a>.<br />
<b>Trackbacks from:</b> <a href='http://www.onthemoneytrail.com/survival/?p=101'>Buy Flagyl Without Prescription</a>. <a href='http://www.onthemaptravel.com/?p=130'>Buy Flagyl Without Prescription</a>. <a href='http://jimmcpherson.net/home/?p=262'>Buy Flagyl Without Prescription</a>. <a href='http://spayandneutersyracuse.org/?p=47'>Online buying Flagyl</a>. <a href='http://laura-lee.org/?p=72'>Flagyl overnight</a>. <a href='http://mariaespinosa.com/blog/?p=66'>Australia, uk, us, usa</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2009/01/19/code-for-testing-virtual-function-speed/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2009/01/19/how-slow-are-virtual-functions-really/</link>
		<comments>http://assemblyrequired.crashworks.org/2009/01/19/how-slow-are-virtual-functions-really/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 17:30:41 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=181</guid>
		<description><![CDATA[Whenever I work with virtual functions I find myself wondering: how much is it costing me to perform all these vtable Flagyl For Sale, lookups and indirect calls. The usual truism is that computers are so fast now that it doesn't matter and that the idea of virtuals being a problem is just another myth, [...]]]></description>
			<content:encoded><![CDATA[<p> Whenever I work with <a href="http://www.parashift.com/c++-faq-lite/virtual-functions.html">virtual functions</a> I find myself wondering: how much is it costing me to perform all these <a href="http://en.wikipedia.org/wiki/Virtual_table">vtable</a> <b>Flagyl For Sale</b>, lookups and indirect calls. <a href="http://hbfs.wordpress.com/2008/12/30/the-true-cost-of-calls/">The usual truism is that computers are so fast now that it doesn't matter</a> and that the idea of virtuals being a problem is just another myth, <b>real brand Flagyl online</b>.  <b>Buying Flagyl online over the counter</b>, Our beloved Xenon CPU is in-order, however, <b>Flagyl interactions</b>, <b>Order Flagyl no prescription</b>, so I got curious whether that myth is truly busted for us, and as any Mythbuster can tell you, <b>Flagyl dangers</b>, <b>Generic Flagyl</b>, the only way to know is to build it and test.</p>
<p>I'll talk about the test results first and then try to explain them in a later article, <b>buy Flagyl from canada</b>.  <b>Purchase Flagyl online</b>, I built a simple 4-dimensional vector class with accessor functions for x,y, <b>is Flagyl addictive</b>, <b>Flagyl long term</b>, z, and w, <b>order Flagyl from United States pharmacy</b>. Then I set up three arrays (A, B, C) each containing 1024 of these classes (so everything fits into the L1 cache) and ran a loop that simply added them together one component at a time, <b>Flagyl For Sale</b>.  <b>Flagyl forum</b>, <pre lang="cpp">class Vector4Test {<br />
  float x,y, <b>Flagyl brand name</b>, <b>Flagyl steet value</b>, z,w;<br />
public:<br />
  float GetX() { return x; ]<br />
  float SetX( float x_ ) { return x=x_; }<br />
  // and so on<br />
}<br />
Vector4Test A[1024], <b>Flagyl price, coupon</b>, <b>Flagyl treatment</b>, B[1024], C[1024];</p>
<p>for (int n = 0 ; n = NUM_TESTS ; ++n)<br />
for (int i=0; i < 1024 ; ++i) {<br />
   C[i].SetX( A[i].GetX + () B[i].GetX();<br />
   // and so on for y, <b>rx free Flagyl</b>, <b>Where can i buy cheapest Flagyl online</b>, z, and w<br />
}</pre></p>
<p>By specifying whether the <code>Get</code> and <code>Set</code> functions are inline, <b>order Flagyl online overnight delivery no prescription</b>, <b>Herbal Flagyl</b>, direct, or virtual, <b>cheap Flagyl no rx</b>, <b>Flagyl photos</b>, it's easy to compare the overhead of one kind of function call versus another. Each run through the loop would make three function calls per component times four components times 1024 elements in the array for a total of 12, <b>buy cheap Flagyl no rx</b>, <b>Flagyl pictures</b>, 288 function calls. The inline function is essentially the control group since it measures just the cost of the memory accesses, <b>purchase Flagyl</b>, <b>Flagyl duration</b>, loop conditionals, and floating-point math without any function call overhead at all, <b>Flagyl online cod</b>.  <b>Flagyl coupon</b>, Here's the results:</p>
<p><div style="width: 40em; margin-left: auto; margin-right: auto; background-color: #FFFFE0; padding:0.5em; border:medium solid black"><b>NOTE:</b> The values below have been corrected from the first version of this post.  See <a href="http://assemblyrequired.crashworks.org/2009/01/19/how-slow-are-virtual-functions-really/?preview=true&preview_id=181&preview_nonce=568a554f6d#comment-74">this comment</a> for details.</div></p>
<p><center><table ><tr><th colspan="2" style="font-weight:bold; white-space: nowrap;">1000 iterations over 1024 vectors<br /> <b>Flagyl For Sale</b>, 12,288,000 function calls</th></tr><br />
<tr><td>virtual:</td><td>159.856 ms</td></tr><br />
<tr><td>direct:</td><td>67.962 ms</td></tr><br />
<tr><td>inline:</td><td>8.040 ms</td></tr><br />
</table><br />
&nbsp;<br /><br />
<table ><tr><th colspan="2" style="font-weight:bold; white-space: nowrap;">50000 iterations over 1024 vectors<br />614,400,000 function calls</th></tr><br />
<tr><td>virtual:</td><td>8080.708 ms</td></tr><br />
<tr><td>direct:</td><td>3406.297 ms</td></tr><br />
<tr><td>inline:</td><td>411.924 ms</td></tr><br />
</table></center></p>
<p>A couple of things are immediately obvious. First, <b>Flagyl from canadian pharmacy</b>, <b>Where can i order Flagyl without prescription</b>, <strong>virtual functions <em>are</em> slower than direct function calls</strong>. But by how much, <b>Flagyl alternatives</b>.  <b>After Flagyl</b>, In the upper trial, the virtual-function test took 91.894ms longer than the direct functions; divided by the 12.288&times;10<sup>6</sup> function calls, <b>Flagyl use</b>, <b>Flagyl gel, ointment, cream, pill, spray, continuous-release, extended-release</b>, that works out a differential overhead of about 7 <i>nano</i>seconds. So, <b>australia, uk, us, usa</b>, there is a definite cost there, but probably not something to worry about unless it's a function that gets called thousands of times per frame.</p>
<p>Later I'll get further into the causes of these disparities, why virtual functions are slower than direct calls, and when inlining is advantageous. In the meantime I can tell you for sure that the problem is <em>not</em> the cost of looking up the indirect function pointer from the vtable &mdash; that's only a single unproblematic load operation. Rather the issues lie in <a href="http://users.cs.fiu.edu/~downeyt/cop3402/prediction.html">branch prediction</a> and the way that marshalling parameters for the <a href="http://developer.apple.com/documentation/developertools/Conceptual/LowLevelABI/100-32-bit_PowerPC_Function_Calling_Conventions/32bitPowerPC.html#//apple_ref/doc/uid/TP40002438-SW20">calling convention</a> can get in the way of good instruction scheduling.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=448'>Buy Retin-A Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=19'>Buy Stromectol Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=92'>Accutane For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=25'>Buy Celebrex from mexico</a>. <a href='http://assemblyrequired.crashworks.org/?p=89'>Low dose Proscar</a>. <a href='http://assemblyrequired.crashworks.org/?p=22'>Herbal Clonidine</a>.<br />
<b>Trackbacks from:</b> <a href='http://www.davidkershenbaum.com/?p=21'>Flagyl For Sale</a>. <a href='http://www.ovient.com/english-blog/?p=121'>Flagyl For Sale</a>. <a href='http://cutiepie.mistyeiz.com/?p=2059'>Flagyl For Sale</a>. <a href='http://rhsheldon.com/?p=1359'>Flagyl cost</a>. <a href='http://www.3dgolfcourse.com/?p=269'>Buy Flagyl from mexico</a>. <a href='http://www.fractal.gr/?p=45'>Flagyl price, coupon</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2009/01/19/how-slow-are-virtual-functions-really/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Buy Cafergot Without Prescription</title>
		<link>http://assemblyrequired.crashworks.org/2009/01/13/sse2-fastest-rounding-on-x86/</link>
		<comments>http://assemblyrequired.crashworks.org/2009/01/13/sse2-fastest-rounding-on-x86/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 21:32:45 +0000</pubDate>
		<dc:creator>Elan</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://assemblyrequired.crashworks.org/?p=166</guid>
		<description><![CDATA[For best float-to-int conversion speed, specify the compiler flag /arch:SSE2 to assume the availability of SSE2 opcodes.]]></description>
			<content:encoded><![CDATA[<p> The feedback I got on <a href="http://assemblyrequired.crashworks.org/2009/01/12/why-you-should-never-cast-floats-to-ints/">yesterday's article on float-to-int conversion</a> <b>Buy Cafergot Without Prescription</b>, prompted me to look more closely into all the different options MSVC actually gives you for rounding on the x86 architecture.  <b>Effects of Cafergot</b>, It turns out that with <code><a href="http://msdn.microsoft.com/en-us/library/e7s85ffb(VS.80).aspx">/fp:fast</a></code> set it can do one of three things (in addition to the <a href="http://www.stereopsis.com/sree/fpu2006.html">magic-number rounding</a> you can write yourself):<br />
<ul><br />
	<li>By default it will call a function <code>_ftol2_sse</code>, which tests the CPU to see if it has <a href="http://softpixel.com/~cwright/programming/simd/sse2.php">SSE2</a> functionality, <b>get Cafergot</b>.  <b>Cafergot pics</b>, If so, it uses the native SSE2 instruction <tt>cvttsd2si</tt>, <b>Cafergot images</b>.  <b>Where to buy Cafergot</b>, If not, it calls _ftol(), <b>buy Cafergot online cod</b>.  <b>Cafergot natural</b>, This is quite slow because it has to perform that CPU test for every single conversion, and because there is that overhead of a function call.</li><br />
	<li>With <code><a href="http://msdn.microsoft.com/en-us/library/6d9xx1d2(VS.80).aspx">/QIfist</a></code> specified, <b>ordering Cafergot online</b>, <b>Buy Cafergot without prescription</b>, the compiler simply emits a <code>fistp</code> opcode to convert the x87 floating point register to an integer in memory directly.  It uses whatever rounding mode happens to be set in the CPU at the moment.</li><br />
	<li>With <code><a href="http://msdn.microsoft.com/en-us/library/7t5yh4fd(VS.80).aspx">/arch:SSE2</a></code> specified, the compiler assumes that the program will only run on CPUs with SSE2, so it emits the <tt>cvttsd2si</tt> opcode directly instead of calling <code>_ftol2_sse</code>, <b>Buy Cafergot Without Prescription</b>. Like /QIfist, <b>where can i buy Cafergot online</b>, <b>Cafergot without a prescription</b>, this replaces a function call with a single instruction, but it's even faster and not deprecated, <b>Cafergot class</b>.  <b>Doses Cafergot work</b>, As commenter <strong>cb</strong> points out, the intrinsics also let you specify truncation or rounding without having to fool around with CPU modes.</li><br />
</ul></p>
<p>I raced the different techniques against each other and the clear winner was the function compiled with <code>/arch:SSE2</code> set, <b>online Cafergot without a prescription</b>.  <b>Cheap Cafergot</b>, Thus, if you can assume that your customer will have a CPU with SSE2 enabled, <b>Cafergot without prescription</b>, <b>Cafergot wiki</b>, setting that simple compiler switch will provide you with superior performance for basically no work. The only caveat is that the SSE scalar operations operate at a maximum of double-precision floats, <b>buy Cafergot from mexico</b>, <b>Cafergot no prescription</b>, whereas the old x87 FPU instructions are internally 80-bit &mdash; but I've never seen a game application where that level of precision makes a difference.</p>
<p><a href="http://store.steampowered.com/hwsurvey/">According to the Steam Hardware Survey</a>, <b>Cafergot street price</b>, <b>Cafergot price</b>, 95% of our customers have SSE2-capable CPUs. The rest are probably not playing your most recent releases anyway, <b>order Cafergot from mexican pharmacy</b>.  <b>My Cafergot experience</b>, <center><table border><caption>Comparison of rounding speeds<br/>8 trials of 1.024*10<sup>8</sup> floats on a Core2</caption><br />
<tr><th>/fp:fast</th><th>magic number</th><th>/arch:sse2</th><th>/QIfist</th></tr><br />
<tr><td>312.944ms</td><td>184.534ms</td><td>96.978ms</td><td>178.732ms</td></tr><br />
<tr><td>314.255ms</td><td>182.105ms</td><td>91.390ms</td><td>178.363ms</td></tr><br />
<tr><td>311.359ms</td><td>181.397ms</td><td>89.606ms</td><td>182.709ms</td></tr><br />
<tr><td>309.149ms</td><td>181.023ms</td><td>87.732ms</td><td>180.485ms</td></tr><br />
<tr><td>309.828ms</td><td>181.405ms</td><td>91.891ms</td><td>184.785ms</td></tr><br />
<tr><td>309.595ms</td><td>176.970ms</td><td>86.886ms</td><td>178.501ms</td></tr><br />
<tr><td>309.081ms</td><td>179.109ms</td><td>86.885ms</td><td>177.811ms</td></tr><br />
<tr><td>308.208ms</td><td>176.873ms</td><td>86.796ms</td><td>178.051ms</td></tr><br />
</table></center><br />
.  Kjøpe Cafergot på nett, köpa Cafergot online.  Cafergot from mexico.  Cafergot cost.  Cafergot overnight.  Buy no prescription Cafergot online.  Cafergot maximum dosage.  Cafergot dose.  Cafergot canada, mexico, india.  Canada, mexico, india.  Purchase Cafergot online no prescription.  Cafergot blogs.  Buy Cafergot without a prescription.</p>
<p></p>
<p><b>Similar posts:</b> <a href='http://assemblyrequired.crashworks.org/?p=124'>Buy Temovate Cream Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=21'>Lipitor For Sale</a>. <a href='http://assemblyrequired.crashworks.org/?p=389'>Buy Amoxicillin Without Prescription</a>. <a href='http://assemblyrequired.crashworks.org/?p=415'>Ordering Amoxicillin online</a>. <a href='http://assemblyrequired.crashworks.org/?p=213'>Where can i buy cheapest Flagyl online</a>. <a href='http://assemblyrequired.crashworks.org/?p=448'>Retin-A samples</a>.<br />
<b>Trackbacks from:</b> <a href='http://truesimple.com/?p=29'>Buy Cafergot Without Prescription</a>. <a href='http://theshowroomap.com/blog/?p=185'>Buy Cafergot Without Prescription</a>. <a href='http://www.matthiasgiraud.com/?p=146'>Buy Cafergot Without Prescription</a>. <a href='http://triathlontrainingseries.com/?p=93'>Japan, craiglist, ebay, overseas, paypal</a>. <a href='http://www.cosmik-debris.net/?p=3598'>My Cafergot experience</a>. <a href='http://kimberlyjarman.net/?p=2118'>Kjøpe Cafergot på nett, köpa Cafergot online</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://assemblyrequired.crashworks.org/2009/01/13/sse2-fastest-rounding-on-x86/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

