

<?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>Rodrigo Kumpera Weblog &#187; mono simd programming performance</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/tag/mono-simd-programming-performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kumpera.net/blog</link>
	<description>Meus achados sobre tecnologia</description>
	<lastBuildDate>Thu, 10 Jun 2010 04:33:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lançado Mono 2.2 com estréia de Mono.Simd</title>
		<link>http://www.kumpera.net/blog/index.php/2009/01/14/lancado-mono-22-com-estreia-de-monosimd/</link>
		<comments>http://www.kumpera.net/blog/index.php/2009/01/14/lancado-mono-22-com-estreia-de-monosimd/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 01:36:43 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[mono simd programming performance]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/?p=125</guid>
		<description><![CDATA[Acabou de ser lançado versão 2.2 do Mono. Foram vários meses de trabalho e muito suor em corrigir centenas de bugs para podermos fazer nosso melhor release de todos os tempos. Dentro das novidades gostaria de destacar duas relativa ao time que participo. A primeira é o novo JIT baseado em uma representação intermediaria linear, [...]]]></description>
			<content:encoded><![CDATA[<p>Acabou de ser l<a href="http://www.mono-project.com/Release_Notes_Mono_2.2">ançado versão 2.2 do Mono</a>. Foram vários meses de trabalho e muito suor em corrigir centenas de bugs para podermos fazer nosso melhor release de todos os tempos. Dentro das novidades gostaria de destacar duas relativa ao time que participo. A primeira é o novo JIT baseado em uma representação intermediaria linear, os ganhos de performance podem chegar em até 50% e, também importante, o código do JIT ficou muito mais simples e extensível.  A segunda novidade, resultado da maior flexibilidade do mono, é a disponibilização preliminar da biblioteca Mono.Simd, que permite usar a unidade vetorial de processadores modernos.</p>
<p>A impossibilidade utilizar a unidade vetorial a partir de linguagens gerenciadas sempre foi uma das principais críticas dos desenvolvedores C e C++ sob a viabilidade em utilizá-las para código rico em calculo matemático. Isso agora é passado e usando mono e C# é possível gerar código com de alta performance similar ao possível com linguagens de baixo nível.</p>
<p>Para se ter uma ideia das possibilidades, um simples exemplo que transforma uma série de vetores com uma mesma matriz chega a ser 3x mais rápido usando Mono.Simd que o código não vetorial em C, Java ou C#. Isso sem perder as vantagens de se utilizar uma linguagem de alto nível e segura. Mas vamos ao código:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Primeiro transformação usando ponto flutuante normal</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Transform <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> Matrix matrix, <span style="color: #0600FF;">ref</span> Vector vector, <span style="color: #0600FF;">ref</span> Vector result<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        result.<span style="color: #0000FF;">x</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m00</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m01</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m02</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m03</span><span style="color: #008000;">;</span>
        result.<span style="color: #0000FF;">y</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m10</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m11</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m12</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m13</span><span style="color: #008000;">;</span>
        result.<span style="color: #0000FF;">z</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m20</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m21</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m22</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m23</span><span style="color: #008000;">;</span>
        result.<span style="color: #0000FF;">w</span> <span style="color: #008000;">=</span> vector.<span style="color: #0000FF;">x</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m30</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">y</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m31</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">z</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m32</span> <span style="color: #008000;">+</span> vector.<span style="color: #0000FF;">w</span> <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">m33</span><span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Agora usando Mono.Simd</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Transform <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> Matrix4f matrix, <span style="color: #0600FF;">ref</span> Vector4f vector, <span style="color: #0600FF;">ref</span> Vector4f result<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        Vector4f v <span style="color: #008000;">=</span> vector<span style="color: #008000;">;</span>
&nbsp;
        Vector4f r0 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromX</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromX</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromX</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromX</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        Vector4f r1 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromY</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromY</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromY</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromY</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        Vector4f r2 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromZ</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromZ</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromZ</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromZ</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        Vector4f r3 <span style="color: #008000;">=</span> v.<span style="color: #0000FF;">Shuffle</span> <span style="color: #000000;">&#40;</span>ShuffleSel.<span style="color: #0000FF;">XFromW</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">YFromW</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">ZFromW</span> <span style="color: #008000;">|</span> ShuffleSel.<span style="color: #0000FF;">WFromW</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        r0 <span style="color: #008000;">=</span> r0 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row0</span><span style="color: #008000;">;</span>
        r1 <span style="color: #008000;">=</span> r1 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row1</span><span style="color: #008000;">;</span>
        r2 <span style="color: #008000;">=</span> r2 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row2</span><span style="color: #008000;">;</span>
        r3 <span style="color: #008000;">=</span> r3 <span style="color: #008000;">*</span> matrix.<span style="color: #0000FF;">row3</span><span style="color: #008000;">;</span>
&nbsp;
        result <span style="color: #008000;">=</span> r0 <span style="color: #008000;">+</span> r1 <span style="color: #008000;">+</span> r2 <span style="color: #008000;">+</span> r3<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>O código usando Mono.Simd fica um pouco mais complexo, principalmente até se entender como Shuffle e outros combinadores funcionam. Porém quando executado, a versão tradicional precisa executar 16 operações de multiplicação e 12 de soma contra 4 multiplicações 3 somas simd na versão vetorizada. A diferença é clara e o números também.</p>
<p>O release 2.2 foi o resultado de muito esforço pelo time por traz do mono e todos seus contribuidores. Esse release, porém, é especial para mim pois Mono.Simd é resultado de alguns meses de trabalho meu e fiquei muito feliz com a repercussão positiva que recebemos &#8211; vários projetos estão estudando como implementar bibliotecas de matemática vetorial usando ela.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2009/01/14/lancado-mono-22-com-estreia-de-monosimd/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
