<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-578470634220317465</id><updated>2024-09-07T19:03:13.752-07:00</updated><category term="CUDA"/><category term="GPGPU"/><category term="nVidia"/><category term="unroll factor"/><category term="Estado del arte"/><category term="GPU"/><category term="bloques por malla"/><category term="hilos por bloque"/><category term="nivel de paralelización por instrucción"/><category term="state of the art"/><category term="AMD"/><category term="ATI Stream"/><category term="Arquitectura Kepler"/><category term="CPU"/><category term="Grids"/><category term="Kernel"/><category term="OPENCL"/><category term="SpeedUp"/><category term="factor de ocupación"/><category term="threads"/><category term="tipos de memoria"/><category term="Algoritmos paralelizados"/><category term="CUDA 5"/><category term="CURAND_RNG_SOBOL32"/><category term="CURAND_RNG_XORWOW"/><category term="Close to Metal"/><category term="Curand_init"/><category term="Device API"/><category term="Factor de desenrrollado"/><category term="GeForce"/><category term="GeForce GTX 660"/><category term="Hardware"/><category term="Host API"/><category term="IBM"/><category term="Intel"/><category term="Kernel call configuration"/><category term="Khronos group"/><category term="Paralelización en CPU vs Paralelización en GPG"/><category term="Parallel Neighbor-Sort"/><category term="Procesador gráfico"/><category term="Punto muerto computacional"/><category term="Reducción de vectores"/><category term="Rendimiento"/><category term="SM"/><category term="SP"/><category term="Thrust"/><category term="Warp"/><category term="blockDim"/><category term="blockIdx"/><category term="constant memory"/><category term="curand"/><category term="curand_normal"/><category term="curand_uniform"/><category term="global memory"/><category term="kernel concurrency"/><category term="llamada a Kernel"/><category term="local memory"/><category term="multi-GPU"/><category term="multiprocessor count"/><category term="odd-even sort"/><category term="random number generator"/><category term="reducción de ventores"/><category term="registers"/><category term="shared memory"/><category term="skipahead"/><category term="tasa de transferencia de memoria"/><category term="texture memory"/><category term="threadIdx"/><category term="threadIdx.x + blockIdx.x * blockDim.x"/><title type='text'>Desarrollo Cuda</title><subtitle type='html'>Paralelización del algotirmos con CUDA</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-3857929058966914413</id><published>2012-06-03T17:41:00.000-07:00</published><updated>2013-02-22T18:01:15.827-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="odd-even sort"/><category scheme="http://www.blogger.com/atom/ns#" term="Parallel Neighbor-Sort"/><title type='text'>Una ordenación matricial en GPU</title><content type='html'>Hola a todos,&lt;br /&gt;
&lt;br /&gt;
hoy quiero ilustraros un método de ordenación que implementé para la ordenación de vectores en GPU, la verdad es que primero lo ideé y como suele pasar en estas cosas luego busqué en internet y efectivamente el método ya existía y para mi sorpresa desde hace muchos años, en este caso aplicado a lás máquinas matriciales.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;mso-ansi-language: ES;&quot;&gt;La solución&amp;nbsp;de la que hablo está&amp;nbsp;basada en el método
de ordenación paralelo Parallel Neighbor-Sort propuesto por Nico Habermann(1), tambien conocido como &lt;a href=&quot;http://en.wikipedia.org/wiki/Odd%E2%80%93even_sort&quot; target=&quot;_blank&quot;&gt;odd-even sort&lt;/a&gt;, se diseño inicialmente para computación en arrays de procesadores a principios de los 70.&amp;nbsp;Se trata realizar
comparaciones de los elementos del vector dos a dos, siendo estos vecinos,
realizando paralelamente Elementos/2 comparaciones en cada ejecución del
kernel, las llamadas se intercalarán variando la paridad del elemento
comparado, repitiendo este proceso hasta que no se produzca ningún cambio, esto
determinará el final de la ordenación. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt; text-align: justify;&quot;&gt;
&lt;span style=&quot;mso-ansi-language: ES;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi86YKwOAbA3smKmiAFuotWH7zSPMOs8uWQ-4DamzZbzLExjJa_HNq5ht-KThg_ZBoB4Tr6SlqxmHkLNY_yhojHjmCDIeRiGyJjcSW96llrS-K6RX2gs3jWp_GdWkzDMIODf4GIM5ZX7Vs/s1600/ordenacion+matricial.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi86YKwOAbA3smKmiAFuotWH7zSPMOs8uWQ-4DamzZbzLExjJa_HNq5ht-KThg_ZBoB4Tr6SlqxmHkLNY_yhojHjmCDIeRiGyJjcSW96llrS-K6RX2gs3jWp_GdWkzDMIODf4GIM5ZX7Vs/s320/ordenacion+matricial.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Es un método sencillo pero muy eficaz en sistemas multiprocesador con capacidades de&amp;nbsp;paralelismo.&lt;br /&gt;
&lt;br /&gt;
A continuación os ilustro el kernel para la ordenación en CUDA, está ordenando&amp;nbsp;3 vectoresunas reglas especificas demás complejo del que ya&amp;nbsp;os hablaré, sirva ahora de ejemplo:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: rgb(251, 212, 180); border: 1pt solid windowtext; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-element: para-border-div; padding: 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;__global__ void ordenar_especies(int par,int
*cambios,int *contar, int M, int D,&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;
&lt;/span&gt;float *Puntos, int *Nivel, int *Orden, float *Valores) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;__shared__ int cuenta;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;int tid =
threadIdx.x + blockIdx.x * blockDim.x;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;int elem =
((3*M*3)+M)/2;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;float
puntoA, puntoB, aux = 0.0f;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;int ordenA, ordenB = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;int
nivelA, nivelB = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;int
cambiar_puntos = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (tid
== 0){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;cambios = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(contar[0] == 0){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;cuenta = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;tid = (tid*2)+par;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (tid &amp;lt;
elem) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;puntoA
=&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;tex1Dfetch(valoresTex,tid);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;puntoB
=&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;tex1Dfetch(valoresTex,tid+1);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ordenA
=&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;tex1Dfetch(ordenTex,tid);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ordenB
=&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;tex1Dfetch(ordenTex,tid+1);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;nivelA
=&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;tex1Dfetch(nivelTex,tid);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;nivelB
=&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;tex1Dfetch(nivelTex,tid+1);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;if (ordenB &amp;gt; 0) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;if (ordenA == 0) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;cambiar_puntos = 1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;} else {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;if (nivelB &amp;gt; nivelA){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cambiar_puntos = 1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;} else if ((nivelB == nivelA) &amp;amp;&amp;amp; (puntoB &amp;gt; puntoA)){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cambiar_puntos = 1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(cambiar_puntos == 1) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;for (int x=0;x&amp;lt;D;++x){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;aux = Puntos[tid+(x*elem)];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Puntos[tid+(x*elem)] = Puntos[tid+1+(x*elem)];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Puntos[tid+1+(x*elem)] = aux;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Valores[tid] = puntoB;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Valores[tid+1] = puntoA;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Orden[tid] = ordenB;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Orden[tid+1] = ordenA;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Nivel[tid] = nivelB;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Nivel[tid+1] = nivelA;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;cambios[0] = 1; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(contar[0] == 0){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
((ordenA == 0) &amp;amp;&amp;amp; (ordenB == 0)) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;__syncthreads();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;cuenta = cuenta + 2;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;else if ((ordenA
== 0) || (ordenB == 0)) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;__syncthreads();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;cuenta = cuenta + 1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (tid
== (elem-1)){&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//el ultimo que ponga la
cuenta de su bloque&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;if (contar[0] == 0){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;__syncthreads();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;contar[blockIdx.x] = elem-cuenta;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;background: rgb(251, 212, 180); border: currentColor; margin: 0cm 0cm 0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 1.0pt 1.0pt 1.0pt 1.0pt; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; mso-ansi-language: ES;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Hasta la próxima!!&lt;br /&gt;
____________________&lt;br /&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 10pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-US; mso-no-proof: yes;&quot;&gt;&lt;em&gt;(1)Parallel Neighbor-Sort (or the Glory of the Induction
Principle). &lt;/em&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 10pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-US; mso-no-proof: yes;&quot;&gt;5285
Port Royal Rd Sprigfield VA&amp;nbsp;: National Technical Information Service, US
Department of Commerce, 1972. AD0759248.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/3857929058966914413/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/06/una-ordenacion-matricial-en-gpu.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/3857929058966914413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/3857929058966914413'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/06/una-ordenacion-matricial-en-gpu.html' title='Una ordenación matricial en GPU'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi86YKwOAbA3smKmiAFuotWH7zSPMOs8uWQ-4DamzZbzLExjJa_HNq5ht-KThg_ZBoB4Tr6SlqxmHkLNY_yhojHjmCDIeRiGyJjcSW96llrS-K6RX2gs3jWp_GdWkzDMIODf4GIM5ZX7Vs/s72-c/ordenacion+matricial.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-433041573967614796</id><published>2012-05-12T16:35:00.000-07:00</published><updated>2013-02-22T16:36:24.290-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura Kepler"/><category scheme="http://www.blogger.com/atom/ns#" term="GeForce GTX 660"/><title type='text'>Bienvenido Mr. Kepler</title><content type='html'>En esta entrega compartiré con vosotros la nueva noticia: por fin tengo disponible en la plataforma del departamento un dispositivo con arquitectuta Kepler.&lt;br /&gt;
&lt;br /&gt;
Según informa nVidia: &lt;br /&gt;
&lt;div class=&quot;overviewColumnText&quot;&gt;
&lt;h3&gt;
&lt;a href=&quot;http://www.nvidia.es/object/geforce-gtx-660-es.html#pdpContent=1&quot; target=&quot;_blank&quot;&gt;Kepler es la arquitectura de GPU&lt;/a&gt; más avanzada de nuestra historia. Optimizada para DirectX 11, Kepler no es solo rápida, también es supereficiente.&amp;nbsp;&lt;/h3&gt;
&lt;br /&gt;
cSegún parece se Consigue 3 veces más velocidad de procesamiento con NVIDIA® Kepler, aseguran que es la arquitectura de alta computación (HPC) más rápida y eficiente del mundo. Está dotada de tecnología y funciones de computación avanzadas, puede utilizarse en una extensa variedad de aplicaciones de cálculo científico y pone los sistemas de computación híbridos al alcance de mayor número de programadores e investigadores.&lt;br /&gt;
&lt;br /&gt;
Sus principales novedades son:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;SMX&lt;/strong&gt;Proporciona mayor velocidad de procesamiento y eficiencia gracias a su innovador multiprocesador de streaming, que permite dedicar más espacio a los núcleos de procesamiento que a la lógica de control.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;columns_5&quot;&gt;
&lt;strong&gt;GPU dinámica con Kepler&lt;/strong&gt;&lt;br /&gt;
Simplifica la programación en la GPU ya que facilita la aceleración de bucles anidados paralelos, lo que significa que una GPU puede iniciar nuevos subprocesos de forma dinámica por sí misma, sin necesidad de volver a la CPU.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Hyper-Q de Kepler&lt;/strong&gt;Reduce el tiempo de inactividad de la CPU al permitir que múltiples núcleos de ésta utilicen una misma GPU Kepler, lo que mejora drásticamente la programabilidad y la eficiencia.&lt;br /&gt;
&lt;br /&gt;
Estas tres mejoras en la arqutectura prometen ser un salto cualitativo y cuantotativo en la aplicación de GPGPU.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7zhuisCJb9oquoPcSjpO08MB1tMXOHgcRzkLildmWkxmIe3Lbwb8H0GDeEzQ3ZsoiwG9CWg-rcJb5p1bk3ahdls9Gwy8Ouw7T_sAcispcZ2EEXixbLGL3GXX8zm2YV-aQojGBJAW1aHg/s1600/geforce-gtx-660-front.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;158&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7zhuisCJb9oquoPcSjpO08MB1tMXOHgcRzkLildmWkxmIe3Lbwb8H0GDeEzQ3ZsoiwG9CWg-rcJb5p1bk3ahdls9Gwy8Ouw7T_sAcispcZ2EEXixbLGL3GXX8zm2YV-aQojGBJAW1aHg/s320/geforce-gtx-660-front.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Yo por el momento cuento con una modesta &lt;a href=&quot;http://www.nvidia.es/object/geforce-gtx-660-es.html#pdpContent=1&quot; target=&quot;_blank&quot;&gt;GeForce GTX 660,&lt;/a&gt; las pruebas que he realizado en principio no me han dejado muy impresionado. Supongo que CUDA 5 permitirá exprimir a la perfección esta arquitectura.&lt;br /&gt;
&lt;br /&gt;
Ya os contaré como se comporta esta nueva arquitectura con CUAD 5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hasta entoces, feclices desarrollos!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/433041573967614796/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2013/02/bienvenido-mr-kepler.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/433041573967614796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/433041573967614796'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2013/02/bienvenido-mr-kepler.html' title='Bienvenido Mr. Kepler'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7zhuisCJb9oquoPcSjpO08MB1tMXOHgcRzkLildmWkxmIe3Lbwb8H0GDeEzQ3ZsoiwG9CWg-rcJb5p1bk3ahdls9Gwy8Ouw7T_sAcispcZ2EEXixbLGL3GXX8zm2YV-aQojGBJAW1aHg/s72-c/geforce-gtx-660-front.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-8957059062075762573</id><published>2012-05-04T13:45:00.000-07:00</published><updated>2012-06-13T13:10:34.823-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="curand"/><category scheme="http://www.blogger.com/atom/ns#" term="Curand_init"/><category scheme="http://www.blogger.com/atom/ns#" term="curand_normal"/><category scheme="http://www.blogger.com/atom/ns#" term="CURAND_RNG_SOBOL32"/><category scheme="http://www.blogger.com/atom/ns#" term="CURAND_RNG_XORWOW"/><category scheme="http://www.blogger.com/atom/ns#" term="curand_uniform"/><category scheme="http://www.blogger.com/atom/ns#" term="Device API"/><category scheme="http://www.blogger.com/atom/ns#" term="Host API"/><category scheme="http://www.blogger.com/atom/ns#" term="random number generator"/><category scheme="http://www.blogger.com/atom/ns#" term="skipahead"/><title type='text'>Generación de números aleatorios en CUDA</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt; text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyGANNLK3gZEcV41HmK1OAgLqrtqPrv52NRdNFyFCP1Mi2aF1tNeaHVXDUxF6YqtxaoaV9VDE55IMTk3Qw_9HI13ApQqyUW2Enza3QnIN9FFu-a3kdKCEw1Z9w_-PRpSe3qk4rQRrM8OM/s1600/dados.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyGANNLK3gZEcV41HmK1OAgLqrtqPrv52NRdNFyFCP1Mi2aF1tNeaHVXDUxF6YqtxaoaV9VDE55IMTk3Qw_9HI13ApQqyUW2Enza3QnIN9FFu-a3kdKCEw1Z9w_-PRpSe3qk4rQRrM8OM/s1600/dados.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Uno de los caballos de batalla más empleado en sistemas de optimización, minería de datos, sistemas expertos probabilísticos y simulación, es la utilización de&amp;nbsp;números&amp;nbsp;aleatorios, los&amp;nbsp;números&amp;nbsp;aleatorios nos permiten generar sobre la marcha poblaciones dentro de un espacio muestral controlado, que nos van a permitir, aplicando ciertas heurísticas, realizar inferencias y/o llegar a resultados. Normalmente estos métodos están clasificados dentro de lo que se conoce como &quot;métodos&amp;nbsp;Montecarlo&quot; o basados en Montecarlo.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Por la intensa aplicación de estos métodos, se hace necesario disponer de mecanismos para la generación de números aleatorios que sea eficiente y con poco costo de procesamiento.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Existen varias soluciones para abordar el problema de la generación de números pseudoaleatorios con CUDA. Así, la librería CURAND provee al desarrollador de un importante surtido de funciones de alto nivel para la obtención de números aleatorios.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
La librería CURAND contiene dos APIs: una para uso en código host, y la otra para uso en código de dispositivo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;Host API:&lt;/b&gt;&amp;nbsp;para utilizar este API es necesario incluir&amp;nbsp;&lt;i&gt;curand.h&lt;/i&gt;&amp;nbsp;en la lista de librerías en nuestro programa. Esta librería oculta al programador toda la problemática relacionada con el estado del generador de números aleatorios y su progresión de estado dentro del kernel de dispositivo. El funcionamiento básico es el siguiente:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
1º) Se realiza la inicialización del estado del generador, para ello se utiliza la función&amp;nbsp;&lt;b&gt;curandCreateGenerator().&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
2º) Se especifican las opciones del generador, indicando además la semilla a utilizar. CURAND ofrece 2 tipos de generadores:&amp;nbsp;&lt;b&gt;CURAND_RNG_XORWOW&lt;/b&gt;, es un generador de números pseudoaleatorios que ha sido implementado usando el algoritmo&amp;nbsp;&lt;i&gt;XORWOW&lt;/i&gt;&amp;nbsp;&lt;w:sdt citation=&quot;t&quot; id=&quot;252687565&quot;&gt;(32)&lt;/w:sdt&gt;&amp;nbsp;introducido por George Marsaglia es una implementación de un generador del tipo&amp;nbsp;&lt;i&gt;xorshif&lt;/i&gt;&amp;nbsp;también propuesto por él. Es un algoritmo muy rápido, calcula el siguiente elemento de la secuencia aplicando repetidamente un OR exclusivo sobre el resultado de aplicar un desplazamiento de bit al propio número. El código en lenguaje C publicado por Marsaglia es el siguiente:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #fbd4b4; border: 1pt solid windowtext; margin-left: 14.2pt; margin-right: 0cm; padding: 1pt 4pt; text-align: -webkit-auto;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;unsigned long xor128(){&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;unsigned long t;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;t=(xˆ(x&amp;lt;&amp;lt;11));x=y;y=z;z=w;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;color: #444444; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;return( w=(wˆ(w&amp;gt;&amp;gt;19))ˆ(tˆ(t&amp;gt;&amp;gt;8)) ) }&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
El Segundo tipo de generador que ofrece CURAND es un tipo&amp;nbsp; de generador números quasialeatorios:&amp;nbsp;&lt;b&gt;CURAND_RNG_SOBOL32&lt;/b&gt;, que permite generar secuencias de 32-bit y hasta 20.000 dimensiones. Es un algoritmo algo más complejo ideado por I.M. Sobol&amp;nbsp;en 1967, que permite crear secuencias uniformes de baja discrepancia utilizando muchas dimensiones.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
Una vez seleccionado el tipo de RNG&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;realizaremos la llamada a la función de la librería:&amp;nbsp;&lt;b&gt;curandSet-PseudoRandomGeneratorSeed()&amp;nbsp;&lt;/b&gt;indicando la semilla y tipo de generador deseado.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
3º) Reservar el espacio de memoria en el dispositivo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
4º) Invocar una función de generación de las disponibles pasando como parámetro el puntero a la memoria del dispositivo donde se generará la secuencia. Las distintas funciones de generación son:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpFirst&quot; style=&quot;margin-left: 32.2pt; text-indent: -18pt;&quot;&gt;
-&lt;span style=&quot;font-size: 9px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;curandSetPseudoRandomGeneratorSeed(),&lt;/b&gt;&amp;nbsp;permite generar números pseudoaleatorios y quasialeatorios cada elemento es de 32 bits, sin signo, donde todos sus bits son aleatorios.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;margin-left: 32.2pt; text-indent: -18pt;&quot;&gt;
-&lt;span style=&quot;font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b&gt;curandGenerateUniform(),&lt;/b&gt;&amp;nbsp;genera una secuencia uniforme-mente distribuida de números en coma flotante comprendidos entre (0.0, 1.0].&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpLast&quot; style=&quot;margin-left: 32.2pt; text-indent: -18pt;&quot;&gt;
-&amp;nbsp;&lt;span style=&quot;font-size: 7pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;curandGenerateNormal(),&amp;nbsp;&lt;/b&gt;permite obtener una secuencia de distribución normal, dados los valores de la media y la desviación estándar.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
Para obtener secuencias con valores utilizando doble precisión se cuenta con las funciones homologas a las dos últimas:&amp;nbsp;&lt;b&gt;curandGenerateUniformDouble(),&amp;nbsp;&lt;/b&gt;para la distribución uniforme&amp;nbsp;&lt;b&gt;&amp;nbsp;&lt;/b&gt;y&lt;b&gt;&amp;nbsp;curandGenerateNormaDouble()&amp;nbsp;&lt;/b&gt;para la normal.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
5º) Una vez terminados los procesos deseados, liberamos los recursos solicitados mediante el uso de la instrucción&amp;nbsp;&lt;b&gt;curandDestroyGenerator().&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;Device API:&lt;/b&gt;&amp;nbsp;para utilizar esta modalidad, deberemos incluir la librería curand_kernel.h en nuestro programa. Como es evidente, las funciones aquí definidas se invocarán en los kernels de dispositivo o en funciones de dispositivo, diseñadas para ser ejecutadas por los kernel. En general, el uso de esta API permite una mejor optimización del código y ofrece mejores tiempos de respuesta. La librería permite, al igual que su versión para host, generar secuencias de números pseudoaleatorios y quasialeatorios.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Las funciones principales son las siguientes:&amp;nbsp;&lt;b&gt;curand_init(),&amp;nbsp;&lt;/b&gt;para iniciar la secuencia, la función&amp;nbsp;&lt;b&gt;curand(),&amp;nbsp;&lt;/b&gt;que permite obtener un número pseudoaleatorio entero sin signo.&amp;nbsp;&lt;b&gt;curand_uniform()&lt;/b&gt;, obtiene un número en coma flotante de una distribución uniforme en el intervalo (0.0, 1.0].&amp;nbsp;&lt;b&gt;curand_normal()&lt;/b&gt;, obtiene un número en coma flotante de una distribución normal en el intervalo (0.0, 1.0] utilizando un valor de 0 para la media y de 1 para la desviación estándar.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
También se dispone de versiones de estas dos últimas funciones para obtener secuencias con números de doble precisión:&amp;nbsp;&lt;b&gt;curand_uniform_double()&lt;/b&gt;&amp;nbsp;y&amp;nbsp;&lt;b&gt;curand_normal_double().&amp;nbsp;&lt;/b&gt;Adicionalmente contamos con dos funciones que permiten obtener pares de elementos utilizando la estructura float2 y double2, que componen de un campo x y otro y, para obtener secuencias de distribución normal:&amp;nbsp;&lt;b&gt;curand_normal2()&amp;nbsp;&lt;/b&gt;y&amp;nbsp;&lt;b&gt;curand_normal2_double()&amp;nbsp;&lt;/b&gt;respectiva-mente.&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
El valor que se pasa a estas funciones es el estado del generador, que puede ser de dos tipos, dependiendo del generador que deseemos utilizar:&amp;nbsp;&lt;i&gt;curandState&lt;/i&gt;&amp;nbsp;si deseamos utilizar un RNG pseudoaleatorio, o&amp;nbsp;&lt;i&gt;curandStateSobol32&lt;/i&gt;&amp;nbsp;si deseamos obtener valores de la secuencia quasialeatorios. Para el primer caso, en el que se trabaja con números pseudoaleatorios hay que pasar una semilla a la función, mientras que en el caso de quasialeatorios hay que pasar como argumento los vectores de dirección&amp;nbsp; y el desplazamiento. Finalmente cabe destacar una función para pasar por alto elementos de la secuencia, que es lo mismo que llamar varias veces a la función curand() pero mucho más rápido:&amp;nbsp;&lt;b&gt;skipahead(),&lt;/b&gt;&amp;nbsp;en esta función indicamos el número de elementos a descartar y el estado.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para la inicialización del generador de números aleatorios en CUDA, utilizamos la función curand_init(). Como particularidad hay que utilizar una estructura de datos que mantenga el estado del generador y lo actualice durante el proceso de generación de números. &amp;nbsp;Necesitamos mantener y pasar esa estructura en cada kernel que quiera generar números aleatorios:&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #fbd4b4; border: 1pt solid windowtext; padding: 1pt 4pt; text-align: -webkit-auto;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;curandState* devStates;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;cudaMalloc ( &amp;amp;devStates, Elementos*sizeof( curandState ) );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: #444444;&quot;&gt;/* inicializacion de numeros aletorios&amp;nbsp; */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: #444444;&quot;&gt;randomize&amp;lt;&amp;lt;&amp;lt; ( Elementos + ( hilos – 1 )) / hilos, hilos &amp;gt;&amp;gt;&amp;gt; ( devStates, time(NULL) );&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
En el código anterior, en primer lugar se declara la estructura de estados de tipo curandState ya que se van a utilizar números pseudoaleatorios.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
En la siguiente sentencia se reserva la memoria que necesita el dispositivo para actualizar los estados a cada hilo del kernel. Finalmente la última instrucción consiste en una llamada al kernel reandomize (la hemos llamado igual que la función existente en muchos lenguajes de alto nivel para la inicialización de la generación de números aleatorios). Como semilla se emplea el valor del tiempo actual del sistema, preparando así los estados para la obtención de números aleatorios.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #fbd4b4; border: 1pt solid windowtext; padding: 1pt 4pt; text-align: -webkit-auto;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;__global__ void randomize( curandState *state, unsigned long semilla )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int id = threadIdx.x + blockIdx.x * blockDim.x;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; curand_init ( semilla, id, 0, &amp;amp;state[id] );&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; padding: 0cm; text-align: justify;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: #444444;&quot;&gt;}&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
El kernel randomize se encarga de iniciar el estado para cada hilo al llamar a curand_init. Separamos esta tarea en un kernel independiente con el objetivo de aumentar el rendimiento global del algoritmo. Por un lado para reducir el uso de la pila de memoria por hilo, ya que la generación de los estados de números aleatorios, en el peor de los casos puede llegar a consumir hasta 16KB. Por otro lado al separar esta tarea de la obtención de números aleatorios curand() permitimos al kernel, que está manejando la obtención, disponer de más velocidad y aumentar sus posibilidades de concurrencia al requerir menos recursos del procesador. Esto permite manejar más bloques por procesador.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: -webkit-auto;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Para obtener números aleatorios dentro del kernel utilizaremos la función&amp;nbsp;&lt;b&gt;&lt;i&gt;curand_uniform&lt;/i&gt;&lt;/b&gt;&lt;i&gt;( &amp;amp;localState )&lt;/i&gt;, que como hemos indicando anteriormente obtienen un elemento de la secuencia (en nuestro caso pseudoaleatoria) de elementos en coma flotante dentro del intervalo (0.0, 1.0].&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: -webkit-auto;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: -webkit-auto;&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr align=&quot;left&quot; size=&quot;1&quot; width=&quot;33%&quot; /&gt;
&lt;div id=&quot;ftn1&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;Las siglas en inglés de: Random Number Generator (Generador de Números Aleatorios)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: -webkit-auto;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 14.2pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/8957059062075762573/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/06/generacion-de-numeros-aleatorios-en.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8957059062075762573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8957059062075762573'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/06/generacion-de-numeros-aleatorios-en.html' title='Generación de números aleatorios en CUDA'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyGANNLK3gZEcV41HmK1OAgLqrtqPrv52NRdNFyFCP1Mi2aF1tNeaHVXDUxF6YqtxaoaV9VDE55IMTk3Qw_9HI13ApQqyUW2Enza3QnIN9FFu-a3kdKCEw1Z9w_-PRpSe3qk4rQRrM8OM/s72-c/dados.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-8174872740167399169</id><published>2012-04-29T17:06:00.000-07:00</published><updated>2013-02-22T17:10:19.034-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura Kepler"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA 5"/><title type='text'>CUDA 5.0 beta</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigYbw30RXeyQQH7o4opIt8Iat1YwFDjPcit99YUIFVY0fmY1G8MENj5d7z3o9b9dUxc9M8QkVlOjG014JKQISRnasoXG9_rPXhDK9-bwjFzCMUNfKGtRS1zUOY1qUtpSc_aodYVy_QxOw/s1600/cuda5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigYbw30RXeyQQH7o4opIt8Iat1YwFDjPcit99YUIFVY0fmY1G8MENj5d7z3o9b9dUxc9M8QkVlOjG014JKQISRnasoXG9_rPXhDK9-bwjFzCMUNfKGtRS1zUOY1qUtpSc_aodYVy_QxOw/s1600/cuda5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&amp;nbsp;&lt;/div&gt;
Buenas Noticias, parece que el lanzamiento de las primeras GPU con arquitectura Kepler, estan acelerando la salida del nuevo SDK CUDA y sus drivers. &lt;br /&gt;
&lt;br /&gt;
Ya está disponible la versión 5.0 Preview. Al parecer, vienen con nuevas herramientas y mejoras que harán más facil la implementación de aceleración de programas y procesos mediante GPU, y como no podía ser de otra manera, se incluyen los aceleradores basados en la &lt;a href=&quot;http://www.nvidia.es/object/nvidia-kepler-es.html#source=pr&quot; title=&quot;arquitectura de cálculo NVIDIA Kepler&quot;&gt;arquitectura de cálculo NVIDIA Kepler™&lt;/a&gt;, la arquitectura de procesamiento más rápida, más  eficiente y de mayor rendimiento que se haya inventado jamás.&lt;br /&gt;
&lt;br /&gt;
Entre las principales características de CUDA 5 se  incluyen (citando fuentes de &lt;a href=&quot;http://www.nvidia.es/object/nvidia-cuda-5-parallel-computing-20121015-es.html&quot; target=&quot;_blank&quot;&gt;nVidia&lt;/a&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;&lt;u&gt;Paralelismo dinámico&lt;/u&gt;: lleva la  aceleración en la GPU a nuevos algoritmos &lt;/strong&gt;&lt;br /&gt;  Los procesos  de la GPU pueden generar dinámicamente nuevos procesos, lo que permite a la GPU  adaptarse a los datos. Al reducir las interacciones con la CPU, el paralelismo dinámico  simplifica enormemente la programación paralela. Además, posibilita la aceleración en la GPU de un  número más amplio de algoritmos conocidos, tales como los utilizados en muchas  aplicaciones de dinámica de fluidos computacional y métodos de refinamiento  adaptable de mallas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;u&gt;Llamadas a otras librerías desde la GPU&lt;/u&gt;: el origen  de un ecosistema de desarrolladores&lt;/strong&gt;&lt;br /&gt;  Una nueva &lt;a href=&quot;http://developer.nvidia.com/cuda/cublas#source=pr&quot; target=&quot;_blank&quot; title=&quot;librería BLAS de CUDA&quot;&gt;librería BLAS de CUDA&lt;/a&gt; permite a los desarrolladores utilizar el paralelismo dinámico para  hacer llamadas a sus propias librerías desde la GPU. El desarrollador puede diseñar API que permitan a  otros desarrolladores ampliar la funcionalidad de sus kernels e implementar  retrollamadas (callbacks) en la GPU para adaptar la funcionalidad de otras  librerías externas que admitan llamadas desde la GPU. La posibilidad de “vincular objetos” proporciona una  forma eficiente y conocida de desarrollar aplicaciones de GPU grandes ya que  otorga a los desarrolladores la capacidad de compilar múltiples archivos CUDA  de origen en diferentes archivos de objetos y vincularlos a librerías y  aplicaciones de mayor tamaño. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;u&gt;Soporte de GPUDirect para RDMA&lt;/u&gt;: minimiza  los cuellos de botella en la memoria del sistema&lt;/strong&gt;&lt;br /&gt;La tecnología &lt;a href=&quot;http://developer.nvidia.com/cuda/nvidia-gpudirect#source=pr&quot; target=&quot;_blank&quot; title=&quot;GPUDirect&quot;&gt;GPUDirect&lt;/a&gt; proporciona comunicación directa entre las GPU y otros dispositivos  PCI-E, y acceso directo a la memoria entre las tarjetas de red y la GPU.  También reduce considerablemente la latencia de  MPISendRecv entre los nodos de GPU de un cluster y mejora el rendimiento  general de las aplicaciones. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;u&gt;NVIDIA Nsight Eclipse Edition&lt;/u&gt;: una forma  rápida y fácil de generar código CUDA&lt;/strong&gt;&lt;br /&gt;Con &lt;a href=&quot;http://www.nvidia.es/object/nsight-es.html#source=pr&quot; title=&quot;NVIDIA Nsight Eclipse Edition&quot;&gt;NVIDIA Nsight Eclipse Edition&lt;/a&gt;, los programadores pueden  programar, depurar y analizar el rendimiento de las aplicaciones de GPU dentro  del conocido entorno de desarrollo integrado basado en Eclipse para las plataformas Linux y Mac OS X.Un editor de CUDA integrado y los ejemplos de  código CUDA ayudan a agilizar la programación, y la refactorización automática  del código facilita el traslado de bucles basados en la CPU a kernels CUDA.Un sistema de análisis integrado proporciona  análisis automatizado del rendimiento y una guía de instrucciones detalladas  para eliminar los cuellos de botella del código. Por último, la diferenciación  visual de la sintaxis ayuda a distinguir mejor entre el código de la GPU y el  de la CPU.&lt;/li&gt;
&lt;br /&gt;
Estoy deseando probarlo!!&amp;nbsp; Un saludo a todos.</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/8174872740167399169/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/cuda-50-beta.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8174872740167399169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8174872740167399169'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/cuda-50-beta.html' title='CUDA 5.0 beta'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigYbw30RXeyQQH7o4opIt8Iat1YwFDjPcit99YUIFVY0fmY1G8MENj5d7z3o9b9dUxc9M8QkVlOjG014JKQISRnasoXG9_rPXhDK9-bwjFzCMUNfKGtRS1zUOY1qUtpSc_aodYVy_QxOw/s72-c/cuda5.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-5185644401769240850</id><published>2012-04-21T13:24:00.000-07:00</published><updated>2012-06-13T13:17:20.132-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmos paralelizados"/><category scheme="http://www.blogger.com/atom/ns#" term="Paralelización en CPU vs Paralelización en GPG"/><title type='text'>Paralelizar en CPU vs GPU</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Hoy vamos a tratar dos cuestiones clave a la hora de abordar una implementación en GPU:&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
los que estén acostumbrados a implementar algoritmos paralelos en CPU tendrán un acceso algo mas llano a la programación GPGPU, pero hay ciertas diferencias a tener en cuenta:&amp;nbsp;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;la paralelización en CPU difiere
considerablemente de la paralelización sobre GPU. La diferencia fundamental se
encuentra en el número de procesadores con el que contamos en una y otra
arquitectura, si bien en CPU contamos con pocos procesadores pero muy rápidos,
en GPU disponemos de muchos procesadores algo más lentos.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;La consecuencia
directa de esta diferencia implica adoptar un enfoque diferente, orientado a la
unidad mínima de procesamiento independiente, evitando en la medida de lo
posible, la dependencia entre estas unidades, esto lo tenemos que reflejar
tanto en el diseño de las estructuras de datos, como en las tareas que realicemos
sobre estas.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;Además en GPU podemos adoptar 2 enfoques diferentes:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-indent: 0cm;&quot;&gt;



&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311193612&quot;&gt;&lt;/a&gt;&lt;span lang=&quot;EN-US&quot;&gt;A.&lt;span style=&quot;font-size: 7pt; font-weight: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Enfoque &lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;orientado al bloque&lt;/span&gt;&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Cuando implementamos un
kernel en CUDA, éste puede diseñarse de tal manera que deba existir cierta
comunicación entre los hilos que ejecutan las tareas. De alguna manera estos
hilos colaboran entre sí y pueden pasarse información entre ellos,
estableciendo mecanismos de sincronización para acceder a la memoria local
donde residen las variables que son comunes al proceso. En este enfoque existe
una limitación, la comunicación o colaboración sólo es posible entre hilos que
pertenecen al mismo bloque de ejecución. La ventaja principal es que es
posible realizar una comunicación muy
rápida mediante la memoria local, ya que su tiempo de latencia es mínimo (en
comparación con el acceso a memoria global).&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
La implementación de
este enfoque requiere entonces de dos fases, una primera en la que todos los
hilos de cada bloque procesan en colaboración obteniendo un resultado por
bloque, y una segunda fase en la que son procesados los resultados de cada
bloque. Esta tarea se puede ejecutar en otro kernel de GPU o bien directamente
en CPU.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;margin-left: 7.1pt; text-indent: 0cm;&quot;&gt;



&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311193613&quot;&gt;&lt;/a&gt;B.&lt;span style=&quot;font-size: 7pt; font-weight: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Enfoque orientado
al hilo&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Este enfoque implica
una estructura más plana, en la que para una determinada ejecución existe
independencia total entre los elementos de cómputo y la tarea que se aplica.
Por ejemplo, una tarea que asigne un número aleatorio a cada elemento de un
vector puede ser un caso típico.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Aunque inicialmente puede parecer que sí tienen
dependencia dada la naturaleza pseudo-aleatoria de estos números, es posible
hacer una descomposición de tareas de forma que se pueda dar la independencia
de procesos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Nuestro algoritmo de
reducción de vectores propuesto en post anteriores, está implementado utilizando
este enfoque. Así, para desligar la dependencia se han dividido las ejecuciones del kernel en niveles, que son ejecutados secuencialmente
pero para cada ejecución todas las operaciones son independientes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
El
enfoque orientado al hilo permite de una manera más sencilla alinear las
lecturas de memoria con cada uno de los hilos que hacen uso de esa memoria,
reduciendo el “lag” que produce la latencia de la memoria sobre todo cuando esa
relación es de uno a uno.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;En resumen: dependiendo del tipo de problema una estrategia será más beneficiosa que la otra, aunque en muchos casos lo idóneo será una mezcla de todas.&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/5185644401769240850/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/paralelizar-en-cpu-vs-gpu.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/5185644401769240850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/5185644401769240850'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/paralelizar-en-cpu-vs-gpu.html' title='Paralelizar en CPU vs GPU'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-5370169913575877201</id><published>2012-04-06T13:16:00.000-07:00</published><updated>2013-02-22T15:50:15.586-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="Punto muerto computacional"/><category scheme="http://www.blogger.com/atom/ns#" term="reducción de ventores"/><category scheme="http://www.blogger.com/atom/ns#" term="Rendimiento"/><category scheme="http://www.blogger.com/atom/ns#" term="SpeedUp"/><category scheme="http://www.blogger.com/atom/ns#" term="Thrust"/><category scheme="http://www.blogger.com/atom/ns#" term="unroll factor"/><title type='text'>Un ejemplo básico, parte III: Análisis del rendimiento</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Para realizar las pruebas se ha utilizado la plataforma
&quot;Davinci&quot; que es una computadora gestionada por el Grupo de Investigación TIC-146 Supercomputación:
Algoritmos de la Universidad de Almería. Este servidor
multicore dedicado a computación GPGPU cuenta con:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc301956563&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
 2 Intel Xeon Quad Core E5640 2.67 GHz 64 bits&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
 GeForce GTX 295 (2x240 cores)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
 2 Tesla C2050 (Fermi) (448 cores)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
 GeForce GTX 480 (480 cores) &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
Todas
las GPU son Compatibles con CUDA, si bien sólo las Tesla C2050 y la GeForce GTX
480 ofrecen las prestaciones de cómputo 2.0 necesarias para aprovechar al
máximo las prestaciones de CUDA 4.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
El
sistema operativo de este servidor es un Linux Version &amp;nbsp;de kernel 2.6.26-2-amd64, con una distribución
Debian GNU/Linux 5.0.8 (lenny). La versión de Cuda instalada es la 4.0.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Los programas se han desarrollado en lenguaje C y CUDA, utilizando los
compiladores &lt;i&gt;gcc&lt;/i&gt; (The GNU Compiler Collection) y &lt;i&gt;nvgc&lt;/i&gt; (el
compilador CUDA de nVidia).&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Las pruebas se han realizado sobre diferentes tamaños de vectores partiendo
de 10.000 elementos, y con incrementos de ese mismo número hasta llegar a los
1.000.000 de elementos del vector.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-indent: 0cm;&quot;&gt;



&lt;span lang=&quot;EN-US&quot;&gt;A.&lt;span style=&quot;font-size: 7pt; font-weight: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Reducción&lt;span lang=&quot;EN-US&quot;&gt; de matrices&lt;/span&gt;&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
En las pruebas no se ha tenido en cuenta el tiempo de introducir valores
aleatorios a los elementos del vector, ya que es común para los tres
escenarios. Los tres escenarios comparados son los siguientes: por un lado la
versión secuencial de la suma ejecutada en la CPU, nuestro algoritmo de
reducción de vectores propuesto, y la reducción de vectores que la nueva
librería Thrust® ofrece y que simplifica la programación paralela para CUDA.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Cada uno de los test se ha realizado 10 veces consecutivas y se ha
calculado la media aritmética de los resultados obtenidos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Para medir los tiempos de respuesta de cada uno de los algoritmos hemos
utilizado la gestión de eventos de CUDA. Dentro del tiempo de cómputo para las
versiones paralelas, se ha incluido el tiempo de copia de memoria principal a
memoria de dispositivo y viceversa. La siguiente tabla muestra los resultados
obtenidos en el test:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-left: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;CPU&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-left: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;GPU1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-left: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Thrust&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 1;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;10000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0000382&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00007563&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00031225&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 2;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;20000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0000758&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00010429&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00031417&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 3;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;30000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0001138&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00013749&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00033243&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 4;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;40000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0001512&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00016749&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00035026&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 5;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;50000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0001884&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00019928&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00036693&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 6;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;60000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0002266&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00022946&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0003838&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 7;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;70000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0002640&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00025606&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00040174&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 8;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;80000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0003020&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00028915&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00041772&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 9;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;90000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0003392&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00031836&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00043793&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 10;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;100000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0003770&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00035073&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00046362&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 11;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;110000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0004146&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00038296&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00049638&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 12;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;120000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0004536&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00041684&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00051473&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 13;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;130000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0004896&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00044498&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00056173&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 14;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;140000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0005274&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00046391&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00058575&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 15;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;150000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0005678&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00048342&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0005885&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 16;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;160000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0006090&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00050197&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00060389&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 17;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;170000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0006442&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00051199&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00061768&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 18;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;180000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0006782&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00052612&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00063185&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 19;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;190000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0007172&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00054233&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00064476&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 20; mso-yfti-lastrow: yes;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;200000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0007548&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00055549&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00066341&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot; style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311194090&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Tabla &lt;/span&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Tiempo (en segundos) de respuesta para los algoritmos&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
La
tabla anterior muestra en la columna N el número de elementos del vector
tratado, la columna CPU muestra los tiempos de respuesta obtenidos para el
algoritmo en serie sobre la CPU, la columna GPU1 se refiere al algoritmo de
reducción propuesto y finalmente Thrust muestra los tiempos de respuesta
obtenidos utilizando las librerías Thrust®.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
Como
se puede observar el rendimiento obtenido con nuestra propuesta de algoritmo es
bastante superior al rendimiento obtenido por el algoritmo de reducción de la
librería Thrust de nVidia.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsLVRjQdiUSreP2KPXY-UATwmrSSCuzSLvrdHKR5UYrk4Yk-e7drjXXv4JGifotGf8xVkcrBqnU5InBBGZnHbYS1-9-p5venJl6yEy4gEzYb_QmltWZqEACST6P9_WSyQZ1xbaGbzHbl4/s1600/reducvector1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;199&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsLVRjQdiUSreP2KPXY-UATwmrSSCuzSLvrdHKR5UYrk4Yk-e7drjXXv4JGifotGf8xVkcrBqnU5InBBGZnHbYS1-9-p5venJl6yEy4gEzYb_QmltWZqEACST6P9_WSyQZ1xbaGbzHbl4/s320/reducvector1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Comparativa
rendimientos obtenidos&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
Se
realizó una segunda comparativa entre CPU y GPU1 con un crecimiento exponencial
de elementos de la forma 1024&lt;sup&gt;i&lt;/sup&gt; para i = 1 hasta 12 con los
siguientes resultados:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;border-collapse: collapse; border: none; margin-left: 5.4pt; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;N&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-left: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;CPU&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-left: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;GPU1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-left: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;SpeedUp&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 1;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1024&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0000042&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00004873&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.08618921&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 2;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2048&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0000082&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00004486&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.18279091&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 3;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;4096&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.000016&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00005397&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.296461&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 4;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;8192&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0000318&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00006936&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.45847751&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 5;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;16384&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0000624&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00009197&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.67848211&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 6;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;32768&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.000124&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00014606&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.84896618&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 7;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;65536&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0002474&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00024655&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1.00344758&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 8;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;131072&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.000494&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00045282&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1.09094121&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 9;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;262144&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.000992&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00070173&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1.41364912&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 10;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;524288&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0019882&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00116573&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1.70554073&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 11;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1048576&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0039892&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00213745&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1.86633605&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 12; mso-yfti-lastrow: yes;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2097152&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.0109062&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;0.00441923&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2.46789599&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311194091&quot;&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Tabla
&lt;/span&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;2&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. SpeedUp
respecto a GPU1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
En la siguiente figura se puede observar cómo la pendiente de la tendencia
creciente exponencial de la GPU1 es minorada por el factor de SpeedUp obtenido
en cada tramo:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgapgdIqAE2v84ggn7I44W_2Zuh8B9u2NhRnqB-zSaenra3pjiJOiyOV4sRc17mA6zSnJVdgjNv0QfK6YsvADpp-yIpMrdWOIOUZTve2sqLfUSVra9MmUqRzh88rz7-AOjDxAFYJ8oJjqc/s1600/reducvector2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;222&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgapgdIqAE2v84ggn7I44W_2Zuh8B9u2NhRnqB-zSaenra3pjiJOiyOV4sRc17mA6zSnJVdgjNv0QfK6YsvADpp-yIpMrdWOIOUZTve2sqLfUSVra9MmUqRzh88rz7-AOjDxAFYJ8oJjqc/s320/reducvector2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura 2&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;.
Evolución del SpeedUp al aumentar N&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;h2 style=&quot;text-indent: 0cm;&quot;&gt;



&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311193609&quot;&gt;&lt;/a&gt;B.&lt;span style=&quot;font-size: 7pt; font-weight: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Determinación del Punto Muerto Computacional&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;b&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 10pt;&quot;&gt;[1]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;
&lt;div class=&quot;Text&quot;&gt;
Trataremos de determinar el
punto donde es indiferente realizar los cálculos en CPU respecto
de la GPU ó &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
GPU respecto de la CPU porque el rendimiento
sea el mismo. En las pruebas anteriores, hemos podido observar cómo en los
tramos donde el número de elementos que componen el vector a reducir es bajo,
se daba la situación que el algoritmo en serie ejecutado en la CPU obtenía
mejores resultados que sus homólogos paralelizados sobre GPU. Evidentemente
debemos de tener esto en cuenta a la hora de decidir en donde debemos ejecutar
cada trabajo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
Dicho punto coincidirá con el punto de corte de las funciones que representan el tiempo de ejecución que emplea cada
algoritmo en procesar exactamente el mismo trabajo (incluidos en este caso para
los algoritmos de GPU, los tiempos de proceso consumidos en la transferencia de
memoria principal a memoria del dispositivo y una vez realizado el cálculo,
vuelta a recibir los datos a memoria principal) y obtener exactamente el mismo
resultado. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid;&quot;&gt;
Si realizamos un zoom sobre los datos tratados apreciamos&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj86K_122hA0LWNAhIRVI8c4bWfi9_W_Y_Eri0GR_4rHSm1Y-a1NJj_er9uy9LbsY7BG0XCysT5I5jmSwBjqL4qDebOlPC4ymXlXXZMCanzdZjWrQ_UpXQN0oMsuzAQiEHpAfckE_HGjdg/s1600/reducvector3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;182&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj86K_122hA0LWNAhIRVI8c4bWfi9_W_Y_Eri0GR_4rHSm1Y-a1NJj_er9uy9LbsY7BG0XCysT5I5jmSwBjqL4qDebOlPC4ymXlXXZMCanzdZjWrQ_UpXQN0oMsuzAQiEHpAfckE_HGjdg/s320/reducvector3.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot; style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura 3&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Punto de corte
función CPU y GPU1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
un punto de corte entre
las funciones de tiempo de respuesta sobre el tamaño N del vector. Así, en la Figura
18 podemos observar cómo ese punto de corte está cerca de los 70000 elementos.
Podemos decir que en este punto es indiferente la utilización de un algoritmo u
otro
en términos de tiempos de ejecución. Por debajo de este valor sería mejor computar sobre la CPU, mientras que
por encima de ese valor sería mejor hacerlo en GPU.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
Evidentemente,
esta visión es algo ingenua, y se deberían tener otros factores en cuenta a la
hora de tomar esta decisión.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;- Coste de
utilización&lt;/i&gt;: es el coste
que implica la utilización de cada escenario. En muchos casos (como en grandes
centros de computación) se calcula como la suma del coste de adquisición&amp;nbsp; más el coste en potencia (watios) por euro de
cada recurso. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;- Coste de oportunidad&lt;/i&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: es un concepto más sutil pero muy interesante a
la hora de tomar decisiones económicas. Aplicado a nuestro caso, se puede definir
como el coste que supone la decisión de computar un algoritmo en un recurso
(que es escaso) y no computar o descartar la computación de otro algoritmo en
ese mismo recurso.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Teniendo en cuenta los costes anteriores se podrán tomar decisiones por ejemplo: de utilizar una GPU
para realizar un determinado proceso aunque el tiempo de respuesta sea similar
o peor al obtenido en CPU, debido a que el coste por watio de la GPU es muy
inferior, y a que el coste del trabajo que puede realizarse en la CPU sea mucho
mayor.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2 style=&quot;text-indent: 0cm;&quot;&gt;



C.&lt;span style=&quot;font-size: 7pt; font-weight: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311193610&quot;&gt;&lt;/a&gt;Determinación del
Factor de Desenrollado&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;
&lt;div class=&quot;Text&quot;&gt;
Ya se habló en post anteriores de la importancia de este factor, y de cómo ha sido un caballo de batalla en
los compiladores desde los inicios de la informática.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
El objetivo fundamental que
perseguimos con esta técnica es compensar los efectos negativos en el
rendimiento que producen los tiempos de latencia que se producen en los accesos
a memoria.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
De forma intuitiva, podemos
expresar este efecto como el que se produce en las líneas de autobuses urbanos:
un autobús puede transportar 50 pasajeros a la vez, tarda prácticamente lo
mismo si trasporta 1 o si trasporta a 50. El problema está en que la compañía
de autobuses espera optimizar su beneficio, y establece unos horarios de salida
y llegada, por eso, aunque un pasajero suba al autobús, deberá esperar cierto
tiempo hasta ser trasportado a su destino. En nuestro caso los pasajeros son
los datos que necesitamos tratar, la parada de origen es la memoria global del
dispositivo, y la parada final, los registros locales del hilo que ejecuta un
kernel. La arquitectura CUDA, está diseñada para esperar en la parada de origen
entre 400 y 600 ciclos de reloj, además hay que tener en cuenta el número de
pasajeros que se permite trasportar en cada viaje.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
Como podemos deducir, para
optimizar el proceso, cada vez que realicemos un acceso a memoria global del
dispositivo, lo haremos de tal manera que llenemos el autobús, y todos esos
datos trasportados, los procesaremos en el mismo hilo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
Para nuestro algoritmo, hemos
realizado una serie de pruebas partiendo de un factor de desenrollado de 2
hasta 10, 25, 50 y 100, la siguiente tabla muestra los tiempos de respuesta
obtenidos en cada caso.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;UF&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-left: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;GPU1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 1;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00010693&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 2;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00008918&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 3;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00008308&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 4;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00007948&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 5;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00008024&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 6;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;7&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00007638&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 7;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00007826&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 8;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;9&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00008013&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 9;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;10&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00007762&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 10;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;25&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.0000807&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 11;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;50&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00008548&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 11.35pt; mso-yfti-irow: 12; mso-yfti-lastrow: yes;&quot;&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-top: none; border: solid windowtext 1.0pt; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 60.8pt;&quot; valign=&quot;top&quot; width=&quot;81&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td nowrap=&quot;&quot; style=&quot;border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; height: 11.35pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 128.9pt;&quot; valign=&quot;top&quot; width=&quot;172&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 9pt; line-height: 105%;&quot;&gt;0.00011343&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot; style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311194092&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Tabla &lt;/span&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;3&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Tiempos de respuesta
para distintos valores de UF&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
Hemos determinado de forma
empírica que el mejor factor es el de 7. Para otros algoritmos puede variar ya
que todo esto depende del tipo de dato que se esté transportando, del tamaño de
los registros necesarios en el kernel, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjGK96fjRoSCBzh_80sBjA7RtSr5pGrWPkOL4gwyhOSGeBR_vLWsx5jhrPi-qjwEpF3TRSTkKFUd4nTSzffdI_qZIPTxnPWbhNSpybEu8SkXW4yTuKUzUq7RHta2OFLqgyGswKhHzWSFs/s1600/reducvector4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;195&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjGK96fjRoSCBzh_80sBjA7RtSr5pGrWPkOL4gwyhOSGeBR_vLWsx5jhrPi-qjwEpF3TRSTkKFUd4nTSzffdI_qZIPTxnPWbhNSpybEu8SkXW4yTuKUzUq7RHta2OFLqgyGswKhHzWSFs/s320/reducvector4.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura 4&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;.
Selección del mejor factor de Unroll&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr align=&quot;left&quot; size=&quot;1&quot; width=&quot;33%&quot; /&gt;
&lt;div id=&quot;ftn1&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; Este término ha sido acuñado para el presente
trabajo como analogía al término económico “Punto Muerto” o “Umbral de
rentabilidad” donde los ingresos son iguales a los gastos&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot; style=&quot;text-align: center;&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&lt;/span&gt;Es el término económico utilizado para referirnos al coste de la mejor opción no realizada. Este término fue&amp;nbsp;inventado por&amp;nbsp;Friedrich von Wieser en su Theorie der gesellschaftlichen Wirtschaft (Teoría de la economía social). El coste de la oportunidad&amp;nbsp;es aquello a lo que renunciamos cuando tomamos una decisión económica.
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/5370169913575877201/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/un-ejemplo-basico-parte-iii-analisis.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/5370169913575877201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/5370169913575877201'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/un-ejemplo-basico-parte-iii-analisis.html' title='Un ejemplo básico, parte III: Análisis del rendimiento'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsLVRjQdiUSreP2KPXY-UATwmrSSCuzSLvrdHKR5UYrk4Yk-e7drjXXv4JGifotGf8xVkcrBqnU5InBBGZnHbYS1-9-p5venJl6yEy4gEzYb_QmltWZqEACST6P9_WSyQZ1xbaGbzHbl4/s72-c/reducvector1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-7290122050298830502</id><published>2012-03-23T12:59:00.000-07:00</published><updated>2012-06-13T11:22:11.574-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blockDim"/><category scheme="http://www.blogger.com/atom/ns#" term="blockIdx"/><category scheme="http://www.blogger.com/atom/ns#" term="Kernel"/><category scheme="http://www.blogger.com/atom/ns#" term="Reducción de vectores"/><category scheme="http://www.blogger.com/atom/ns#" term="threadIdx"/><category scheme="http://www.blogger.com/atom/ns#" term="unroll factor"/><title type='text'>Un ejemplo básico, parte II: Implementación del Kernel</title><content type='html'>Como os prometí en el anterior post, hoy veremos la&amp;nbsp;implementación&amp;nbsp;del kernel para la reducción de vectores:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;Nuestro kernel básicamente consiste en realizar
la suma de una serie de elementos y guardarla en el primero de ellos. Cada
ejecución se encargará de una posición de memoria diferente, con lo que no es necesario
preocuparnos de implementar ningún mecanismo de sincronización. El número de
elementos a sumar viene dado por el factor de desenrollado (UF).&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;Los parámetros
de entrada del Algoritmo son: &lt;b&gt;Datos: &lt;/b&gt;puntero a la estructura que
contiene los datos a sumar, &lt;b&gt;Elementos&lt;/b&gt;: número de elementos que se suman,
&lt;b&gt;Impar&lt;/b&gt;: indica si el número de elementos es impar (para evitar la
realización del cálculo del módulo, dentro del kernel, ya que es
computacionalmente costoso), y finalmente &lt;b&gt;UF&lt;/b&gt;, que se&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;utilizará para indicar el número de elementos a
sumar dentro de cada hilo.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableClassic1&quot; style=&quot;border-collapse: collapse; border: none; mso-border-bottom-alt: solid black 1.5pt; mso-border-top-alt: solid black 1.5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;3&quot; style=&quot;border-bottom: solid black 1.0pt; border-left: none; border-right: none; border-top: solid black 1.5pt; mso-border-bottom-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;&quot; valign=&quot;top&quot; width=&quot;345&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 5; text-indent: 0cm;&quot;&gt;
&lt;b&gt;&lt;i&gt;Algoritmo 3:&lt;/i&gt;&lt;/b&gt;&lt;i&gt; kernel
  de reducción de vectores&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
1&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;tid ← threadIdx.x + blockIdx.x * blockDim.x&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
2&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;t &lt;/span&gt;&lt;/i&gt;&lt;i&gt;← &lt;/i&gt;&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;(ene/UF)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
3&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
si&lt;i&gt; tid &amp;lt; t &lt;/i&gt;hacer&lt;i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
4&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp; &lt;/i&gt;para&lt;i&gt; i&lt;/i&gt;←&lt;i&gt;1 &lt;/i&gt;hasta&lt;i&gt; UF &lt;/i&gt;hacer&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
5&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[tid] &lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;EN-US&quot;&gt;← &lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt;a[tid] &lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&amp;nbsp;+&lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot;&gt; a[(tid+(t*i))]&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
6&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
Si &lt;i&gt;tid = 0&lt;/i&gt; y &lt;i&gt;impar &amp;gt; 0&lt;/i&gt; hacer&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
7&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&amp;nbsp; para&lt;i&gt; i&lt;/i&gt;←&lt;i&gt;1 &lt;/i&gt;hasta&lt;i&gt; impar+1
  &lt;/i&gt;hacer&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span lang=&quot;PT&quot;&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.5pt; border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.5pt; border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 215.2pt;&quot; valign=&quot;top&quot; width=&quot;287&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;a[tid] ← a[tid]&amp;nbsp;
  + a[(ene-i)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoCaption&quot; style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Algoritmo 1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&amp;nbsp;Kernel de reducción de vectores&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoCaption&quot; style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoCaption&quot; style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
1.-La primera línea del algoritmo,
“&lt;i&gt;tid ← threadIdx.x + blockIdx.x *
blockDim.x&lt;/i&gt;”, es la típica asignación para el cálculo de la posición global
de ejecución del kernel. Así se identifica exactamente al hilo que se está
referenciando en cada uno de los kernels y es la forma que tenemos para
organizar el proceso en paralelo. Como en nuestro caso estamos trabajando únicamente
con una dimensión, sólo se referencia al valor del campo “&lt;i&gt;x&lt;/i&gt;” de cada variable (&lt;i&gt;threadIdx, blockIdx y blockDim),&lt;/i&gt; pero podrían ser hasta tridimensionales, para ello se utilizan los
campos&lt;i&gt; “y” &lt;/i&gt;y&lt;i&gt;
“z”&lt;/i&gt; para referirnos a la segunda y
tercera dimensión respectivamente.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
2.-&lt;span style=&quot;font-family: Tahoma, sans-serif;&quot;&gt; &lt;/span&gt;Dado
que el número real de cálculos que tenemos que ejecutar no siempre coincide con
el total de hilos ejecutados en los Kernels, debemos controlar esta situación para que el
dispositivo no haga trabajo inútil (o redundante). Por este motivo la segunda
línea del algoritmo calcula el número total de threads a emplear y en la
tercera sólo se permite la ejecución del proceso de reducción a los hilos que
están dentro del rango necesario.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
4.-El siguiente paso define al bucle que empleamos
para la suma de elementos del vector, que viene definido por el factor de
desenrollado que empleamos en la llamada.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
5.-La siguiente línea realiza la suma de elementos
y la acumula en el primer elemento. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
6.-Finalmente, tenemos una condición especial: sólo
si se trata del primer hilo y el número de elementos a procesar es impar,
adicionamos esos elementos impares también al primero. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Las operaciones realizadas en el siguiente
ejemplo son: (3+6=9), (8+5=13), (4+2=6), y en la siguiente iteración
(9+13+6=28).&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
En la siguiente Figura se puede observar
gráficamente el proceso, para un factor UF de 2:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLTYE5A3yEkvlSxZMn48cLYWcxlkWwFMuGXEvz69MaJitCXnfos88Wb4Ok8DjtlRBe8JAhfeExNSacnDqIAamxDsarywl0J2wpxLxYAasXrqUqpM8RBEI4f-Sd_THLDka4LamKcj1Md2o/s1600/reduccionUF2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLTYE5A3yEkvlSxZMn48cLYWcxlkWwFMuGXEvz69MaJitCXnfos88Wb4Ok8DjtlRBe8JAhfeExNSacnDqIAamxDsarywl0J2wpxLxYAasXrqUqpM8RBEI4f-Sd_THLDka4LamKcj1Md2o/s1600/reduccionUF2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot; style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311193887&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura &lt;/span&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;.
Reducción con UF = 2&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Las propiedades fundamentales de este método de reducción que acabamos de
proponer son:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpFirst&quot; style=&quot;margin-left: 28.1pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;No hay relación entre bloques ni hilos del mismo stream, con lo que no es
necesario establecer ningún tipo de mecanismo para sincronizar el algoritmo en
ningún punto. Es un algoritmo orientado al hilo y no al bloque.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;margin-left: 28.1pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Adecúa la petición de recursos del sistema en función al estado de su
ejecución.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;margin-left: 28.1pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Sólo se realiza un desplazamiento de datos de memoria central a memoria de
dispositivo por el total de elementos a sumar, y además solo se necesita desplazar
el primer elemento a memoria principal para obtener el resultado de la
reducción.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpLast&quot; style=&quot;margin-left: 28.1pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Con el control de UF se reduce el
efecto de la latencia de memoria global del dispositivo, no siendo por tanto
necesario realizar las lecturas alineadas con el orden de los hilos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Ya hemos presentado un algoritmo para la reducción de vectores, que como&amp;nbsp;sabréis, es una de las operaciones más típicas en multitud de escenarios, tanto en análisis de datos, como en optimización. El&amp;nbsp;próximo&amp;nbsp;post presentará los datos obtenidos en las pruebas.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/7290122050298830502/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/03/un-ejemplo-basico-implementacion-del.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/7290122050298830502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/7290122050298830502'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/03/un-ejemplo-basico-implementacion-del.html' title='Un ejemplo básico, parte II: Implementación del Kernel'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLTYE5A3yEkvlSxZMn48cLYWcxlkWwFMuGXEvz69MaJitCXnfos88Wb4Ok8DjtlRBe8JAhfeExNSacnDqIAamxDsarywl0J2wpxLxYAasXrqUqpM8RBEI4f-Sd_THLDka4LamKcj1Md2o/s72-c/reduccionUF2.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-7009583217646766458</id><published>2012-03-09T12:47:00.000-08:00</published><updated>2012-06-13T11:22:59.242-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bloques por malla"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="hilos por bloque"/><category scheme="http://www.blogger.com/atom/ns#" term="Kernel call configuration"/><category scheme="http://www.blogger.com/atom/ns#" term="llamada a Kernel"/><title type='text'>Un ejemplo básico, parte I: la llamada al kernel</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
Vamos a diseñar un algoritmo
que permita realizar llamadas a nuestro kernel de tal forma que conociendo &lt;i&gt;N&lt;/i&gt;
número de elementos a procesar o tamaño del bucle en versión serie, utilice los
mínimos recursos (de procesador gráfico) minimizando también las transferencias
de memoria. Nos centraremos en un típico caso que en el que se emplea la programación paralela: Reducción de vectores. En la literatura hay multitud de ejemplos y diversos enfoques, nVidia&amp;nbsp;también&amp;nbsp;realiza varias implementaciones hasta 7 diferentes, van ilustrando los diferentes factores para mejorar el rendimiento. Yo implementé mi propio método, que ha resultado ser más rápido que las implementaciones de nVidia y de la librería Trust en varios escenarios. En el presente post y el siguiente lo presento:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-indent: 0cm;&quot;&gt;


&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=578470634220317465&quot; name=&quot;_Toc311193605&quot;&gt;&lt;/a&gt;Algoritmo para la llamada al kernel&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
Primero necesitamos
obtener las características del dispositivo donde se van a ejecutar los
programas, eso lo podemos obtener en tiempo de ejecución interrogando las
capacidades de cada dispositivo.&lt;span style=&quot;font-family: Tahoma, sans-serif;&quot;&gt; &lt;/span&gt;Las tres
variables cuyo valor necesitamos saber son: &lt;b&gt;&lt;i&gt;N&lt;/i&gt;&lt;/b&gt;&amp;nbsp; número de elementos a procesar, &lt;b&gt;&lt;i&gt;UF&lt;/i&gt;&lt;/b&gt; factor de desenrollado
(&lt;i&gt;Unroll factor&lt;/i&gt;), que determinará la velocidad de segmentación de los datos y el número
de instrucciones serie que ejecuta el kernel en cada hilo, y &lt;b&gt;&lt;i&gt;datos&lt;/i&gt;&lt;/b&gt; que es el
puntero al bloque de datos a procesar.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
Una vez determinados los valores de
estas variables podremos calcular el factor de ocupación. El consumo máximo de tiempo
se emplea en la migración de los datos desde memoria principal a la memoria del
dispositivo, por lo que realizaremos sólo un proceso de carga y otro de descarga. El tamaño
de bloques necesarios para la ejecución se irá reduciendo de forma logarítmica
en cada iteración, ya que este algoritmo está orientado a las operaciones de
reducción de vectores.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
Para acumular los valores obtenidos se sobrescribe el
vector de entrada con los resultados que se van obteniendo en cada cálculo, evitando así
crear dos estructuras de datos, una de entrada y otra de salida. Además para
cada llamada
se aprovecha la información residente en la memoria del dispositivo, reduciendo la
cantidad de datos transferida entre la memoria central y la del dispositivo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableClassic1&quot; style=&quot;border-collapse: collapse; border: none; mso-border-bottom-alt: solid black 1.5pt; mso-border-top-alt: solid black 1.5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;3&quot; style=&quot;border-bottom: solid black 1.0pt; border-left: none; border-right: none; border-top: solid black 1.5pt; mso-border-bottom-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;&quot; valign=&quot;top&quot; width=&quot;345&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 5; text-indent: 0cm;&quot;&gt;
&lt;b&gt;&lt;i&gt;Algoritmo 2:&lt;/i&gt;&lt;/b&gt;&lt;i&gt;
  Algoritmo de llamada a un kernel&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
1&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
Obtener_caracteristicasGPU (&lt;i&gt;max_bloques,
  max_hilos&lt;/i&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
2&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;span lang=&quot;PT&quot;&gt;Determinar_factor_ocupacion(&lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;N,max_bloques, max_hilos, registros_kernel, nhilos&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;PT&quot;&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
3&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;UF &lt;/i&gt;← 7&lt;i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
4&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;auxN&lt;/i&gt; &lt;i&gt;&amp;nbsp;&lt;/i&gt;← &lt;i&gt;N&lt;/i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
5&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;huerfanos&lt;/i&gt; &lt;i&gt;&amp;nbsp;&lt;/i&gt;← &amp;nbsp;(&lt;i&gt;auxN&lt;/i&gt; modulo &lt;i&gt;UF&lt;/i&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
6&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
Datos_a_dispositivo(&lt;i&gt;datos_dispositivo&lt;/i&gt;, &lt;i&gt;datos&lt;/i&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
7&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;span lang=&quot;PT&quot;&gt;Para &lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;i &lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;PT&quot;&gt;← 1 hasta
  (log(&lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;N&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;PT&quot;&gt;) / Log(&lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;UF&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;PT&quot;&gt;))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span lang=&quot;PT&quot;&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 215.2pt;&quot; valign=&quot;top&quot; width=&quot;287&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;b&gt;Ejecutar en paralelo&lt;/b&gt; Reduce&amp;lt;&amp;lt;&amp;lt;(&lt;i&gt;auxN&lt;/i&gt;+&lt;i&gt;nhilos&lt;/i&gt;-1)/&lt;i&gt;nhilos&lt;/i&gt;,&lt;i&gt;nhilos&lt;/i&gt;&amp;gt; &amp;gt;&amp;gt;(&lt;i&gt;datos_dispositivo&lt;/i&gt;, &lt;i&gt;auxN&lt;/i&gt;, &lt;i&gt;huerfanos,
  UF&lt;/i&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span lang=&quot;PT&quot;&gt;9&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 215.2pt;&quot; valign=&quot;top&quot; width=&quot;287&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;auxN&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;PT&quot;&gt; ← &lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;auxN&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;PT&quot;&gt; / &lt;/span&gt;&lt;i&gt;&lt;span lang=&quot;PT&quot;&gt;UF&lt;/span&gt;&lt;/i&gt;&lt;span lang=&quot;PT&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span lang=&quot;PT&quot;&gt;10&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 215.2pt;&quot; valign=&quot;top&quot; width=&quot;287&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;i&gt;huerfanos&lt;/i&gt; &lt;i&gt;&amp;nbsp;&lt;/i&gt;← &amp;nbsp;(&lt;i&gt;auxN&lt;/i&gt; modulo &lt;i&gt;UF&lt;/i&gt;)&lt;span lang=&quot;PT&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border-bottom: solid black 1.5pt; border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 21.9pt;&quot; valign=&quot;top&quot; width=&quot;29&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
11&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; style=&quot;border-bottom: solid black 1.5pt; border: none; padding: 0cm 5.4pt 0cm 5.4pt; width: 237.1pt;&quot; valign=&quot;top&quot; width=&quot;316&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid; text-indent: 0cm;&quot;&gt;
Datos_a_memoria_principal(&lt;i&gt;datos,
  datos_dispositivo&lt;/i&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoCaption&quot; style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Algoritmo 1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;.Llamada
al Kernel&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Pasaremos a comentar cada
una de las líneas de l algoritmo: &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
1.- &lt;i&gt;Obtener_caracteristicas &lt;/i&gt;GPU (&lt;i&gt;max_bloques, max_hilos&lt;/i&gt;): Indica los
límites de la arquitectura seleccionada, que se&lt;span style=&quot;font-family: Tahoma, sans-serif;&quot;&gt; &lt;/span&gt;utilizarán para aplicar las reglas que obtendrán el mejor factor de
ocupación. Adicionalmente se obtienen otras cualidades de los dispositivos como
la capacidad computacional (Compute capability) que indicará cuales son los
dispositivos que permiten aprovechar las nuevas capacidades de CUDA 4,
caracterizados por tener una capacidad igual o superior a 2.0. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
2.- Si se puede estimar el tamaño N de nuestro proceso, y esto se puede traducir en el número
de hilos necesarios para invocar al kernel, se podrá determinar el mejor factor
de ocupación. Este cálculo óptimo de la relación hilos/bloques se puede realizar
fácilmente porque al compilar el kernel se puede conocer el tamaño de de los
registros necesarios para cada hilo,&amp;nbsp;&amp;nbsp; y consecuentemente,
se puede determinar el número máximo de hilos por bloque y de bloques por
procesador.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
3.- En la línea 3 hay que proporcionar un valor de &lt;i&gt;Unroll Factor (UF). &lt;/i&gt;Para
ello se deberán de realizar varias pruebas para obtener el mejor valor para este
parámetro, ya que dependerá mucho de la estructura de datos en memoria que
estemos utilizando, el tipo de memoria que utilicemos para su gestión y la
coalescencia de los accesos que realicemos. En nuestras pruebas hemos utilizado
la memoria global del dispositivo, y los accesos no han sido alineados con la
ejecución de los kernels, Como veremos más adelante para nuestro algoritmo el
mejor valor ha sido 7.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
4.-&lt;span style=&quot;font-family: Tahoma, sans-serif;&quot;&gt; &lt;/span&gt;En la línea 4 utilizamos una variable para
guardar el tamaño de procesamiento remanente. El valor de esta variable se va
reduciendo logarítmicamente conforme avanza el proceso.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
5.- La variable &quot;huérfanos&quot; se utiliza para determinar cuándo se
produce un elemento huérfano, el deberá de tratarse de forma especial. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
6.- La línea 6 copia los datos desde memoria principal a la memoria global del dispositivo
para ser procesados por el kernel.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
7.- El bucle realiza una serie de llamadas al kernel en las que se ajustan los bloques que
demandamos al dispositivo en función del remanente de ejecuciones. El número de
iteraciones se corresponde con el cociente entre el logaritmo&amp;nbsp; de N y el logaritmo de UF-.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-layout-grid-align: none; text-align: justify; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
11.-&lt;span style=&quot;font-family: Tahoma, sans-serif;&quot;&gt; &lt;/span&gt;Una vez concluidas las ejecuciones se descargará el dato deseado a
memoria principal para obtener el resultado final. &amp;nbsp;La utilización del las llamadas descendentes,
la vamos a entender a continuación en cuanto se exponga el Kernel.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Os dejo analizando el algoritmo, en el próximo post,&amp;nbsp;veremos&amp;nbsp;la implementación del Kernel. Hasta pronto&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/7009583217646766458/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/03/un-ejemplo-basico-parte-i-la-llamada-al.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/7009583217646766458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/7009583217646766458'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/03/un-ejemplo-basico-parte-i-la-llamada-al.html' title='Un ejemplo básico, parte I: la llamada al kernel'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-2449909993153106603</id><published>2012-03-02T10:48:00.000-08:00</published><updated>2012-06-13T11:23:44.007-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Factor de desenrrollado"/><category scheme="http://www.blogger.com/atom/ns#" term="factor de ocupación"/><category scheme="http://www.blogger.com/atom/ns#" term="nivel de paralelización por instrucción"/><category scheme="http://www.blogger.com/atom/ns#" term="tasa de transferencia de memoria"/><category scheme="http://www.blogger.com/atom/ns#" term="tipos de memoria"/><title type='text'>En busca del Kernel perdido</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;Text&quot;&gt;
Con todo lo expuesto en los
post anteriores debemos confeccionar nuestra lista de prioridades a la
hora de diseñar los kernel que ejecuten las GPU. Resumiendo, debemos tener en
cuenta los siguientes factores:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Factor de “unroll”&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;ILP: Nivel de Paralelización por instrucción&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Factor de ocupación de la GPU, que se compone de:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 64.1pt; mso-list: l0 level2 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;;&quot;&gt;o&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Nº de bloques que se necesitan&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 64.1pt; mso-list: l0 level2 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;;&quot;&gt;o&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Nº de hilos por cada bloque&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 64.1pt; mso-list: l0 level2 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;;&quot;&gt;o&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Registros utilizados en el kernel&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 64.1pt; mso-list: l0 level2 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Transferencias de memoria CPU &amp;lt;-&amp;gt; GPU&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font-family: &#39;Times New Roman&#39;; font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Tipos de memoria a utilizar, Global, compartida,…&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;Teniendo todo esto en cuenta, nuestro kernel debe tener un número de
instrucciones&amp;nbsp; mínimo que ocupe la
latencia de la arquitectura, y se intentará invocar al kernel con el tamaño&amp;nbsp;justo de bloques e hilos por bloques que
maximicen la ocupación del tamaño&amp;nbsp;
requerido. Se minimizará el número de
transferencias de memoria entre CPU y GPU. Se intentará evitar las latencias de acceso a memoria
global mediante accesos ordenados en memoria compartida.&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
En el próximo post, ilustraré con un ejemplo todo esto que hemos comentado&lt;/div&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif; font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/2449909993153106603/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/03/en-busca-del-kernel-perdido.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/2449909993153106603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/2449909993153106603'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/03/en-busca-del-kernel-perdido.html' title='En busca del Kernel perdido'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-2817979119327982122</id><published>2012-02-24T10:40:00.000-08:00</published><updated>2012-06-13T11:24:08.751-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="constant memory"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="global memory"/><category scheme="http://www.blogger.com/atom/ns#" term="local memory"/><category scheme="http://www.blogger.com/atom/ns#" term="registers"/><category scheme="http://www.blogger.com/atom/ns#" term="shared memory"/><category scheme="http://www.blogger.com/atom/ns#" term="texture memory"/><category scheme="http://www.blogger.com/atom/ns#" term="tipos de memoria"/><title type='text'>Los diversos usos de la memoria</title><content type='html'>Es muy importante saber que ventajas e inconvenientes tiene el uso de cada tipo de memoria de dispositivo, antes de realizar cualquier diseño, deberías tener claro cómo CUDA gestiona cada tipo de memoria, y cual es el coste o penalización que supone su utilización.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;Text&quot;&gt;
La siguiente Figura muestra los tipos de memoria en las GPUs y el ámbito de acceso de cada elemento&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid; text-indent: 0cm;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgweJbCklhULKDgwI1-D9u9qm5mM2h5l0ttEgqjDxSHoPOEokbBk_gBZeiehlrtC7dttLllyywV_Olppy5X5-ceTBSrNZTlNcBTS0dzunhW2DIL4CLTF__M_yrqKPNeGghr90ncSBkX4fo/s1600/tipomemoriacuda.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;273&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgweJbCklhULKDgwI1-D9u9qm5mM2h5l0ttEgqjDxSHoPOEokbBk_gBZeiehlrtC7dttLllyywV_Olppy5X5-ceTBSrNZTlNcBTS0dzunhW2DIL4CLTF__M_yrqKPNeGghr90ncSBkX4fo/s320/tipomemoriacuda.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot; style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura 1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Los diferentes tipos de memoria en la GPU&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Cada una de ellas tiene unos propósitos concretos que pasamos a detallar:&amp;nbsp;Los registros y la memoria local son espacios de memoria accesibles únicamente por el hilo al que pertenecen. Por otro lado, a la memoria compartida&amp;nbsp;&amp;nbsp;pueden acceder todos los hilos del mismo bloque, utilizando para ello mecanismos de sincronización que mantienen el orden en las lecturas y escrituras. Al resto de memorias&amp;nbsp;&amp;nbsp;se puede acceder desde toda la malla que ejecuta un kernel. Se distinguen en que la memoria global no dispone de memoria caché, la memoria de constantes es de sólo lectura, y la memoria de texturas dispone de una caché espacial.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
El cuello de botella principal lo encontramos en la transferencia de memoria entre la CPU y la GPU, de modo que la penalización nos la encontramos en la latencia del acceso a la memoria global (entre 400 y 600 ciclos). Como solución posible se plantea el alineamiento de la memoria global para poder hacer lecturas ordenadas según la posición de cada hilo dentro de la tanda, se puede utilizar la memoria compartida para hacer la ordenación dentro de cada bloque. No siempre es posible hacer esta ordenación y el problema se complica cuando aumentan las dimensiones (matrices por ejemplo).&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/2817979119327982122/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/02/los-diversos-usos-de-la-memoria.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/2817979119327982122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/2817979119327982122'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/02/los-diversos-usos-de-la-memoria.html' title='Los diversos usos de la memoria'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgweJbCklhULKDgwI1-D9u9qm5mM2h5l0ttEgqjDxSHoPOEokbBk_gBZeiehlrtC7dttLllyywV_Olppy5X5-ceTBSrNZTlNcBTS0dzunhW2DIL4CLTF__M_yrqKPNeGghr90ncSBkX4fo/s72-c/tipomemoriacuda.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-1229611820329725966</id><published>2012-02-10T10:36:00.000-08:00</published><updated>2012-06-03T04:27:25.217-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="kernel concurrency"/><category scheme="http://www.blogger.com/atom/ns#" term="multi-GPU"/><title type='text'>Entorno respetuoso de ejecución</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid; text-align: justify;&quot;&gt;
A simple vista podríamos pensar que si un Grid solo puede ejecutar el mismo
kernel y este es controlado solo por un dispositivo el cual solo es accesible
desde el mismo thread del host, no es necesario tener en consideración otras interacciones
entre distintos procesos. Hasta la versión 3.2 de&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;CUDA esto era así,&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiky6T9jH_CgbiYgjm72lNB457kMNn3G6saZHeSSWD8QNgvL6RnpEEKU4Lg3psMip2bben8mb9DV0lpVyDYpJxxgmlsmB7humyYANbe8Nl5W6UERf7ML2stTeQpBZ_ybLOj3zxt1yVbSNA/s1600/cuda4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;155&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiky6T9jH_CgbiYgjm72lNB457kMNn3G6saZHeSSWD8QNgvL6RnpEEKU4Lg3psMip2bben8mb9DV0lpVyDYpJxxgmlsmB7humyYANbe8Nl5W6UERf7ML2stTeQpBZ_ybLOj3zxt1yVbSNA/s320/cuda4.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot; style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. CUDA 4.0
revoluciona la computación paralela en GPGPU&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
pero con la aparición de CUDA 4.0, se han eliminado ésta y muchas
otras barreras: en cuanto a la plataforma GPUDirect™ se pueden realizar
transferencias de memoria directamente de una GPU a otra sin pasar por memoria
host; arquitectura 64-bit nativa; gestión de clúster; soporte multi-GPU en la
que se pueden compartir múltiples GPUs a través de múltiples hilos (de host),
un solo hilo (de host) puede acceder a todas las GPUs. En cuanto al modelo de
programación: direccionamiento de memoria unificado, ahora se podrá contemplar
la memoria de sistema y la memoria de cada una de las GPUs como una sola unidad
de memoria simplificando así la migración de programas existentes.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
Además el
nuevo toolkit viene acompañado de librerías OpenSource y plantillas de
primitivas que ayudan y facilitan el manejo de vectores, matrices, etc. Un
nuevo sistema de análisis de rendimiento permitirá obtener todas las métricas
necesarias para afinar nuestros desarrollos.&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 0cm;&quot;&gt;
Por
eso es importante diseñar no sólo kernels, sino también las rutinas de host que
los llaman, para que hagan un uso razonable de los recursos, por ejemplo
modificando el tamaño de los bloques e hilos en las llamadas dinámicamente, en
lugar de dejar un valor fijo para todas las llamadas.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/1229611820329725966/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/02/entorno-respetuoso-de-ejecucion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/1229611820329725966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/1229611820329725966'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/02/entorno-respetuoso-de-ejecucion.html' title='Entorno respetuoso de ejecución'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiky6T9jH_CgbiYgjm72lNB457kMNn3G6saZHeSSWD8QNgvL6RnpEEKU4Lg3psMip2bben8mb9DV0lpVyDYpJxxgmlsmB7humyYANbe8Nl5W6UERf7ML2stTeQpBZ_ybLOj3zxt1yVbSNA/s72-c/cuda4.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-1728111406358180420</id><published>2012-01-28T10:18:00.000-08:00</published><updated>2012-06-13T11:29:56.195-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bloques por malla"/><category scheme="http://www.blogger.com/atom/ns#" term="factor de ocupación"/><category scheme="http://www.blogger.com/atom/ns#" term="GPGPU"/><category scheme="http://www.blogger.com/atom/ns#" term="Grids"/><category scheme="http://www.blogger.com/atom/ns#" term="hilos por bloque"/><category scheme="http://www.blogger.com/atom/ns#" term="multiprocessor count"/><category scheme="http://www.blogger.com/atom/ns#" term="nivel de paralelización por instrucción"/><category scheme="http://www.blogger.com/atom/ns#" term="SM"/><category scheme="http://www.blogger.com/atom/ns#" term="SP"/><category scheme="http://www.blogger.com/atom/ns#" term="SpeedUp"/><category scheme="http://www.blogger.com/atom/ns#" term="threads"/><category scheme="http://www.blogger.com/atom/ns#" term="unroll factor"/><category scheme="http://www.blogger.com/atom/ns#" term="Warp"/><title type='text'>No es “Speed Up” todo lo que reluce</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Cuando realizamos optimizaciones en nuestro código, debemos ser conscientes de las limitaciones que impone la arquitectura, en muchos casos lo que puede parecer una mejora acaba siendo un cuello de botella.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp;Aunque la técnica de &lt;i&gt;“unroll”
&lt;/i&gt;o desenrollado de bucles descrita en el post anterior parezca la “&lt;i&gt;Panacea&lt;/i&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;”, hay que ser cautelosos,
porque no siempre será así. Es necesario hacer un estudio detallado de cada
caso para aplicar factores de desenrollado apropiados a cada uno de los
algoritmos que se pretenden computar, ya que un desenrollado de bucles
agresivo, puede aumentar demasiado las tareas de planificación (&lt;i&gt;scheduling&lt;/i&gt;)
y aumentar demasiado el uso de registro en el cuerpo del bucle, que en las CPU
puede implicar una migración de los valores de los registros a memoria y esto
puede desembocar en una degradación del rendimiento del programa. Por otro
lado, si se utilizan factores de desenrollado muy altos, el tamaño del cuerpo
del bucle resultante podría desbordar la caché de instrucciones, seguido de
pérdidas de caché, y en consecuencia reduciéndose el rendimiento.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
En programación GPGPU nos
encontramos además con una serie de restricciones que limitan el rendimiento de
los programas. Antes de proceder a la implementación deberemos estudiar el
impacto que supone el desenrollado de bucles para los programas GPGPU en el
contexto de las restricciones de esos recursos y hallar el factor de “unroll”
óptimo para ese programa y dispositivo. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
ILP y Factor de Ocupación (OF):
como ya se ha visto, el nivel de paralelismo por instrucción juega un papel
importante a la hora de aumentar el rendimiento, ya que el tamaño de la caché
de instrucciones “&lt;i&gt;I-cache&lt;/i&gt;” es limitado. Es importante no sobrecargar el
cuerpo de la función con demasiadas instrucciones que provoquen un fallo de
caché y la consiguiente penalización en el rendimiento. &amp;nbsp;Por otro lado en las GPU el factor de
ocupación puede ser igual o más importante que el anterior a la hora de ocultar
las latencias de acceso a memoria y de flujo de instrucciones. Debido a la
interrelación que hay entre ILP y OF, se hace muy complicado estimar los
valores óptimos. A continuación se muestra un caso concreto que sirve de
ejemplo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
En el apartado B de esta sección
se expuso brevemente el modelo de programación de CUDA compuesto por Mallas (&lt;i&gt;Grids&lt;/i&gt;),
Bloques (&lt;i&gt;Blocks&lt;/i&gt;) e Hilos (&lt;i&gt;Threads&lt;/i&gt;), ahora vamos a compararlo con
la arquitectura de las GPUs para comprender mejor el problema del factor de
ocupación. Una GPU está compuesta por &lt;i&gt;x&lt;/i&gt; &lt;b&gt;SM&lt;/b&gt; “stream multiprocessor”,
cada uno dispone de &lt;i&gt;c&lt;/i&gt; &lt;b&gt;SP&lt;/b&gt; “stream processor”, en cada uno hay &lt;i&gt;w&lt;/i&gt;
&lt;b&gt;Warps&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[2]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;,
&lt;/b&gt;que a su vez pueden ejecutar &lt;i&gt;t&lt;/i&gt; &lt;b&gt;Threads. &lt;/b&gt;La clave para
comprender el problema del factor de ocupación reside en la diferencia real que
existe entre la capacidad computacional de la arquitectura que utilicemos y la
capacidad que solicitamos en la llamada al kernel. La Figura 1 muestra las
capacidades para distintos dispositivos con arquitectura CUDA.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableClassic1&quot; style=&quot;border-collapse: collapse; border: none; width: 357px;&quot;&gt;
 &lt;tbody&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-firstrow: yes; mso-yfti-irow: -1;&quot;&gt;
  &lt;td style=&quot;border-bottom: solid black 1.0pt; border-left: none; border-right: solid black 1.0pt; border-top: solid black 1.5pt; height: 12.75pt; mso-border-bottom-alt: solid black .75pt; mso-border-right-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 5; text-indent: 0cm;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Device Name&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.0pt; border-left: none; border-right: none; border-top: solid black 1.5pt; height: 12.75pt; mso-border-bottom-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 1; text-align: center; text-indent: 0cm;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;GeForce GTX 480&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.0pt; border-left: none; border-right: none; border-top: solid black 1.5pt; height: 12.75pt; mso-border-bottom-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 1; text-align: center; text-indent: 0cm;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Tesla C2050&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.0pt; border-left: none; border-right: none; border-top: solid black 1.5pt; height: 12.75pt; mso-border-bottom-alt: solid black .75pt; mso-border-top-alt: solid black 1.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 1; text-align: center; text-indent: .8pt;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;GeForce GTX 295&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 0;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Compute capability&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2.0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2.0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1.3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 1;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Memory Informat.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 2;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Total global mem&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1.536 MB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2.687 MB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;896 MB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 3;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Total constant Mem&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;64 Kb&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;64 Kb&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;64 Kb&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 4;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Max mem pitch&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2048 MB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2048 MB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2048 MB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 5;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;MP Information&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 6;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Multiprocessor count&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;15&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;14&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;30&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 7;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Shared mem per mp&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;48&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;48&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;16&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 8;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Registers per mp&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;32768&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;32768&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;16384&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 9;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Threads in warp&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;32&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;32&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;32&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 10;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Warps/MP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;48&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;48&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;32&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 11;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Blocks/MP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 12;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Max threads/block&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1024&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;1024&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;512&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 13;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Max thread dim&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;text-align: center; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;(1024,1024, 64)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;text-align: center; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;(1024,1024, 64)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;text-align: center; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;(512, 512, 64)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 12.75pt; mso-yfti-irow: 14;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 12.75pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Max grid dim&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;text-align: center; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;(65535, 65535, 65535)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;text-align: center; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;(65535,&amp;nbsp; 65535, 65535)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 12.75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;Text&quot; style=&quot;text-align: center; text-indent: -.75pt;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;(65535, 65535, 1)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 13.5pt; mso-yfti-irow: 15;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 13.5pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Warps/block in SP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 13.5pt; mso-yfti-irow: 16;&quot;&gt;
  &lt;td style=&quot;border-right: solid black 1.0pt; border: none; height: 13.5pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;threads in block&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;192&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;192&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;128&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr style=&quot;height: 13.5pt; mso-yfti-irow: 17; mso-yfti-lastrow: yes;&quot;&gt;
  &lt;td style=&quot;border-bottom: solid black 1.5pt; border-left: none; border-right: solid black 1.0pt; border-top: none; height: 13.5pt; mso-border-bottom-alt: solid black 1.5pt; mso-border-right-alt: solid black .75pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;mso-yfti-cnfc: 4; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;total pararell threads &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.5pt; border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.15pt;&quot; valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2880&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.5pt; border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 61.3pt;&quot; valign=&quot;top&quot; width=&quot;82&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;2688&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border-bottom: solid black 1.5pt; border: none; height: 13.5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 63.8pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;3840&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;MsoCaption&quot; style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Capacidades de
algunos dispositivos&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
De todos los valores de la
tabla ahora mismo nos interesan: “Multiprocessor count”, que es el número de
multiprocesadores que tiene el dispositivo, “&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Blocks/MP&lt;/span&gt;” bloques por multiprocesador, “”&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Warps/MP&lt;/span&gt;” que son agrupaciones de hilos dentro de cada
bloque y “&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;Threads in warp&lt;/span&gt;” que son el
número de hilos que ejecutan en cada warp. Sin tener nada más en cuenta,
podemos calcular el número total de hilos que cada dispositivo es capaz de
ejecutar de forma concurrente: por ejemplo para el dispositivo GeForce GTX 480
tenemos 15 procesadores x 8 bloques x 6 warps x 48 hilos, en total 34.560 hilos
concurrentes ejecutando el mismo kernel. Evidentemente la arquitectura nos está
imponiendo además ciertas restricciones: “Max threads per block” está indicando
un número (1024) mayor al teórico. Si en un bloque hay 6 warps y 32 hilos (192
hilos en total) ¿cómo es posible alcanzar esa cifra? CUDA puede utilizar hasta
8 bloques por procesador, es decir, que si utilizamos 192 hilos por bloque,
dispondremos de 8 bloques por procesador, pero si necesitamos 256 hilos,
dispondremos de 6 bloques, para 512 hilos solo 3 bloques, para 1024 solo un
bloque por procesador. Cuando se solicitan los recursos en las llamadas a los
kernels, CUDA realiza una segmentación y planificación de ejecución de todos
los bloques solicitados, ahí es donde se pueden producir holguras si no hemos
diseñado bien nuestra llamada, reduciéndose el factor de ocupación. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Otra cuestión a considerar, también muy importante es el uso de los
registros que necesita nuestro Kernel, a mayor uso de registros, menor
disponibilidad de bloques por procesador. Estas dos variables son las que van a
modificar el factor de ocupación que, como hemos podido inferir, es el
aprovechamiento físico de la arquitectura para cada tanda de&amp;nbsp;&lt;/span&gt;instrucciones. El primero se
maneja afinando los parámetros de llamada al núcleo y el segundo, mediante la
creación de kernels lo más sencillos que se pueda (sin perder de vista el
tiempo de latencia). Podemos saber el uso de registros que hace nuestro kernel
añadiendo el parámetro&lt;w:sdt citation=&quot;t&quot; id=&quot;641041854&quot;&gt;&amp;nbsp;(31)&lt;/w:sdt&gt; – Xptxas –v en la
línea de compilación.&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;border-collapse: collapse; border: none; margin-left: 5.4pt; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;background: #FBD4B4; border: solid windowtext 1.0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 253.6pt;&quot; valign=&quot;top&quot; width=&quot;338&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 1.7pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;nvcc -Xptxas –v ejemplo.cu
  &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 1.7pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;ptxas info&amp;nbsp;&amp;nbsp; : Compiling entry function &#39;acos_main&#39;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 1.7pt;&quot;&gt;
&lt;span lang=&quot;EN-US&quot; style=&quot;color: #444444;&quot;&gt;ptxas info&amp;nbsp;&amp;nbsp; : Used 4 registers, 60+56 bytes lmem,
  44+40 bytes smem,&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid; text-indent: 1.7pt;&quot;&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;20 bytes cmem[1],&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;12 bytes
  cmem[14]&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;MsoCaption&quot; style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Figura &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;2&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Obteniendo
información de nuestro kernel&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;hr align=&quot;left&quot; size=&quot;1&quot; width=&quot;33%&quot; /&gt;
&lt;div id=&quot;ftn1&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;De panacea universal: Remedio que buscaban los antiguos alquimistas para
curar todas las enfermedades&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;ftn2&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;El término “Warp” puede asimilarse al de “tanda” ya que hace referencia al
conjunto de hilos de un procesador que se ejecutan en el mismo instante por
pertenecer a la misma programación del scheduler.&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/1728111406358180420/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/01/no-es-speed-up-todo-lo-que-reluce.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/1728111406358180420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/1728111406358180420'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/01/no-es-speed-up-todo-lo-que-reluce.html' title='No es “Speed Up” todo lo que reluce'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-5641956111299673089</id><published>2012-01-14T09:59:00.000-08:00</published><updated>2012-06-13T11:30:32.171-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bloques por malla"/><category scheme="http://www.blogger.com/atom/ns#" term="CPU"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="GPGPU"/><category scheme="http://www.blogger.com/atom/ns#" term="GPU"/><category scheme="http://www.blogger.com/atom/ns#" term="Grids"/><category scheme="http://www.blogger.com/atom/ns#" term="hilos por bloque"/><category scheme="http://www.blogger.com/atom/ns#" term="Kernel"/><category scheme="http://www.blogger.com/atom/ns#" term="nivel de paralelización por instrucción"/><category scheme="http://www.blogger.com/atom/ns#" term="threadIdx.x + blockIdx.x * blockDim.x"/><category scheme="http://www.blogger.com/atom/ns#" term="threads"/><category scheme="http://www.blogger.com/atom/ns#" term="unroll factor"/><title type='text'>Unroll y Vencerás</title><content type='html'>Este, es el primero de una serie de 5 post en los cuales quiero presentar las claves básicas para desarrollar kernels CUDA de calidad.&lt;br /&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
Desde hace décadas, uno de los
caballos de batalla en el mundo de los compiladores para CPU es el análisis de
bucles y la reducción de iteraciones&amp;nbsp;con el objetivo de optimizar
el uso de recursos y mejorar los tiempos de ejecución. El resultado suele ser
un bucle de menor número de repeticiones con instrucciones paralelas que son
independientes unas de otras, en muchos casos esta simple acción puede reducir
drásticamente el tiempo de procesamiento. El número de instrucciones
serializadas, dentro del nuevo bucle coincide con el &lt;i&gt;factor de desenrollado
“unroll factor”.&lt;/i&gt; Este valor es clave a la hora de afinar y sintonizar los
mejores valores para la paralelización como veremos más adelante. La Figura 1 muestra un ejemplo sencillo de esta técnica para &lt;i&gt;UF = 4&lt;/i&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;background: #FBD4B4; border: solid windowtext 1.0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;&quot; valign=&quot;top&quot; width=&quot;345&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;/* Antes del desenrollado */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;for (i = 0; i &amp;lt; N; ++i) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;c[i] = a[i] + b[i];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border-bottom: solid windowtext 1.0pt; border: none; mso-border-bottom-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;&quot; valign=&quot;top&quot; width=&quot;345&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;color: #444444;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;background: #FBD4B4; border-top: none; border: solid windowtext 1.0pt; mso-background-themecolor: accent6; mso-background-themetint: 102; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 259.0pt;&quot; valign=&quot;top&quot; width=&quot;345&quot;&gt;&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;/* Despues del desenrollado */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;for (i = 0; i &amp;lt; N - (4 - 1); i += 4) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;c[i] = a[i] + b[i];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;c[i+1] = a[i+1] + b[i+1];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;c[i+2] = a[i+2] + b[i+2];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;c[i+3] = a[i+3] + b[i+3];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;/* Bucle para el resto */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;for (; i &amp;lt; N; ++i) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span lang=&quot;PT&quot; style=&quot;color: #444444; font-size: 8pt; line-height: 105%;&quot;&gt;c[i] = a[i] + b[i];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid; text-indent: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: 8pt; line-height: 105%;&quot;&gt;&lt;span style=&quot;color: #444444;&quot;&gt;}&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;MsoCaption&quot; style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Figura
&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;1&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;. Ejemplo de
&quot;unroll&quot;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
Los beneficios inmediatos de
este proceso son:&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
1. Se reduce el contador de instrucciones dinámicas, se
reducen el número de comparaciones y operaciones ramificadas, para la misma
carga de trabajo.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
2. Aumentan las posibles combinaciones para la planificación,
debido a que surgen más instrucciones independientes, aumentando así el nivel
de paralelización por instrucción (ILP).&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
3. Aumenta la oportunidad para
explotar la herencia de los registros y memoria local cuando los bucles
externos se desenrollan y los internos se fusionan en el mismo juego de
instrucciones iguales para todos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
En las arquitecturas GPGPU
esta técnica también es habitualmente usada, aunque con otro enfoque, la diferencia de
arquitecturas y modelos de programación necesita de una nueva forma de
contemplar el impacto del desenrollado de bucles en el rendimiento en los
programas para GPGPU.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
A diferencia de los
compiladores para CPU, no es tan fácil poder realizar optimizaciones
automáticas de código usando esta técnica, por lo que el programador es el que
deberá diseñar un buen código paralelizado en GPU. El modelo de programación
CUDA y las restricciones de los dispositivos nos dan la guía para realizar la
paralelización de bucles, como no es el objetivo de este post exponer los
pormenores de la arquitectura y su forma de uso, sólo haremos una breve reseña
con objeto de aportar claridad a esta exposición, para ampliar conceptos puede
referirse el lector a las guías que acompañan el &lt;a href=&quot;http://developer.nvidia.com/nvidia-gpu-computing-documentation&quot; target=&quot;_blank&quot;&gt;toolkit de CUDA&lt;/a&gt;.&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW9I0wPDKHQfI7cT9gRQq0RCCS49mcYORX8OwHLbGDlikoJ68u2E61Ljl0Md9uxjI_ofrBj2SDtcWWAuU_ZAv6peHQtAv3eyarBQ-xdD_2WVUaZTtkM3vPAGCfsB-YWCwrK_E-_6owuB0/s1600/unroll.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;185&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW9I0wPDKHQfI7cT9gRQq0RCCS49mcYORX8OwHLbGDlikoJ68u2E61Ljl0Md9uxjI_ofrBj2SDtcWWAuU_ZAv6peHQtAv3eyarBQ-xdD_2WVUaZTtkM3vPAGCfsB-YWCwrK_E-_6owuB0/s320/unroll.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;Básicamente podemos
decir que un &lt;i&gt;Kernel&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[1]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/i&gt;equivale a una iteración del cuerpo de un bucle (en programación
secuencial). La GPU tiene la habilidad de ejecutar de forma paralela el mismo
kernel tantas veces como se defina en su llamada. Cada kernel corre en un hilo,
y existen unas variables locales a cada uno de los kernels, pudiendo así cada
kernel disponer de la información del índice o contador de iteración
equivalente en caso de los bucles secuenciales. Los hilos (&lt;i&gt;Thread&lt;/i&gt;),
están organizados en bloques (&lt;i&gt;Block&lt;/i&gt;), y los bloques en mallas (&lt;i&gt;Grid&lt;/i&gt;).
Los hilos pueden llegar a tener hasta un máximo de 3 dimensiones, y los bloques
y las mallas hasta 2 o 3 dependiendo de la arquitectura. La siguiente línea de
código muestra como un kernel puede obtener su identificador único (utilizando
una dimensión en cada nivel):&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp;tid = threadIdx.x + blockIdx.x * blockDim.x;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;Cómo pueden compartir y acceder a la memoria cada uno de los hilos y su
ámbito se describe en el post &quot;&lt;/span&gt;Los diversos usos de la memoria&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&quot;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&amp;nbsp;El tamaño de la malla a
utilizar y del bloque de hilos, es una elección que se deja al programador en función
del problema a resolver. Esta decisión tendrá impacto en el rendimiento final
del programa, que como veremos a&amp;nbsp;continuación, está ligada al problema y sujeta a
las restricciones que impone la arquitectura GPU y los recursos propios del
dispositivo que se utilice.&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr size=&quot;1&quot; style=&quot;text-align: left;&quot; width=&quot;33%&quot; /&gt;
&lt;div id=&quot;ftn1&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoFootnoteText&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;El Kernel es una porción de código que es invocada desde un proceso en CPU
(host) y se ejecuta en un dispositivo GPU.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/5641956111299673089/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/01/unroll-y-venceras.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/5641956111299673089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/5641956111299673089'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/01/unroll-y-venceras.html' title='Unroll y Vencerás'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW9I0wPDKHQfI7cT9gRQq0RCCS49mcYORX8OwHLbGDlikoJ68u2E61Ljl0Md9uxjI_ofrBj2SDtcWWAuU_ZAv6peHQtAv3eyarBQ-xdD_2WVUaZTtkM3vPAGCfsB-YWCwrK_E-_6owuB0/s72-c/unroll.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-9057467791898334764</id><published>2011-12-30T09:36:00.000-08:00</published><updated>2012-06-13T11:42:10.398-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ATI Stream"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="Khronos group"/><category scheme="http://www.blogger.com/atom/ns#" term="nVidia"/><category scheme="http://www.blogger.com/atom/ns#" term="OPENCL"/><title type='text'>CUDA vs OpenCL. ¿Cual es mejor?</title><content type='html'>A la hora de seleccionar una plataforma u otra, deberemos tener en mente qué es exactamente lo que queremos implementar y qué mejoras deseamos obtener.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlCYFVOlQsx7si2VQ4gXEr2qBzlJg9W1FZeZm52yiMjrY9LkO-sWbFrRSCkEocnSwQ6OTIc7am8mqZP9SnGA2lMeU-SjgIHz9jLsEXXdq_fiCdvwUUj65Otq78qg7jxH1PSDjzS9Bbhrc/s1600/cudaopencl.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlCYFVOlQsx7si2VQ4gXEr2qBzlJg9W1FZeZm52yiMjrY9LkO-sWbFrRSCkEocnSwQ6OTIc7am8mqZP9SnGA2lMeU-SjgIHz9jLsEXXdq_fiCdvwUUj65Otq78qg7jxH1PSDjzS9Bbhrc/s1600/cudaopencl.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Por un lado la disponibilidad de plataformas puede ser el único indicador para realizar la elección: CUDA solo está disponible para la arquitectura de nVidia. Así que, esta cuestión es la más importante.&lt;br /&gt;
&lt;br /&gt;
Si puedes hacer una elección entre ambos, la siguiente cuestión es el objetivo de la paralelización, casi siempre suele ser el incremento del speedUp con respecto a la versión serie, o de CPU, si este es el caso, considera utilizar CUDA ya que es más eficiente tanto a la hora de compilar, obteniendo un código mejorado y optimizado, como a la hora de gestionar en tiempo de ejecución transferencias de&amp;nbsp;memoria, estas dos cuestiones conducen a un comportamiento mejor con respecto a su&amp;nbsp;código&amp;nbsp;homólogo en OpenCL.&lt;br /&gt;
&lt;br /&gt;
Puedes ampliar información a este respecto en este &lt;a href=&quot;http://arxiv.org/ftp/arxiv/papers/1005/1005.2581.pdf&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;paper&lt;/a&gt;,&amp;nbsp;en este otro &lt;a href=&quot;http://www.pds.ewi.tudelft.nl/pubs/papers/icpp2011a.pdf&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;estudio&lt;/a&gt;&amp;nbsp;también&amp;nbsp;se expone la mejora en la utilización de CUDA frente a OpenCL.&lt;br /&gt;
&lt;br /&gt;
Un aspecto a destacar sobre OpenCL es que se trataría de un lenguaje portable, válido para cualquier arquitectura, si has&amp;nbsp;leído&amp;nbsp;los enlaces anteriores te habrás dado cuenta que no es oro todo lo que reluce. Desafortunadamente, es necesario realizar ciertos ajustes en el código cuando deseamos cambiar de plataforma, pero no son muy grandes, esto se debe a la capa de plataforma, que es la parte específica que gestiona el interface con cada arquitectura.&lt;br /&gt;
&lt;br /&gt;
Si aceptas mi consejo, utiliza CUDA para mejorar el rendimiento y aplicaciones para la vida real, y&amp;nbsp;mantén&amp;nbsp;OpenCL cerca de ti, trata de experimentar y portar a este lenguaje tus desarrollos, algún día OpenCL será el estandar, aunque para ese entonces llegarán otros gigantes imponiendo su criterio. El grupo Khronos ya sabe de estos casos: ¿OpenGL?&lt;br /&gt;
&lt;br /&gt;
Si el rendimiento no lo es todo, podrías directamente utilizar OpenCL, sobre todo si no cuentas con plataformas de nVidia, aunque&amp;nbsp;también&amp;nbsp;están disponibles las plataformas específicas de amd: su famoso ATI &lt;a href=&quot;http://developer.amd.com/sdks/AMDAPPSDK/Pages/default.aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Stream o APP SDK&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Espero que esto te ayude a tomar una decisión, cualquier camino que tomes seguro que te conducirá al éxito. &amp;nbsp;Hasta el próximo post.</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/9057467791898334764/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/05/cuda-vs-opencl-cual-es-mejor.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/9057467791898334764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/9057467791898334764'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/05/cuda-vs-opencl-cual-es-mejor.html' title='CUDA vs OpenCL. ¿Cual es mejor?'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlCYFVOlQsx7si2VQ4gXEr2qBzlJg9W1FZeZm52yiMjrY9LkO-sWbFrRSCkEocnSwQ6OTIc7am8mqZP9SnGA2lMeU-SjgIHz9jLsEXXdq_fiCdvwUUj65Otq78qg7jxH1PSDjzS9Bbhrc/s72-c/cudaopencl.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-4125793344076734588</id><published>2011-12-15T13:14:00.001-08:00</published><updated>2012-06-13T11:42:35.694-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="Estado del arte"/><category scheme="http://www.blogger.com/atom/ns#" term="GPGPU"/><category scheme="http://www.blogger.com/atom/ns#" term="GPU"/><category scheme="http://www.blogger.com/atom/ns#" term="nVidia"/><category scheme="http://www.blogger.com/atom/ns#" term="state of the art"/><title type='text'>Estado del Arte III (CUDA)</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CUDA&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;sup&gt;&lt;w:sdt citation=&quot;t&quot; id=&quot;641041681&quot;&gt;&lt;span style=&quot;vertical-align: baseline;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/w:sdt&gt;&lt;/sup&gt;es una arquitectura de cálculo paralelo de nVidia que aprovecha la gran potencia de la GPU (unidad de procesamiento gráfico) para proporcionar un incremento extraordinario del rendimiento del sistema. CUDA ha sido recibida con entusiasmo por la comunidad científica. Por ejemplo, se está utilizando para acelerar AMBER, un simulador de dinámica molecular empleado por más de 60.000 investigadores del ámbito académico y farmacéutico de todo el mundo para acelerar el descubrimiento de nuevos medicamentos. En el mercado financiero, Numerix y CompatibL introdujeron soporte de CUDA para una nueva aplicación de cálculo de riesgo de contraparte y, como resultado, se ha multiplicado por 18 la velocidad de la aplicación.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;CUDA Toolkit&lt;w:sdt citation=&quot;t&quot; id=&quot;641041682&quot;&gt;&amp;nbsp;&lt;/w:sdt&gt;es el conjunto de herramientas y librerías que comprenden el entorno software de la arquitectura. Los componentes básicos son: El compilador C/C++, herramientas para depurar, librerías matemáticas optimizadas para GPU, Primitivas de rendimiento optimizado para GPU, todo ello acompañado de una extensa documentación y abundantes ejemplos. El paquete está disponible para los sistemas operativos más habituales: Windows, Linux y MacOS. Además el desarrollador cuenta con un enorme repertorio de servicios en línea, Webminars, whitepapers y numerosas publicaciones electrónicas y como no, los foros de la comunidad de desarrolladores.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Versiones del toolkit: desde 2006 hasta la fecha han aparecido varias versiones de CUDA que han supuesto un avance en cada una de ellas, la Figura siguiente muestra dicha evolución a lo largo del tiempo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;page-break-after: avoid;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.geeks3d.com/public/jegx/200812/nvidia-cuda-roadmap.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;211&quot; src=&quot;http://www.geeks3d.com/public/jegx/200812/nvidia-cuda-roadmap.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoCaption&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;Evolución de CUDA&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: windowtext; font-size: 7pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;En mayo de 2011 se ha publicado la versión 4.0 del toolkit, el cual supone grandes avances en la facilidad de uso y programación, entre otras destacan las siguientes novedades: Se simplifica la portabilidad de aplicaciones: se pueden compartir múltiples GPUs a través de múltiples hilos, se pueden utilizar todas las GPUs de forma concurrente desde el mismo hilo del host. Reserva de memoria de host más rápida, implementación de las funciones C++ new/delete y soporte para funciones virtuales, soporte para código ensamblador inline PTX, librerías para la gestión de vectores y matrices optimizadas, y más.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;El siguiente post, tratará de argumentar la elección de CUDA como plataforma de desarrollo frente a otras alternativas existentes.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;hr align=&quot;left&quot; size=&quot;1&quot; width=&quot;33%&quot; /&gt;
&lt;div id=&quot;ftn1&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;font-size: x-small;&quot;&gt;son las siglas de Compute Unified Device Architecture&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/4125793344076734588/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/estado-del-arte-iii-cuda.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/4125793344076734588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/4125793344076734588'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/estado-del-arte-iii-cuda.html' title='Estado del Arte III (CUDA)'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-8779118893588138059</id><published>2011-12-10T12:56:00.001-08:00</published><updated>2012-06-13T11:42:50.179-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AMD"/><category scheme="http://www.blogger.com/atom/ns#" term="ATI Stream"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="Estado del arte"/><category scheme="http://www.blogger.com/atom/ns#" term="nVidia"/><category scheme="http://www.blogger.com/atom/ns#" term="OPENCL"/><category scheme="http://www.blogger.com/atom/ns#" term="state of the art"/><title type='text'>Estado del Arte II (Software)</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-indent: 0cm;&quot;&gt;


&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=578470634220317465&amp;amp;postID=8779118893588138059&quot; name=&quot;_Toc311193595&quot;&gt;&lt;/a&gt;A.&lt;span style=&quot;font-size: 7pt; font-weight: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Librerías para GPGPU&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieF-wUFaE3rVRERwlX-mFe1x6kNwX1_u2AZax20_9fkWy6i4at4Xe_oOnSbDF0pulKNvKcsOgxZ5QEh9M0Sy8-xT2RAcSHlYA8eRNKvGZicFD3ul0R9etqrM7ixo9nr02nkxJm7r7FCnM/s1600/ati+stream.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;185&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieF-wUFaE3rVRERwlX-mFe1x6kNwX1_u2AZax20_9fkWy6i4at4Xe_oOnSbDF0pulKNvKcsOgxZ5QEh9M0Sy8-xT2RAcSHlYA8eRNKvGZicFD3ul0R9etqrM7ixo9nr02nkxJm7r7FCnM/s200/ati+stream.jpg&quot; title=&quot;&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Han ido de la mano a la aparición del hardware y la presentación de las nuevas librerías gráficas y SDK para el manejo del nuevo hardware. Por un lado los fabricantes han sacado al mercado soluciones específicas para su arquitectura, por otro lado, nos encontramos con la iniciativa del grupo Khronos para crear un lenguaje común para desarrollo de aplicaciones que exploten las tecnologías GPGPU.&lt;/span&gt;&lt;/div&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Así AMD en 2006 comenzaría con su anuncio de CTM™ (&quot;Close To Metal&quot;). Se trata de un SDK para uso de su arquitectura FireStream recién estrenada por esa misma época. Esta interfaz proporciona a los desarrolladores un completo acceso al conjunto de instrucciones nativas y la memoria de los elementos de cálculo masivamente paralelos de las GPUs de AMD. Con CTM, las GPUs se convierten en poderosas arquitecturas abiertas programables, como las CPUs de hoy. Al liberar la arquitectura, CTM ofrece a los desarrolladores de hardware, un acceso de bajo nivel, determinista y repetible necesario para desarrollar las herramientas esenciales como compiladores, depuradores, bibliotecas de matemáticas y plataformas de aplicaciones.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;En diciembre de 2007 y como continuación con su compromiso con un entorno completo de desarrollo de software que libere el sorprendente poder informático de las GPUs de AMD, AMD presentó ATI Stream SDK. Con ATI Stream SDK, AMD añadió un nuevo lenguaje de alto nivel, denominado ATI Brook+. CTM evolucionó a ATI CAL (nivel de abstracción de cálculo), el nivel de API compatible con Brook+. La aparición de Brook+ significó que AMD fue capaz de ofrecer una completa pila de desarrollo completamente gratis para el desarrollo de ATI Stream.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVjPPLWryuH1eO-v3HAONqFCaayY4zH_FgGKIC8ucpbj2f3LoytjhJcaP6Xj9V5_NlzkTQq7j1_vHjcsF1dutKET3nVtFmUNE8esCx4BUXEuE8zaHrKBudvikzxut7mm8gxQIz2zemyb4/s1600/opencl.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVjPPLWryuH1eO-v3HAONqFCaayY4zH_FgGKIC8ucpbj2f3LoytjhJcaP6Xj9V5_NlzkTQq7j1_vHjcsF1dutKET3nVtFmUNE8esCx4BUXEuE8zaHrKBudvikzxut7mm8gxQIz2zemyb4/s1600/opencl.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;En junio de 2008, AMD y varios líderes del sector de GPGPUs, así como otras tecnologías de aceleradores, formaron el grupo de trabajo OpenCL bajo la denominación The Khronos Group. Khronos es artífice de otras especificaciones bien conocidas como OpenGL, y realizó la apuesta adecuada al enfocarse en la especificación OpenCL.&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;El 9 de diciembre de 2008 The Khronos Group anunció la puesta en el mercado de la especificación OpenCL 1.0. Mientras tanto, AMD también integró bibliotecas de rutinas para CAL en la suite del controlador ATI Catalyst, liberando las capacidades de aceleración de ATI Stream ya incorporadas&amp;nbsp;en millones de tarjetas gráficas ATI Radeon. A principios de 2009, inmediatamente después de la presentación de la especificación OpenCL 1.0, AMD anunció su intención de adoptar rápidamente el estándar de programación OpenCL 1.0 e integrar un compilador y rutinas compatibles en su ATI Stream SDK.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUzms6E7uEzBpNJhEtxV5tRwZpPbdQmxhtYqnOaZ7wQIb_7XtibrRjqEV-VOkzSdRamp8wvq-HbNJGuTNLSAgqJgPMnrOd3DscC37Hwrr5teb0Jw9Sl9Huoly5nOewnH6BAbue3mUMSPs/s1600/cuda.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;104&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUzms6E7uEzBpNJhEtxV5tRwZpPbdQmxhtYqnOaZ7wQIb_7XtibrRjqEV-VOkzSdRamp8wvq-HbNJGuTNLSAgqJgPMnrOd3DscC37Hwrr5teb0Jw9Sl9Huoly5nOewnH6BAbue3mUMSPs/s200/cuda.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;nVidia desde la presentación en 2006 de la GeForce 8800 GTX comenzó la senda de CUDA, que se propone de un entorno software de librerías especializadas para extraer el máximo rendimiento al hardware. Evidentemente este entorno implica una dependencia del fabricante para obtener nuevas características y prestaciones, se discutirá todo esto y más en el siguiente post.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Una iniciativa que recientemente ha terminado&amp;nbsp; su andadura es Sh o Libsh&lt;w:sdt citation=&quot;t&quot; id=&quot;641041679&quot;&gt;&amp;nbsp;&lt;/w:sdt&gt;, se trata de un lenguaje de alto nivel para programación en GPU, con una sintaxis similar a C++, es el resultado de la investigación del laboratorio de gráficos por ordenador de la universidad de Waterloo. Concretamente el lenguaje fue concebido por Michael McCool e implementado por varios miembros del laboratorio.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;En el próximo post hablaremos más detalladamente de la evolución de CUDA, hasta entonces!&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/8779118893588138059/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/estado-del-arte-ii-software.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8779118893588138059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8779118893588138059'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/estado-del-arte-ii-software.html' title='Estado del Arte II (Software)'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieF-wUFaE3rVRERwlX-mFe1x6kNwX1_u2AZax20_9fkWy6i4at4Xe_oOnSbDF0pulKNvKcsOgxZ5QEh9M0Sy8-xT2RAcSHlYA8eRNKvGZicFD3ul0R9etqrM7ixo9nr02nkxJm7r7FCnM/s72-c/ati+stream.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-8896639269930186937</id><published>2011-12-08T12:40:00.006-08:00</published><updated>2012-06-13T11:43:09.090-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AMD"/><category scheme="http://www.blogger.com/atom/ns#" term="Close to Metal"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="Estado del arte"/><category scheme="http://www.blogger.com/atom/ns#" term="GeForce"/><category scheme="http://www.blogger.com/atom/ns#" term="Hardware"/><category scheme="http://www.blogger.com/atom/ns#" term="IBM"/><category scheme="http://www.blogger.com/atom/ns#" term="Intel"/><category scheme="http://www.blogger.com/atom/ns#" term="nVidia"/><category scheme="http://www.blogger.com/atom/ns#" term="state of the art"/><title type='text'>Estado del Arte I (Hardware)</title><content type='html'>&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Hoy trataré de hacer una panorámica sobre el estado del arte en paralelización GPGPU tanto en software como en hardware.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Actualmente los fabricantes de tarjetas graficas producen para o están agrupados en 4 rúbricas: AMD&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/ATI, nVidia, Intel e IBM. Estos cuatro gigantes dominan en la actualidad el mercado de las GPGPUs&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; cada uno de ellos propone su propia arquitectura que va normalmente acompañada de soluciones software especificas para explotar al máximo las capacidades concretas de cada una. Los dos primeros con tendencia a desarrollar dispositivos GPU puros, mientras que los dos segundos se decantan por soluciones hibridas CPU+GPU, solo el futuro revelará cual ha sido la mejor estrategia. &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; text-align: justify; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;1.&lt;span style=&quot;font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;AMD: &lt;/b&gt;En noviembre de 2006, AMD revolucionó las GPGPU con la presentación de CTM™ (&quot;Close To Metal&quot;), AMD anunció también la primera generación de AMD FireStream&amp;nbsp;como la primera solución de procesamiento a través de hardware comercialmente disponible. Se trataba de un procesador basado en PCI Express con 1 GB de memory GDDR3 para computación con características de procesamiento de alto rendimiento optimizado. En 2007, AMD presentó también su solución de procesamiento de segunda generación, la AMD FireStream 9170. FireStream 9170&amp;nbsp;revolucionó la industria de GPGPU al ser la primera solución de procesamiento que ofreció compatibilidad de puntos flotantes en hardware.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; text-align: justify; text-indent: -18pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr3SeoqwRcvKgAqCLPvLVwRE57KTDKtRiGcSgSgMTns0UgZ3Uw5KT_A42g_fEf13lRxWyvBsacs-As3bH_oCWx54nMcGRZ1dWmxclhcR02SfddRbgTqeRss9k3bm5bZNHiRpbxTfSvipQ/s1600/AMD-firestream9170.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr3SeoqwRcvKgAqCLPvLVwRE57KTDKtRiGcSgSgMTns0UgZ3Uw5KT_A42g_fEf13lRxWyvBsacs-As3bH_oCWx54nMcGRZ1dWmxclhcR02SfddRbgTqeRss9k3bm5bZNHiRpbxTfSvipQ/s1600/AMD-firestream9170.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;text-indent: -18pt;&quot;&gt;Esta GPU alcanza más de 5 GFLOPS/W en precisión normal, y 1 GFLOPS/W en operaciones con doble precisión, 2 GB de memoria GDDR3, 320 núcleos. En agosto de 2008, AMD presentó el primer producto de su línea de soluciones de procesamiento de tercera generación, la AMD FireStream 9250&lt;/span&gt;&lt;span style=&quot;text-indent: -18pt;&quot;&gt;. FireStream 9250 fue la primera solución de procesamiento que rompió la barrera de 1 TFLOPS y además, lo hizo en el espacio de una única ranura PCI-Express. Las soluciones de otros proveedores logran menos rendimiento a un mayor consumo y en mayores tamaños.&amp;nbsp;&lt;/span&gt;&lt;o:p style=&quot;text-indent: -18pt;&quot;&gt;&lt;/o:p&gt;&lt;span style=&quot;text-indent: -18pt;&quot;&gt;En el primer trimestre de 2009, AMD anunció AMD FireStream 9270&lt;/span&gt;&lt;span style=&quot;text-indent: -18pt;&quot;&gt;, que satisface las necesidades de los usuarios de alto rendimiento. FireStream 9270 proporciona 1,2 TFLOPS de increíble rendimiento a un consumo típico de 160 W. Destacan sus 800 núcleos de procesamiento, 2 GB de GDDR5, un ancho de banda de memoria de 108,8 GB/s, con un consumo medio de 160 watios.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;2.&lt;span style=&quot;font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;nVidia&lt;/b&gt;.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGRwCmd97DQghyphenhyphenKB05hN3OQoAhGcx2wfKx-uCPK0TaROLAu-cmuUsLLBNHS86lX8t3UeY5kovLVTU2izGzf21nxgvMtSyVxIGhaHYmf8V63s19CKnjDf56qSxZiU26ECjN7yvKXQ9uAng/s1600/nvidia-geforce8800-GTX.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGRwCmd97DQghyphenhyphenKB05hN3OQoAhGcx2wfKx-uCPK0TaROLAu-cmuUsLLBNHS86lX8t3UeY5kovLVTU2izGzf21nxgvMtSyVxIGhaHYmf8V63s19CKnjDf56qSxZiU26ECjN7yvKXQ9uAng/s1600/nvidia-geforce8800-GTX.png&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;En noviembre de 2006, nVidia presentó al mercado&amp;nbsp; la GPU GeForce 8800 GTX&amp;nbsp;con soporte para DirectX 10, supone la adopción de una nueva arquitectura basada en el procesador. Dotada de 138 procesadores y 768MB de memoria de video con un ancho de banda de memoria de 86.4 GB/s.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;text-align: justify; text-indent: 10.2pt;&quot;&gt;Esta nueva arquitectura vendría acompañada de la presentación de CUDA®.&lt;/span&gt;&lt;w:sdt citation=&quot;t&quot; id=&quot;641041658&quot; style=&quot;text-align: justify; text-indent: 10.2pt;&quot;&gt;&amp;nbsp;&lt;/w:sdt&gt;&lt;span style=&quot;text-align: justify; text-indent: 10.2pt;&quot;&gt;&amp;nbsp;A partir de este momento, nVidia trabajará duro para obtener GPU’s para computación de propósito general, la Figura siguiente, muestra la evolución de sus GPGPU y la proyección futura de la compañía.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.brightsideofnews.com/Data/2010_9_22/nVidia-CEO-Talks-Parallel-and-Shows-Roadmap-at-GTC/NVDA_CUDA%20GPU%20Roadmap_615w.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;http://www.brightsideofnews.com/Data/2010_9_22/nVidia-CEO-Talks-Parallel-and-Shows-Roadmap-at-GTC/NVDA_CUDA%20GPU%20Roadmap_615w.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Evolución de la arquitectura de nVidida&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;text-align: justify; text-indent: 10.2pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 10.2pt;&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;La gama Tesla aparece en 2007, la familia de productos Tesla se ha diseñado para el cálculo paralelo y ofrece funciones de computación exclusivas:&lt;br /&gt;
Rendimiento en operaciones de coma flotante de doble precisión: 515 GigaFlops en productos Tesla C2050, M2050 y S2070, Comunicación PCIe más rápida: con dos motores DMA para comunicación PCIe bidireccional. Mayor rendimiento en aplicaciones técnicas con grandes volúmenes de datos: mayor memoria en placa (3 GB y 6 GB).&lt;br /&gt;
&lt;br /&gt;
En 2009 aparece la tecnología Fermi que convertirá el coprocesamiento distribuido entre la GPU y la CPU en algo generalizado porque es capaz de manejar todo tipo de aplicaciones de cálculo en cualquier ámbito de la ciencia o la industria. Fermi incorpora algunas innovaciones importantes: 512 núcleos CUDA, Tecnología Parallel DataCache™ de NVIDIA, Motor GigaThread™ 3.0 de NVIDIA, Soporte completo de ECC.&lt;br /&gt;
&lt;br /&gt;
Se prevé que para finales de 2011 o primeros de 2012, estén disponibles las primeras GPU con tecnología Kepler. Kepler es el sobrenombre utilizado por nVidia para referirse a su núcleo gráfico de nueva generación y, al igual que las GPUs Southern Islands de AMD, estas soluciones serán fabricadas utilizando el nodo de producción 28nm. nVidia prometió que la GPU Kepler y su sucesora, Maxwell, incluirían espacio de memoria virtual y soporte preferente, además de una serie de tecnologías que mejorarán la capacidad de la GPU de procesar datos sin la ayuda del procesador del sistema. Para un horizonte algo más lejano 2013-2014, la compañía tiene previsto lanzar la primera arquitectura basada en 22/20nm, su nombre en clave es &quot;Maxwell&quot;.&lt;br /&gt;
&lt;br /&gt;
En respuesta a la tendencia de la competencia en el diseño de soluciones para computación de altas prestaciones basadas en CPU+GPU, se manejan proyectos que pretender sacar al mercado en 2013 – 2015 sus nombres en clave son “Denver” y “Echelon”.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;h4&gt;

&lt;b&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;3.&lt;span style=&quot;font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;Intel&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Larrabee&amp;nbsp;es el nombre en código para un chip GPGPU que Intel está desarrollando separadamente de su actual línea de aceleradores de gráficos integrados. El chip iba a ser lanzado en 2010 como el núcleo de una tarjeta gráfica 3D para los consumidores, pero estos planes fueron cancelados debido a los retrasos y las primeras decepcionantes cifras de rendimiento. Larrabee ahora será lanzado como una plataforma para la investigación y el desarrollo de los gráficos por ordenador y HPC. Una versión futura de Larrabee eventualmente podría llegar a integrarse en una tarjeta de gráficos de consumo, pero Intel no ha discutido los planes específicos.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;margin-left: 28.1pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;b&gt;4.&lt;span style=&quot;font-size: 7pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span dir=&quot;LTR&quot;&gt;&lt;/span&gt;IBM&lt;/b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;Text&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Con el nombre de Proyecto Cell&lt;w:sdt citation=&quot;t&quot; id=&quot;641041678&quot;&gt;&amp;nbsp;&lt;/w:sdt&gt;, junto a Sony y Toshiba, el gigante azul lanzó una tecnología híbrida para ofrecer Computación de Alto Rendimiento a la industria y la investigación. Con mayor o menor fortuna esta arquitectura no está liderando actualmente las tendencias, y la propia firma está montado soluciones de nVidia para sus servidores de altas prestaciones.&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;En el próximo post, analizaremos la situación actual del software para GPGPU.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;hr align=&quot;left&quot; size=&quot;1&quot; width=&quot;33%&quot; /&gt;
&lt;div id=&quot;ftn1&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; Advanced Micro Devices, Inc.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;ftn2&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[2]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; General Porpouse Graphics Processor Unit&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/8896639269930186937/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/estado-del-arte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8896639269930186937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/8896639269930186937'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/estado-del-arte.html' title='Estado del Arte I (Hardware)'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr3SeoqwRcvKgAqCLPvLVwRE57KTDKtRiGcSgSgMTns0UgZ3Uw5KT_A42g_fEf13lRxWyvBsacs-As3bH_oCWx54nMcGRZ1dWmxclhcR02SfddRbgTqeRss9k3bm5bZNHiRpbxTfSvipQ/s72-c/AMD-firestream9170.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-578470634220317465.post-323642561720096625</id><published>2011-12-01T12:11:00.000-08:00</published><updated>2012-06-13T11:43:25.874-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CPU"/><category scheme="http://www.blogger.com/atom/ns#" term="CUDA"/><category scheme="http://www.blogger.com/atom/ns#" term="GPGPU"/><category scheme="http://www.blogger.com/atom/ns#" term="GPU"/><category scheme="http://www.blogger.com/atom/ns#" term="Procesador gráfico"/><title type='text'>Bienvenidos a desarrollo CUDA</title><content type='html'>Bienvenidos!&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Con este blog quiero compartir mi experiencia paralelizando algoritmos mediante el uso de GPU&#39;s. Trataré de presentar aportes cortos que permitan obtener soluciones concretas.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&amp;nbsp;&lt;span style=&quot;font-size: x-large;&quot;&gt;L&lt;/span&gt;a&amp;nbsp;&lt;span style=&quot;font-variant: small-caps; text-indent: 0cm;&quot;&gt;computación&lt;/span&gt;&lt;span style=&quot;text-indent: 0cm;&quot;&gt; sobre Unidades de Procesamiento Gráfico (GPU), es sin lugar a dudas, uno de los avances tecnológicos más importantes de los últimos años, que aporta un nuevo paradigma en el campo de la computación en paralelo y la computación de altas prestaciones. Este tipo de hardware (GPU), inicialmente diseñado para representar imágenes en el ordenador, tiene unas características peculiares que ofrecen una capacidad de cómputo inusitada. A diferencia de los actuales procesadores centrales (CPU) en los cuales podemos encontrar configuraciones de unos cuantos procesadores con 2, 4 u 8 núcleos de proceso, las GPU ofrecen configuraciones de &lt;/span&gt;&lt;span style=&quot;text-indent: 0cm;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-indent: 0cm;&quot;&gt;hasta 30 procesadores con hasta 8 núcleos de procesamientos cada uno, permitiendo ejecutar hasta 1536 hilos cada procesador.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 0cm;&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 7.1pt;&quot;&gt;
Este potencial inicialmente era explotado por librerías gráficas de renderizado y trazadores de rayos para obtener imágenes realistas aplicando geometría computacional. El objetivo fundamental era obtener ciertos los valores para cada punto (en el plano o en el espacio para sistemas tridimensionales) como son: visible o no visible, color y profundidad de color. Así, con objeto de producir imágenes en movimiento se diseñaron sistemas que permitiesen realizar el cálculo de esos valores para cada punto de forma paralela y obtener el resultado de la imagen en tiempos tales que permitan la producción de una ilusión óptica de movimiento al presentar imágenes con una frecuencia mínima de 24 imágenes por segundo. Se trataba de poder calcular todos los valores de la matriz de puntos que forman la imagen en paralelo y de forma independiente del procesador central el cual estaría realizando otro tipo de tareas. Este conjunto de técnicas fueron denominados como Aceleración Gráfica por Hardware. Para poder explotar estas capacidades del nuevo hardware, deberá haber asociado a éste, un controlador que permita un repertorio específico de instrucciones, que serán llamadas utilizando un determinado API&lt;span style=&quot;font-size: 11px;&quot;&gt;[1]&lt;/span&gt;&lt;span style=&quot;text-indent: 7.1pt;&quot;&gt;. Términos tales como OpenGL® o DitectX® empezaron a sonar como librerías gráficas que eran capaces de explotar las nuevas capacidades de las GPUs.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-indent: 7.1pt;&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 7.1pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 7.1pt;&quot;&gt;
Con el paso del tiempo cada vez fueron mayores las prestaciones de estas GPUs, aumentando tanto la capacidad de memoria como de los procesadores. Esto permitió aumentar el tipo de operaciones a realizar en dichos dispositivos de modo que además de poder realizar operaciones de dibujo, también se empezaron a realizar operaciones de codificación y decodificación, lo que permitió liberar a los procesadores centrales de tales tareas.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;Text&quot; style=&quot;text-align: justify; text-indent: 7.1pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;El empleo de procesadores gráficos para la resolución de problemas, comienza en el mundo académico en un principio&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif;&quot;&gt;dando forma gráfica al problema a solucionar, ya que las primitivas y repertorio de instrucciones con el que se contaba eran muy básicos y demasiado orientados al mundo de los gráficos. Actualmente se ha conseguido evolucionar estas librerías para proporcionar soporte a sistemas de desarrollo de propósito general que permiten aplicar con gran éxito la computación sobre GPU a cualquier tipo de problema sea o no de tipo gráfico.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr align=&quot;left&quot; size=&quot;1&quot; width=&quot;33%&quot; /&gt;
&lt;div id=&quot;ftn1&quot;&gt;
&lt;div class=&quot;MsoFootnoteText&quot;&gt;
&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span class=&quot;MsoFootnoteReference&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size: 8pt;&quot;&gt;[1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; Application Programming Interface&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://desarrollocuda.blogspot.com/feeds/323642561720096625/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/bienvenidos-desarrollo-cuda.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/323642561720096625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/578470634220317465/posts/default/323642561720096625'/><link rel='alternate' type='text/html' href='http://desarrollocuda.blogspot.com/2012/04/bienvenidos-desarrollo-cuda.html' title='Bienvenidos a desarrollo CUDA'/><author><name>Chema García</name><uri>http://www.blogger.com/profile/10228929437360717683</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeEfzy4-GPlqDHhRDXl9m3CtO30UeuyPDATGeFfuMrBLL4U8PjinEcnhjDjqDnMnqRUSga6IkUQjB7BSDuoOTZ3yadSTYsBQSCH-GvrrtSu0BURGK67s9lqY5jtiNGcbsrve9v0mnlMLSf0acpOf3WN2yYVfHzHe3p-yK12GVjDEAYGA/s1600/chema%20pic.jpg'/></author><thr:total>0</thr:total></entry></feed>