<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>2227-1899</journal-id>
<journal-title><![CDATA[Revista Cubana de Ciencias Informáticas]]></journal-title>
<abbrev-journal-title><![CDATA[Rev cuba cienc informat]]></abbrev-journal-title>
<issn>2227-1899</issn>
<publisher>
<publisher-name><![CDATA[Editorial Ediciones Futuro]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S2227-18992013000400008</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Adaptación para múltiples GPU de un simulador de actividad eléctrica en el corazón]]></article-title>
<article-title xml:lang="en"><![CDATA[Multi-GPU adaptation of a simulator of heart electric activity]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[García]]></surname>
<given-names><![CDATA[Víctor M]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Vidal]]></surname>
<given-names><![CDATA[Antonio M]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Liberos]]></surname>
<given-names><![CDATA[Alejandro]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Climent]]></surname>
<given-names><![CDATA[Andreu M]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Universitat Politècnica de València Departamento de Sistemas Informáticos y Computación ]]></institution>
<addr-line><![CDATA[Valencia ]]></addr-line>
<country>Spain</country>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>12</month>
<year>2013</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>12</month>
<year>2013</year>
</pub-date>
<volume>7</volume>
<numero>4</numero>
<fpage>100</fpage>
<lpage>111</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_arttext&amp;pid=S2227-18992013000400008&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_abstract&amp;pid=S2227-18992013000400008&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_pdf&amp;pid=S2227-18992013000400008&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[La simulación de la actividad eléctrica del corazón se calcula mediante la resolución de un gran sistema de ecuaciones diferenciales ordinarias, que necesita una enorme cantidad de tiempo de computación. Sin embargo, en los últimos años se están introduciendo, en el ámbito de la computación de alto rendimiento, las unidades de procesamiento gráfico (GPU). Estos potentes dispositivos han atraído a grupos de investigación que requieren simular la actividad eléctrica del corazón. El grupo de investigación que firma este artículo ha desarrollado un simulador de actividad eléctrica cardíaca que se ejecuta en una sola GPU. En este artículo se describe la adaptación y modificaciones de dicho simulador para su ejecución en múltiples GPU. Los resultados confirman que la técnica empleada permite reducir sensiblemente los tiempos de ejecución respecto a los que se obtienen con una sola GPU, además de permitir afrontar problemas mucho más grandes.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[The simulation of the electrical activity of the heart is calculated by solving a large system of ordinary differential equations; this takes an enormous amount of computation time. In recent years graphics processing unit (GPU) are being introduced in the field of high performance computing. These powerful computing devices have attracted research groups requiring simulate the electrical activity of the heart. The research group signing this paper has developed a simulator of cardiac electrical activity that runs on a single GPU. This article describes the adaptation and modification of the simulator to run on multiple GPU. The results confirm that the technique significantly reduces the execution time compared to those obtained with a single GPU, and allows the solution of larger problems.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[Ecuaciones diferenciales ordinarias]]></kwd>
<kwd lng="es"><![CDATA[programación GPU]]></kwd>
<kwd lng="es"><![CDATA[simulación electrocardíaca]]></kwd>
<kwd lng="en"><![CDATA[Electrocardiac simulation]]></kwd>
<kwd lng="en"><![CDATA[GPU programming]]></kwd>
<kwd lng="en"><![CDATA[ordinary differential equations]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><B>ART&Iacute;CULO    ORIGINAL </B></font></p>     <p>&nbsp;</p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="4"> <b>Adaptaci&oacute;n    para m&uacute;ltiples GPU de un simulador de actividad el&eacute;ctrica en el    coraz&oacute;n</b></font></p>     <p>&nbsp;</p>     <P><font face="Verdana, Arial, Helvetica, sans-serif"><b><font size="3">Multi-GPU    adaptation of a simulator of heart electric activity</font></b> </font>      <p>&nbsp;</p>     <p>&nbsp;</p>     <P><font face="Verdana, Arial, Helvetica, sans-serif"><b><font size="2"> V&iacute;ctor    M. Garc&iacute;a*, Antonio M. Vidal, Alejandro Liberos, Andreu M. Climent</font></b></font>      <P><font face="Verdana, Arial, Helvetica, sans-serif"><font size="2">Departamento    de Sistemas Inform&aacute;ticos y Computaci&oacute;n. Universitat Polit&egrave;cnica  de Val&egrave;ncia, Camino de Vera, s/n 46022, Valencia, Spain</font></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">.</font>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><span style="font-size:10.0pt;font-family:Verdana">* Autor para la correspondencia: </span></b><span style="font-size:10.0pt;font-family:Verdana"><a href="mailto:vmgarcia@dsic.upv.es">vmgarcia@dsic.upv.es</a></span>    ]]></body>
<body><![CDATA[<br>   </font>     <P>&nbsp;      <P>&nbsp;</p> <hr>     <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><B>RESUMEN</B></font>      <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2"> La simulaci&oacute;n    de la actividad el&eacute;ctrica del coraz&oacute;n se calcula mediante la resoluci&oacute;n    de un gran sistema de ecuaciones diferenciales ordinarias, que necesita una    enorme cantidad de tiempo de computaci&oacute;n. Sin embargo, en los &uacute;ltimos    a&ntilde;os se est&aacute;n introduciendo, en el &aacute;mbito de la computaci&oacute;n    de alto rendimiento, las unidades de procesamiento gr&aacute;fico (GPU). Estos    potentes dispositivos han atra&iacute;do a grupos de investigaci&oacute;n que    requieren simular la actividad el&eacute;ctrica del coraz&oacute;n. El grupo    de investigaci&oacute;n que firma este art&iacute;culo ha desarrollado un simulador    de actividad el&eacute;ctrica card&iacute;aca que se ejecuta en una sola GPU.    En este art&iacute;culo se describe la adaptaci&oacute;n y modificaciones de    dicho simulador para su ejecuci&oacute;n en m&uacute;ltiples GPU. Los resultados    confirman que la t&eacute;cnica empleada permite reducir sensiblemente los tiempos    de ejecuci&oacute;n respecto a los que se obtienen con una sola GPU, adem&aacute;s    de permitir afrontar problemas mucho m&aacute;s grandes.</font>      <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><B>Palabras clave:    </B> Ecuaciones diferenciales ordinarias, programaci&oacute;n GPU, simulaci&oacute;n    electrocard&iacute;aca</font><font face="Verdana, Arial, Helvetica, sans-serif">.    </font>  <hr> <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><B>ABSTRACT</b></font>      <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2"> The simulation    of the electrical activity of the heart is calculated by solving a large system    of ordinary differential equations; this takes an enormous amount of computation    time. In recent years graphics processing unit (GPU) are being introduced in    the field of high performance computing. These powerful computing devices have    attracted research groups requiring simulate the electrical activity of the    heart. The research group signing this paper has developed a simulator of cardiac    electrical activity that runs on a single GPU. This article describes the adaptation    and modification of the simulator to run on multiple GPU. The results confirm    that the technique significantly reduces the execution time compared to those    obtained with a single GPU, and allows the solution of larger problems.</font>      <P> <font size="2" face="Verdana, Arial, Helvetica, sans-serif"><B>Key words:    </B> Electrocardiac simulation, GPU programming, ordinary differential equations.</font>  <hr>     <p>&nbsp;</p>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><b>INTRODUCCI&Oacute;N</b></font>  </p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Simular la actividad    el&eacute;ctrica de las c&eacute;lulas card&iacute;acas es de crucial importancia    para una correcta simulaci&oacute;n global del coraz&oacute;n (Almendral, 2006;    Reumann, 2007). La actividad el&eacute;ctrica del coraz&oacute;n se obtiene    de la resoluci&oacute;n de un sistema de ecuaciones diferenciales ordinarias    (EDOs) de valores iniciales. Cada c&eacute;lula se modela con 15-40 ecuaciones    diferenciales. Una simulaci&oacute;n 3D precisa puede requerir miles o incluso    millones de c&eacute;lulas, por lo que la potencia de c&aacute;lculo requerida    es enorme. Es por ello que la simulaci&oacute;n de unos segundos de la actividad    card&iacute;aca puede requerir de horas o incluso d&iacute;as de computaci&oacute;n.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Una posibilidad    a la hora de acortar estos tiempos de simulaci&oacute;n consiste en llevar a    cabo los c&aacute;lculos sobre unidades de procesamiento gr&aacute;fico (GPU).    Estos dispositivos se suelen encargar de la interfaz gr&aacute;fica de usuario    y actualmente cuentan con una potencia de c&aacute;lculo superior a una CPU    (unidad central de procesos) est&aacute;ndar. La GPGPU es una nueva generaci&oacute;n    de GPU conocida como de prop&oacute;sito general que ha sido dise&ntilde;ada    espec&iacute;ficamente para c&oacute;mputos de alto rendimiento. El principal    inconveniente para el uso de estos dispositivos es que su programaci&oacute;n    para tareas generales es bastante compleja. Este problema se ha aliviado en    cierta medida con la arquitectura CUDA desarrollada por NVIDIA.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los firmantes de    este art&iacute;culo han desarrollado un simulador basado en CUDA para la actividad    el&eacute;ctrica card&iacute;aca (Garc&iacute;a, 2011). En este art&iacute;culo    se describen las t&eacute;cnicas espec&iacute;ficas que se han utilizado para    extender el simulador de forma que pueda ejecutarse en varias GPUs simult&aacute;neamente.    Una ventaja evidente de utilizar varias GPUs es que se dispone de mucha m&aacute;s    memoria y, por lo tanto, se pueden afrontar problemas con muchas m&aacute;s    c&eacute;lulas. Por otro lado, mediante el uso de m&uacute;ltiples GPUs se pretende    tambi&eacute;n disminuir el tiempo total de c&oacute;mputo.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El resto del art&iacute;culo    est&aacute; organizado de la siguiente forma: en primer lugar describiremos    el problema afrontado y las t&eacute;cnicas b&aacute;sicas para la versi&oacute;n    inicial del simulador. Despu&eacute;s describiremos las t&eacute;cnicas espec&iacute;ficas    para la versi&oacute;n multigpu y la reordenaci&oacute;n necesaria de las c&eacute;lulas    del modelo, realizada para minimizar las comunicaciones entre las diferentes    GPUs.    <br>   Por &uacute;ltimo daremos algunos resultados.</font> </p>     <p>&nbsp;</p>     <P><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><b>METODOLOG&Iacute;A    COMPUTACIONAL </b></font>      <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Modelo card&iacute;aco    y m&eacute;todos computacionales</b></font>     <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Modelo matem&aacute;tico    card&iacute;aco</b></font>     ]]></body>
<body><![CDATA[<p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El trabajo realizado    se ha basado en el modelo de potencial de membrana auricular de Courtemanche    (1998). Este modelo se basa en experimentos sobre c&eacute;lulas auriculares    humanas. Se han realizado experimentos con diferentes tipos de estructuras;    algunas sencillas, (1 y 2-dimensionales) con el objetivo de ayudar al desarrollo    y comprobaci&oacute;n del software, y otras m&aacute;s complejas, tridimensionales,    para realizar simulaciones realistas. Las c&eacute;lulas vecinas se acoplaron    con una conductancia g, que se ha fijado a un valor constante ajustado para    obtener una velocidad de propagaci&oacute;n realista.</font></p>     <p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El    tejido card&iacute;aco se model&oacute; utilizando la siguiente ecuaci&oacute;n    diferencial ordinaria:</font></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><img src="img/revistas/rcci/v7n4/fo0108413.png" width="222" height="28" align="middle">    (1)</font></p>     <p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">siendo    <img src="img/revistas/rcci/v7n4/fo0208413.png" width="12" height="23"> el potencial transmembrana    de la c&eacute;lula i-&eacute;sima, I<sub>total</sub> el resultado neto de la    contribuci&oacute;n de todas las corrientes transmembrana descritas por el modelo    matem&aacute;tico celular, <img src="img/revistas/rcci/v7n4/fo0308413.png" width="19" height="23">    la capacidad transmembrana, y <img src="img/revistas/rcci/v7n4/fo0408413.png" width="21" height="23">    la conductancia entre las c&eacute;lulas <img src="img/revistas/rcci/v7n4/fo0508413.png" width="5" height="23">    y <img src="img/revistas/rcci/v7n4/fo0608413.png" width="6" height="23">. </font></p>     <p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El    modelo de Courtemanche utiliza como variable principal el potencial transmembrana    <img src="img/revistas/rcci/v7n4/fo0708413.png" width="13" height="23">y como ecuaci&oacute;n    principal la ecuaci&oacute;n (1). Sin embargo, dicho modelo comprende tambi&eacute;n    otras 20 variables y 20 otras EDOs. Escribimos el vector de las 21 variables    asociadas a la c&eacute;lula k-&eacute;sima como <img src="img/revistas/rcci/v7n4/fo0808413.png" width="21" height="23">y    escribimos el sistema de 21 EDOs para la c&eacute;lula k-&eacute;sima como:</font></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><img src="img/revistas/rcci/v7n4/fo0908413.png" width="91" height="25">    (2)</font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Si el sistema considerado    tiene <img src="img/revistas/rcci/v7n4/fo1008413.png" width="64" height="23"> c&eacute;lulas,    la dimensi&oacute;n total del sistema de EDOs es <img src="img/revistas/rcci/v7n4/fo1108413.png" width="91" height="23">.    Agrupando todas las variables dependientes de todas las c&eacute;lulas <img src="img/revistas/rcci/v7n4/fo1208413.png" width="15" height="23">    en el vector <img src="img/revistas/rcci/v7n4/fo1308413.png" width="9" height="23">, y agrupando    todas las funciones <img src="img/revistas/rcci/v7n4/fo1408413.png" width="13" height="23">    en la funci&oacute;n vectorial <img src="img/revistas/rcci/v7n4/fo1508413.png" width="10" height="23">,    dicho sistema se puede escribir en la forma est&aacute;ndar:</font></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><img src="img/revistas/rcci/v7n4/fo1608413.png" width="75" height="25">(3)</font></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">con    condiciones iniciales <img src="img/revistas/rcci/v7n4/fo1708413.png" width="69" height="23">.    Obs&eacute;rvese que evaluar la funci&oacute;n <img src="img/revistas/rcci/v7n4/fo1508413.png" width="10" height="23">equivale    a evaluar <img src="img/revistas/rcci/v7n4/fo1408413.png" width="13" height="23">para todas    las c&eacute;lulas.</font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>M&eacute;todo    Num&eacute;rico utilizado</b></font></p>     ]]></body>
<body><![CDATA[<p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Existen numerosos    m&eacute;todos para resolver sistemas de ecuaciones diferenciales ordinarias:    Runge-Kutta, Burlisch-Stoer, Predictor-Corrector, etc (Ascher, 1998; Press 1992;    Shampine, 1997). Tambi&eacute;n existe la posibilidad de usar m&eacute;todos    con paso adaptativo o con paso fijo. Los m&eacute;todos adaptativos han sido    explorados para este problema por los autores en (Garcia, 2011).    <br>   Para la versi&oacute;n inicial se ha utilizado el m&eacute;todo de Euler expl&iacute;cito.    Este es el m&eacute;todo m&aacute;s simple para resolver sistemas de EDOs como    (2).Tras la selecci&oacute;n de un paso temporal <img src="img/revistas/rcci/v7n4/fo1808413.png" width="8" height="23">,    y dada la soluci&oacute;n inicial <img src="img/revistas/rcci/v7n4/fo1908413.png" width="13" height="23">    en el instante <img src="img/revistas/rcci/v7n4/fo2008413.png" width="38" height="23">, se puede    obtener una soluci&oacute;n aproximada en el instante <img src="img/revistas/rcci/v7n4/fo2108413.png" width="120" height="23">    aplicando el algoritmo (1)</font></p>     <p align="center"><img src="img/revistas/rcci/v7n4/fo2708413.png" width="286" height="109"></p>     <p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Es    bien sabido que este m&eacute;todo no es muy apropiado para sistemas de EDOs    en general, porque no es muy preciso y el m&aacute;ximo paso de tiempo posible    no es muy grande. Sin embargo, para el problema de simulaci&oacute;n de c&eacute;lulas,    existe una versi&oacute;n del m&eacute;todo de Euler, llamado m&eacute;todo    de Rush-Larsen (Rush, 1978) y estudiado en diferentes art&iacute;culos (Maclachlan    2007, Marsh 2012, Spiteri 2008, Perego 2009, Sundnes 2009), que permite obtener    una precisi&oacute;n razonable con pasos de tiempo bastante largos. El m&eacute;todo    de Rush-Larsen utiliza la forma espec&iacute;fica de ciertas ecuaciones del    modelo celular (ecuaciones de puerta o &quot;gating&quot;) para obtener una    soluci&oacute;n seudo-anal&iacute;tica de dichas ecuaciones. Dicha modificaci&oacute;n    hace que el m&eacute;todo resultante sea mucho m&aacute;s eficiente, cuando    se aplica a simulaciones celulares. El m&eacute;todo de Rush-Larsen se ha aplicado    en el simulador; sin embargo, y para evitar explicaciones demasiado largas,    supondremos que el m&eacute;todo aplicado es el de Euler expl&iacute;cito.</font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Tal como est&aacute;    descrito, no hay paralelismo en el algoritmo 1. Sin embargo, si reescribimos    el algoritmo 1 indicando las operaciones para cada c&eacute;lula:</font></p>     <p align="center"><img src="img/revistas/rcci/v7n4/fo2808413.png" width="285" height="155"></p>     <p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">entonces    queda claro que el bucle interno se puede paralelizar sin mayor problema, dado    que la evaluaci&oacute;n de la funci&oacute;n <img src="img/revistas/rcci/v7n4/fo1408413.png" width="13" height="23">    es independiente para cada c&eacute;lula.</font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Unidades de    procesamiento gr&aacute;fico (GPU)</b></font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Un programa CUDA    se compone de un programa principal que se ejecuta en la CPU, y unos subprogramas    especiales, llamados kernels, que se ejecutan en la GPU. Cada kernel se invoca    desde el programa principal y asigna una cierta tarea a la GPU. Cuando un kernel    se env&iacute;a a la GPU, muchas instancias de dicho kernel se ejecutan en paralelo    en la GPU. Cada una de estas instancias es ejecutada por un thread, cada thread    se ejecuta en uno de los muchos microprocesadores o &quot;cores&quot; de la    GPU. Los threads se organizan en bloques de threads, que se ejecutan conjuntamente.    En la llamada al kernel, el programador debe especificar como par&aacute;metros    de kernel, cuantos bloques (<b>NumBlocks</b>) y cuantos threads por bloque (<b>NumThreadsperBlock</b>)    deben utilizarse para ejecutar este kernel.     <br> </font><font face="Verdana, Arial, Helvetica, sans-serif" size="2">    ]]></body>
<body><![CDATA[<br>   Nuestros solvers CUDA se han estructurado de forma que se obtiene paralelismo    realizando los c&aacute;lculos para muchas c&eacute;lulas simult&aacute;neamente.    Los c&aacute;lculos para una cierta c&eacute;lula los llevar&aacute; a cabo    un solo thread CUDA. Si, como es habitual, el n&uacute;mero de celdas es mayor    que el n&uacute;mero de threads, cada thread se encarga de varias c&eacute;lulas:    Supongamos que hay <b>NumCells</b> c&eacute;lulas y <b>NumThreads</b> threads    (<b>NumThreads</b> = <b>NumBlocks</b> &middot; <b>NumThreadsperBlock</b>), con    <b>NumCells</b>&gt;<b>NumThreads</b>. Cada thread es identificado por un n&uacute;mero    entero <b>Tid</b>, 0 &lt;<b>=Tid</b> &lt; <b>NumThreads</b>. Entonces, en un    cierto paso,el thread <b>Tid</b> empezar&aacute; procesando la c&eacute;lula    <b>Tid</b>. Cuando la acabe, empezar&aacute; con la c&eacute;lula <b>NumThreads</b>    <b>+ Tid</b>, luego procesar&aacute; la c&eacute;lula <b>2</b> &middot; <b>NumThreads      + Tid</b> y as&iacute; sucesivamente, hasta que todas las c&eacute;lulas hayan    sido procesadas.</font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">La estructura del    bucle principal, que se ejecuta en la CPU, ser&iacute;a la que se muestra en    el Algoritmo 3, y, salvo por algunos detalles, cada kernel ser&aacute; como    el algoritmo 4.</font></p>     <p align="center"><img src="img/revistas/rcci/v7n4/fo3008413.jpg" width="542" height="324"></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Adaptaci&oacute;n    para multiplesGPUs</b></font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">La adaptaci&oacute;n    para m&uacute;ltiples GPUs resulta conceptualmente bastante sencilla. La idea    b&aacute;sica consiste en repartir las c&eacute;lulas (o celdas) entre las diferentes    GPUs, y programar las comunicaciones necesarias tras cada paso temporal de forma    que cada c&eacute;lula que tenga alguna c&eacute;lula vecina residiendo en otra    GPU, pueda acceder al valor actualizado del voltaje de dicha c&eacute;lula.</font></p>     <p align="center"><img src="img/revistas/rcci/v7n4/fo2908413.jpg" width="502" height="200"></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Para obtener buen    rendimiento, es necesario que el bucle interno se ejecute en paralelo, y que    el intercambio de datos sea lo m&aacute;s eficiente posible. Esto se consigue    (al menos parcialmente) reduciendo la cantidad de datos que es necesario enviar.    <br>       <br>   Para la programaci&oacute;n del algoritmo 5 se han utilizado las t&eacute;cnicas    propuestas en el documento (Cuda, 2013), en el apartado de programaci&oacute;n    multiGPU, y en (Farber, 2012): fundamentalmente, utilizar la instrucci&oacute;n    <b>CudaSetDevice</b> para seleccionar cada GPU, y utilizar la copia as&iacute;ncrona    entre GPUs: <b>CudaMemcpyAsync</b>, para simultanear el tr&aacute;fico de datos    entre GPUs.</font></p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Ordenaci&oacute;n    de las c&eacute;lulas</b></font></p>     ]]></body>
<body><![CDATA[<p><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Durante el desarrollo    del simulador (en sus diferentes versiones), se han utilizado diferentes modelos;    unidimensionales (&quot;hilos&quot; de c&eacute;lulas), bidimensionales (&quot;planos    de c&eacute;lulas&quot;), casos tridimensionales para desarrollo (como por ejemplo,    estructuras esf&eacute;ricas) y casos tridimensionales realistas. Para casos    uni y bidimensional, resulta sencillo determinar y programar las comunicaciones.    Sin embargo, para grandes estructuras cardiacas tridimensionales, el problema    se hace m&aacute;s complicado. Si numeramos las c&eacute;lulas de 1 a <img src="img/revistas/rcci/v7n4/fo1008413.png" width="64" height="23">,    y disponemos de <img src="img/revistas/rcci/v7n4/fo2608413.png" width="21" height="23">GPUs,    supondremos que las primeras <img src="img/revistas/rcci/v7n4/fo1008413.png" width="64" height="23">/<img src="img/revistas/rcci/v7n4/fo2608413.png" width="21" height="23">c&eacute;lulas    van a la primera GPU, las siguientes van a la segunda, etc.    <br>   Entonces, el objetivo es determinar una ordenaci&oacute;n o numeraci&oacute;n    de las c&eacute;lulas de forma que las comunicaciones sean m&iacute;nimas.    <br>   Si la ordenaci&oacute;n de las c&eacute;lulas se hace de forma irreflexiva,    la cantidad de comunicaciones entre GPUs puede ser mucho mayor de lo necesario.    Para ilustrar este problema, consideremos un simple caso bidimensional con 4    por 4 c&eacute;lulas (ver <a href="#f1">figura 1</a>);     <br>   </font></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><a name="f1"></a><img src="img/revistas/rcci/v7n4/f0108413.jpg" width="330" height="233"></font></p>     <p align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Si    consideramos la matriz que relaciona cada c&eacute;lula con sus vecinas (consideramos    s&oacute;lo las situadas encima/debajo o a izquierda/derecha, no las vecinas    en direcci&oacute;n oblicua), obtenemos una matriz caracter&iacute;stica de    la discretizaci&oacute;n de la ecuaci&oacute;n de Poisson, cuya estructura se    puede observar en la <a href="#f2">figura 2</a>:</font></p>     <p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">    <br>   <a name="f2"></a><img src="img/revistas/rcci/v7n4/f0208413.jpg" width="565" height="232">    <br>   </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las l&iacute;neas    internas indican la divisi&oacute;n natural en dos GPUs, asignando las primeras    8 c&eacute;lulas a la primera GPU y las otras 8 a la segunda. El n&uacute;mero    de valores de la segunda GPU que se deben comunicar a la primera es el n&uacute;mero    de elementos distintos de cero que hay en los bloques no diagonales fuera de    la diagonal, en este caso 4 c&eacute;lulas. Si realizamos una ordenaci&oacute;n    aleatoria de las c&eacute;lulas, el n&uacute;mero de valores a enviar puede    aumentar considerablemente. En la <a href="#f3">figura 3</a> obtenida con el    mismo plano pero con ordenaci&oacute;n aleatoria, el n&uacute;mero de valores    a enviar sube a 11.    ]]></body>
<body><![CDATA[<br>   </font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="f3"></a><img src="img/revistas/rcci/v7n4/f0308413.jpg" width="574" height="255"></font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En    un caso tridimensional con un n&uacute;mero realista de c&eacute;lulas es m&aacute;s    dif&iacute;cil obtener una ordenaci&oacute;n natural, y el efecto de la ordenaci&oacute;n    puede ser mucho m&aacute;s importante.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El problema de    ordenaci&oacute;n para minimizar las comunicaciones es similar al problema de    reordenar matrices dispersas para que, al calcular descomposiciones como LU    o Cholesky, el relleno resultante sea m&iacute;nimo. Una de las t&eacute;cnicas    m&aacute;s habituales consiste en reordenar las filas y columnas de la matriz    dispersa de forma que el ancho de banda de la matriz resultante se reduzca.    Nosotros hemos optado por reordenar las c&eacute;lulas aplicando a la matriz    de adyacencia el conocido reordenamiento de Cuthill-McKee inverso (Cuthill,    1969). Dicho reordenamiento es bien conocido en la teor&iacute;a de soluci&oacute;n    de sistemas lineales dispersos. Tiene la propiedad de obtener un reordenamiento    que, habitualmente, disminuye el ancho de banda.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En    las <a href="#f4">figuras 4</a> y <a href="#f5">figura 5</a> se puede apreciar    el efecto de la reordenaci&oacute;n. Si se realiza la partici&oacute;n de c&eacute;lulas    sobre la ordenaci&oacute;n original, la cantidad de valores que se deben enviar  entre las GPUs es muy grande.</font></p>     <p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="f4"></a><img src="img/revistas/rcci/v7n4/f0408413.jpg" width="600" height="305"></font></p>     <p align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> Sin embargo, en la <a href="#f5">figura 5</a> se ve que la cantidad    de valores que hay que enviar, una vez reordenadas las c&eacute;lulas, es much&iacute;simo    menor.    <br> </font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">    <br>   Una vez reordenadas las c&eacute;lulas, ya se puede proceder a dividir las c&eacute;lulas    entre las GPUs en grupos m&aacute;s o menos iguales. Mediante una sencilla aplicaci&oacute;n    MATLAB, podemos determinar cuales tienen que ser los env&iacute;os entre cada    GPU.    <br>   </font></p>     ]]></body>
<body><![CDATA[<p align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a name="f5"></a><img src="img/revistas/rcci/v7n4/f0508413.png" width="401" height="321"></font></p>     <p align="left">&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>RESULTADOS Y    DISCUSI&Oacute;N</b></font> </p>     <P><font face="Verdana, Arial, Helvetica, sans-serif" size="2">El c&oacute;digo    multi-GPU obtenido se ha probado con un modelo tridimensional esf&eacute;rico    de 163842 c&eacute;lulas. Con este n&uacute;mero de c&eacute;lulas, la dimensi&oacute;n    total del sistema es de 21&middot;163,842 = 3, 440, 682. El tiempo simulado    es 0.3 segundos. Los resultados obtenidos muestran la misma precisi&oacute;n    que los resultados obtenidos con una sola GPU. El c&oacute;digo se ha probado    en una m&aacute;quina con 4 GPUs Tesla 2050, con 448 cores y 6 Gb de memoria    global cada una. Tambi&eacute;n hemos experimentado con una m&aacute;quina equipada    con una GPU Geforce 590GTX. Esta GPU es una GPU dual, compuesta en realidad    por 2 GPUs conectadas directamente, cada una con 512 cores y 1,5 Gb. Estas dos    GPUs son capaces de comunicarse a m&aacute;s velocidad que las GPUs que se conectan    a trav&eacute;s de los puertos del sistema.</font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Es necesario mencionar    que la m&aacute;quina multiGPU fue accedida de forma remota y multiusuario,    mientras que el trabajo con la m&aacute;quina con la GPU dual fue realizado    en modo local y con un solo usuario. Los resultados son llamativos; en la m&aacute;quina    multiGPU, con nuestro caso de prueba, el tiempo de ejecuci&oacute;n pasa de    23.4 segundos con una GPU, 16 segundos con 2 GPU, y por &uacute;ltimo 11.95    segundos con 4 GPUs. Por otro lado, con la GPU dual en el mismo caso se tard&oacute;    12 segundos con una de las dos GPUs, y 6.7 segundos usando las dos GPUs de la    GPU dual.    <br>       <br>   Los resultados prueban claramente que para este problema se pueden obtener reducciones    de tiempo muy importantes usando varias GPUs. Especialmente llamativo es el    caso de la GPU dual, que da un speedup casi perfecto.</font> </p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><B>CONCLUSIONES</B></font>  </p>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Los resultados    muestran que, para resoluci&oacute;n de Sistemas de EDOs donde las ecuaciones    diferenciales puedan evaluarse de forma independiente (como las diferentes c&eacute;lulas    en este caso), utilizar m&uacute;ltiples GPUs ofrece un rendimiento muy apreciable,    adem&aacute;s de ser muy dispositivos muy econ&oacute;micos en comparaci&oacute;n    con CPUs de potencia similar. Nuestros pr&oacute;ximos trabajos van orientados    a obtener versiones MultiGPU de nuestros c&oacute;digos con paso adaptativo.</font>     ]]></body>
<body><![CDATA[<P>&nbsp;     <P><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>AGRADECIMIENTOS</b></font>      <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Este trabajo ha    sido financiado por la Universitat Polit&egrave;cnica de Val&egrave;ncia a trav&eacute;s    de su Programa de Apoyo a la Investigaci&oacute;n y Desarrollo (PAID-06-11)    y (PAID-05-12), por la Generalitat Valenciana a trav&eacute;s de los proyectos    PROMETEO/2009/013 y Ayudas para la realizaci&oacute;n de proyectos de I+D para    grupos de investigaci&oacute;n emergentes GV/2012/039, y por el Ministerio Espa&ntilde;ol    de Econom&iacute;a y Competitividad y el fondo europeo de Desarrollo Regional    (FEDER) de la Comunidad Europea trav&eacute;s del proyecto TEC2012-38142-C04.    <br>       <br>   Tambi&eacute;n queremos agradecer al grupo de Computaci&oacute;n de Altas Prestaciones    de la Universidad Jaume-I de Castell&oacute;n, y a su director Enrique Quintana,    por permitirnos usar sus infraestructuras de c&aacute;lculo.</font>      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><b></b></font>      <P><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><B>REFERENCIAS    BIBLIOGR&Aacute;FICAS</B></font>      <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> ALMENDRAL, J.;    MORENO, J.; VAIDYANATHAN, R. et al. Activation of inward Rectifier Potassium    Channels Accelerates a trial Fibrillation in Humans: Evidence for a Reentrant    Mechanism, Circulation 114 (2006) p. 2434-2442.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">ASCHER, U. M.;    PETZOLD, L. R. Computer Methods for Ordinary Differential Equations and Differential-Algebraic    Equations, SIAM, Philadelphia. Cap&iacute;tulos 3-4. 1998.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">COURTEMANCHE, M.;    RAMIREZ, R. J.; NATTEL, S. Ionic Mechanisms Underlying Human Atrial Action Potential    Properties: Insights from a Mathematical Model. American Journal of Physiology-Heart    and Circulatory Physiology 275 (1998) 1 Pt 2:H301-21.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">CUDA. Online [Consultado    en: Junio de 2013]. Disponible en: [<a href="http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html" target="_blank">http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html</a>].</font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">CUTHILL, E.; McKEE,    J. Reducing the Bandwidth of Sparse Symmetric Matrices , en Proc. 24th Nat.    Conf. ACM, p. 157-172, 1969.    </font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">FARBER R. CUDA    Application Design and Development, Morgan Kaufmann Publishers, Waltham, MA,    2011.    </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MACLACHLAN, M.    C., SUNDNES J., SPITERI R J. A Comparison of Non-Standard Solvers for ODEs Describing    Cellular Reactions in the Heart, Computer Methods in Biomechanics and Biomedical    Engineering 10 (2007) 317-326.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">MARSH, M. E., ZIARAGATHI    S. T., SPITERI R. J., The Secrets to the Success of the Rush-Larsen Method and    its Generalizations, IEEE Transactions on Biomedical Engineering59 (2012) 2506-2515.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">PEREGO M., VENEZIANI    A., An Efficient Generalization of the Rush-Larsen method for solving Electro-Physiology    Membrane Equations, Electronic Transactions on Numerical Analysis 35 (2009)    234-256.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">PRESS, W. H. TEUKOLSKY,    S.A., VETTERLING, S.A., FLANNERY, B.P. Numerical Recipes2nd Edition: The Art    of Scientific Computing, Cambridge University Press, 1992.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">REUMANN, M.; FARINA,    D.; MIRI, R.; LURZ, S.; OSSWALD, B. y DOESSEL, O., Computer Model for the Optimization    of AV and VV Delay in Cardiac Resynchronization Therapy, Medical &amp; Biological    Engineering &amp; Computing 45 (2007) p. 845-854.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">RUSH, S.; LARSEN,    H., Practical Algorithm for Solving Dynamic Membrane Equations. IEEE Transactions    on Biomedical Engineering 25 (1978) 389-392.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">SHAMPINE, L. F.    y REICHELT, M. W. The MATLAB ODE suite, SIAM Journal on Scientific Computing    18 (1997) 1-22.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">SPITERI R. J. DEAN    R. C. On the Performance of an Implicit-Explicit Runge-Kuttamethod in Models    of Cardiac Electrical Activity, IEEE Transactions on Biomedical Engineering    55, 2008, 1488-95. doi: 10.1109/TBME.2007.914677.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">SUNDNES J., ARTEBRANT,    R., SKAVHAUG O., TVEITO A. A Second-Order Algorithm for Solving Dynamic Cell    Membrane Equations, IEEE Transactions on Biomedical Engineering56 (2009) 2546-8.    doi: 10.1109/TBME.2009.2014739.</font></p>     <P>&nbsp;</p>     <P>&nbsp; </p>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Recibido: 23/09/2013    <br>   Aceptado: 31/10/2013</font>       ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[ALMENDRAL]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[MORENO]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[VAIDYANATHAN]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<source><![CDATA[Activation of inward Rectifier Potassium Channels Accelerates a trial Fibrillation in Humans: Evidence for a Reentrant Mechanism]]></source>
<year>2006</year>
<page-range>2434-2442</page-range></nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[ASCHER]]></surname>
<given-names><![CDATA[U. M.]]></given-names>
</name>
<name>
<surname><![CDATA[PETZOLD]]></surname>
<given-names><![CDATA[L. R.]]></given-names>
</name>
</person-group>
<source><![CDATA[Computer Methods for Ordinary Differential Equations and Differential-Algebraic Equations]]></source>
<year>1998</year>
<publisher-loc><![CDATA[Philadelphia ]]></publisher-loc>
</nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[COURTEMANCHE]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
<name>
<surname><![CDATA[RAMIREZ]]></surname>
<given-names><![CDATA[R. J.]]></given-names>
</name>
</person-group>
<source><![CDATA[Ionic Mechanisms Underlying Human Atrial Action Potential Properties: Insights from a Mathematical Model.]]></source>
<year>1998</year>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="">
<collab>CUDA</collab>
<source><![CDATA[CUDA]]></source>
<year>2010</year>
</nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[CUTHILL]]></surname>
<given-names><![CDATA[E.]]></given-names>
</name>
<name>
<surname><![CDATA[McKEE]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<source><![CDATA[Reducing the Bandwidth of Sparse Symmetric Matrices]]></source>
<year>1969</year>
<page-range>157-172</page-range></nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[FARBER]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<source><![CDATA[CUDA Application Design and Development]]></source>
<year>2011</year>
<publisher-name><![CDATA[Morgan Kaufmann Publishers]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[MACLACHLAN]]></surname>
<given-names><![CDATA[M. C.]]></given-names>
</name>
<name>
<surname><![CDATA[SUNDNES]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
</person-group>
<source><![CDATA[A Comparison of Non-Standard Solvers for ODEs Describing Cellular Reactions in the Heart, Computer Methods in Biomechanics and Biomedical Engineering]]></source>
<year>2007</year>
</nlm-citation>
</ref>
<ref id="B8">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[MARSH]]></surname>
<given-names><![CDATA[M. E.]]></given-names>
</name>
<name>
<surname><![CDATA[ZIARAGATHI]]></surname>
<given-names><![CDATA[S. T.]]></given-names>
</name>
<name>
<surname><![CDATA[SPITERI]]></surname>
<given-names><![CDATA[R. J.]]></given-names>
</name>
</person-group>
<source><![CDATA[The Secrets to the Success of the Rush-Larsen Method and its Generalizations]]></source>
<year>2012</year>
</nlm-citation>
</ref>
<ref id="B9">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[PEREGO]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
<name>
<surname><![CDATA[VENEZIANI]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
</person-group>
<source><![CDATA[An Efficient Generalization of the Rush-Larsen method for solving Electro-Physiology Membrane Equations]]></source>
<year>2009</year>
</nlm-citation>
</ref>
<ref id="B10">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[PRESS]]></surname>
<given-names><![CDATA[W. H.]]></given-names>
</name>
<name>
<surname><![CDATA[TEUKOLSKY]]></surname>
<given-names><![CDATA[S.A.]]></given-names>
</name>
</person-group>
<source><![CDATA[Numerical Recipes2nd Edition: The Art of Scientific Computing]]></source>
<year>1992</year>
</nlm-citation>
</ref>
<ref id="B11">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[REUMANN]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
<name>
<surname><![CDATA[FARINA]]></surname>
<given-names><![CDATA[D.]]></given-names>
</name>
<name>
<surname><![CDATA[MIRI]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<source><![CDATA[Computer Model for the Optimization of AV and VV Delay in Cardiac Resynchronization Therapy]]></source>
<year>2007</year>
<page-range>845-854</page-range></nlm-citation>
</ref>
<ref id="B12">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[RUSH]]></surname>
<given-names><![CDATA[S.]]></given-names>
</name>
<name>
<surname><![CDATA[LARSEN]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
</person-group>
<source><![CDATA[Practical Algorithm for Solving Dynamic Membrane Equations]]></source>
<year>1978</year>
<page-range>389-392</page-range><publisher-name><![CDATA[IEEE Transactions on Biomedical Engineering]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B13">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[SHAMPINE]]></surname>
<given-names><![CDATA[L. F.]]></given-names>
</name>
<name>
<surname><![CDATA[REICHELT]]></surname>
<given-names><![CDATA[M. W.]]></given-names>
</name>
</person-group>
<source><![CDATA[The MATLAB ODE suite, SIAM Journal on Scientific Computing]]></source>
<year>1997</year>
<page-range>1-22</page-range></nlm-citation>
</ref>
<ref id="B14">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[SPITERI]]></surname>
<given-names><![CDATA[R. J.]]></given-names>
</name>
<name>
<surname><![CDATA[DEAN]]></surname>
<given-names><![CDATA[R. C.]]></given-names>
</name>
</person-group>
<source><![CDATA[On the Performance of an Implicit-Explicit Runge-Kuttamethod in Models of Cardiac Electrical Activity]]></source>
<year>2008</year>
<publisher-name><![CDATA[IEEE Transactions on Biomedical Engineering]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B15">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[SUNDNES]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[ARTEBRANT]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<source><![CDATA[A Second-Order Algorithm for Solving Dynamic Cell Membrane Equations]]></source>
<year>2009</year>
<publisher-name><![CDATA[IEEE Transactions on Biomedical Engineering]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
