Mostrando entradas con la etiqueta programming. Mostrar todas las entradas
Mostrando entradas con la etiqueta programming. Mostrar todas las entradas

C++: Medición de tiempo con 'chrono'

¿Necesitas medir tiempos de ejecución y no sabes cómo? 
Has dado con el blog adecuado ;)

Si no tienes mucho tiempo puedes copiar directamente el código que está al final para salir del paso pero, eh, no te acostumbres a copiar y pegar. Es bueno ver qué y cómo programan los demás pero tienes que intentar entenderlo.

En primer lugar aclarar que utilizo la biblioteca chrono incluida en el estándar C++11. Para poder usarla tienes que hacer dos cosas:
  1. Añadir ' #import <chrono> ' al inicio de tu código.
  2. Añadir el flag ' -std=c++0x ' a la hora de compilar.
Ya sabes cómo añadirla, así que vamos al lío.

Tienes toda la documentación aquí (enlace) por si quieres consultar otras funciones. Yo me voy a centrar en 'high_definition_clock'.

En primer lugar tienes que añadir estas dos líneas de código que te permitirán ahorrarte escribir 'std::chrono::' antes de llamar a métodos u objetos dentro del ámbito de la biblioteca chrono.
using namespace std;
using namespace std::chrono;
A continuación crea dos variables que contendrán el tiempo antes y después de la ejecución:
double time;
duration<double> interval;
high_resolution_clock::time_point start, end;

start = high_resolution_clock::now();
// Función que quieras medir.
end = high_resolution_clock::now();
Posteriormente se calcula el intervalo de tiempo y se almacena en una variable de tipo double:
interval = duration_cast>(end - start);
  
time = interval.count();
Para ahorrarte tiempo puedes usar el objeto Clock que he implementado y que es de código libre (está en GitHub y lo muestro a continuación). Para usarlo tienes, de nuevo qué pesado, dos opciones:

  1. Copias el código dentro de tu programa. (Que no se te olvide incluir la bilbioteca chrono)
  2. Descargarte el archivo e incluirlo con '#include "clock.hpp"'. 

 En ambos casos tendrás que añadir el flag que mencioné al principio cuando compiles, '-std=c++0x'. Un simple ejemplo de uso:
Clock my_clock;
double time;

my_clock.start();
// Lo que quieras medir.
time = my_clock.now();
Fácil, ¿Verdad?

Aquí puedes ver/descargar el código al completo: ¡Saludos!

Linux - mpi : no se encontró la orden

Los sistemas linux, como Ubuntu o Fedora, normalmente vienen con muchas aplicaciones y librerías, entre ellas está OpenMPI.
Si usas Ubuntu probablemente no necesitarás esto porque el directorio donde están los ejecutables de OpenMPI ya viene incluido en la variable de entorno 'PATH'.

¿ Cómo se si están incluidos o no?

Muy sencillo, abre una terminal y ejecuta
mpicc
o mpirun o cualquier otra orden de mpi.
Si obtienes el mensaje " ... : No se encontró la orden... " tienes que añadirlo al PATH.

¿ Cómo puedo añadirlo ?

Primero abre un terminal ( o usa el que abriste antes ) y ejecuta:
find /usr -name "mpirun"
Aquí estamos buscando el ejecutable "mpirun" que sabemos que es parte de la librería. Yo obtengo la siguiente salida:
/usr/lib64/openmpi/bin/mpirun
Normalmente siempre están en el directorio '/usr/lib64/openmpi/bin' si tu sistema es de 64bits o solamente "lib" si no lo es.
Ahora sólo tienes que añadirlo con:
export PATH=$PATH:/usr/lib64/openmpi/bin/
Si usas la orden 'export' tendrás que ejecutarla por cada terminal que abras o reinicies. Si no quieres tener que hacerlo cada vez hay que incluirlo en el archivo ".bashrc".

Abre una terminal y ejecuta:
cd ~
gedit .bashrc
Yo uso gedit, tú puedes usar tu editor favorito.

Y añadimos al final la orden 'export' usada anteriormente:

Linux - Command mpi not found

Linux systems, such as Ubuntu or Fedora, usually come with a lot of libraries or applications, and OpenMPI is among them.
If you use Ubuntu you probably won't need this because it includes the openmpi binaries folder in the environment variable 'PATH'.

How I know if I it's included or not?


It's quite simple, open a terminal and run:
mpicc
or mpirun or any other mpi command.
If you obtain the message " ... : Command not found... " you have to add it to PATH.

How can I add it?

First open a terminal ( or use the one you opened before ) and run:
find /usr -name "mpirun"
Here we are looking for the executable "mpirun" which we know it's part of the library. I obtain the following output:
/usr/lib64/openmpi/bin/mpirun
Normally it is always under '/usr/lib64/openmpi/bin' if your system is 64bits or only "lib" if not.
Now you only have to add it:
export PATH=$PATH:/usr/lib64/openmpi/bin/
If you use the export command you have to use it for every terminal you open / restart. If you don't want to do this only add it to your ".bashrc" file.

Open a terminal and run:
cd ~
gedit .bashrc
Use gedit or other text editor you like.

And at the end of the file add the previous export command: