x86 vs x64 (Continuación)

Si te perdiste la primera parte, la puedes leer en el artículo x86 vs x64, si fuiste de los que leyeron recordarás que se dejó como "deberes", optimizar la aplicación para que usase varios hilos de ejecución, y así resultar más veloz en equipos de varios nucleos.

Para no complicarlo demasiado, he optado por usar OpenMP, de forma que añadiendo un par de lineas más al fuente original fuera suficiente:

#include <stdio.h>
#include <time.h>
#include <omp.h>

void __cdecl main (void)
{
__int64 iCount, iRes;
unsigned int iInicio, iFin;

iInicio=clock();

iRes=0;
#pragma omp parallel for
for (iCount=1; iCount<=10000000000; iCount++)
{
iRes+=iCount;
iRes--;
}
iFin=clock();
printf("%I64d %d\n", iRes, iFin-iInicio);
getchar();
}

He omitido la publicación de los listados en ensamblador, pues son bastante extensos debido a los diferentes procedimientos que ejecutan la rutina, y al código necesario para lanzar los threads.

Los tiempos obtenidos comparados con la versión monothread han sido:

Arquitectura Versión Tiempo (milisegundos): Relativo:
x86 1 thread 41404 100%
x64 1 thread 20015 206%
x86 Multithread 21302 194%
x64 Multithread 10551 392%

Nuevamente el benchmark sintético da unos resultados cercanos al teórico, siendo las multithreaded tanto x86 como x64, casi el doble de rápidas de las respectivas de un solo hilo.

Incomprensiblemente Visual C++ no permite enlazar estáticamente (static link) con la librería de OpenMP, por lo que la ejecución de los binarios requiere que se tenga instalado en el sistema vcomp.dll.

En éste paquete (62 Kb. en formato ZIP), se incluyen el fuente, los binarios x86 y x64, y archivo de proyecto.

x86 vs x64 (Continuación)

Deja un comentario