User Tools

Site Tools


cluster:multiples_trabajos_varios_queue

Envío de trabajos al clúster con múltiples argumentos

Control de versiones

Fecha Actividad Autor
03/11/2010 Publicación inicial Jorge Iván Meza Martínez.

Introducción

La sintáxis de los archivos de envío de trabajos (submit) permite componer trabajos complejos en los que una parte de los parámetros sea común y otra se modifique de acuerdo con las tareas que deban realizarse.

De esta manera es posible crear trabajos en los que se invoquen múltiples ejecutables y se utilicen múltiples archivos de registro y/o se utilicen argumentos diferentes para cada invocación.

Tiempo estimado

30 minutos.

Precondición

  • El cluster se encuentra completo y en operación.

Supuestos

Ninguno.

Descripción del ejemplo

Se desea aprovechar la facilidad de procesamiento que ofrecen los nodos del cluster para calcular los números primos que se encuentran en un rango de valores definido por el usuario. Para esto se cuenta con la aplicación findPrimes que recibe el valor inicial y el valor final del rango de valores a través de los parámetros de línea de comando e imprime los números primos encontrados en él.

Se utiliza la estrategia de dividir y conquistar partiendo el problema en múltiples subproblemas de igual complejidad que segmentan el rango de valores en subrangos cuya sumatoria corresponde con el rango total. De esta manera la búsqueda de números primos inicial se segmenta en múltiples búsquedas de números primos con rangos mas cortos de valores que son distribuídos por el clúster a través de sus nodos.

Implementación del ejemplo

El código fuente de la aplicación findPrimes utilizado es el siguiente.

$ vi findPrimes.c
findPrimes.c
#include <stdio.h>
#include <stdlib.h>
 
#define true  1
#define false 0
 
/**
 * Verifica si el número especificado es primo o no.
 *
 * @param	int	Número a verificar.
 * @return	int	true es primo, false no.
 */	
 
int isPrime(int num)
{
    int i      = 0;
    int start  = 2;
    int end    = num;
 
    if(num == 2 || num == 3 || num == 5 || num == 7 || num == 11)
    {
        return true;
    }
 
    if(num % 2 == 0)
    {
        return false;
    }
 
    for(i=start; i<=end; ++i)
    {
        if(i != num && num % i == 0)
        {
		return false;
        }
    }
 
    return true;
}
 
/**
 * Aplicación de demostración para la búsqueda de números primos.
 *
 * @param 	argv[1] - string	Valor inicial (entero) del rango a revisar.
 * @param 	argv[2] - string	Valor final (entero) del rango a revisar.
 */
 
int main(int argc, char *argv[])
{   
    int start, end, i, val;
 
    // Verifica la existencia de los parámetros necesarios.
 
    if(argc != 3) 
    {
        printf("Usage: %s <start> <end>\n", argv[0]);
        exit(1);
    }
 
    // Obtiene la representación entera de los límites del rango de
    // valores a revisar.
 
    start = atoi(argv[1]);
    end   = atoi(argv[2]);
 
    // Revisa uno a uno los valores del rango verificando si son números
    // primos o no.
 
    for(i=start; i<=end; i++)
    {
    	val = isPrime(i);
 
        // En caso de ser "i" un número primo lo imprime a través de stdout.
 
        if(val == true)
            printf("%d\n", i);
    }
 
    // Termina exitosamente.
 
    exit(0);
}

La aplicación es compilada de acuerdo con los requerimientos del universo Standard.

$ condor_compile gcc findPrimes.c -o findPrimes

En el archivo de envío del trabajo se descompone el problema total en diferentes trabajos que se encargarán de fragmentos del rango total de valores y que se envían a la cola de trabajos (queue) del clúster.

En este caso el rango total de valores en el cual se desea hallar los números primos es desde 0 hasta 250000 y ha sido descompuesto en 5 subtrabajos con rangos de 50000 elementos cada uno.

$ vi FindPrimes.submit
FindPrimes.submit
Executable     = FindPrimes.exe
Universe       = standard
Log            = _FindPrimes.log
 
Arguments      = 1 50000
Output         = _FindPrimes-$(Process).out
Error          = _FindPrimes-$(Process).err
Queue
 
Arguments      = 50000 100000
Output         = _FindPrimes-$(Process).out
Error          = _FindPrimes-$(Process).err
Queue
 
Arguments      = 100000 150000
Output         = _FindPrimes-$(Process).out
Error          = _FindPrimes-$(Process).err
Queue
 
Arguments      = 150000 200000
Output         = _FindPrimes-$(Process).out
Error          = _FindPrimes-$(Process).err
Queue
 
Arguments      = 200000 250000 
Output         = _FindPrimes-$(Process).out
Error          = _FindPrimes-$(Process).err
Queue

Nótese como en este caso el primer bloque de parámetros (Executable, Universe y Log) no varían mientras que los parámetros para cada subtrabajo son preparados y enviados a la cola del clúster.

Cada subtrabajo tendrá entonces su propio archivo de salida (out) y su propio registro de errores (err). La variable $(Process) será reemplazada durante la ejecución de los trabajos con su respectivo identificador.

El envío del trabajo al cluster se realiza de manera habitual.

$ condor_submit FindPrimes.submit

Al verificar los procesos existentes en las colas del clúster se encuentra que el trabajo identificado por el código 2 se encuentra subdivido en 5 subtrabajos.

$ condor_q
 
    -- Submitter: d-head.jorgeivanmeza.com : <192.168.1.230:9061> : d-head.jorgeivanmeza.com
     ID      OWNER            SUBMITTED     RUN_TIME ST PRI SIZE CMD               
       2.0   jimezam        11/3  20:24   0+00:00:00 I  0   7.3  FindPrimes 1 5
       2.1   jimezam        11/3  20:24   0+00:00:00 I  0   7.3  FindPrimes 500
       2.2   jimezam        11/3  20:24   0+00:00:00 I  0   7.3  FindPrimes 100
       2.3   jimezam        11/3  20:24   0+00:00:00 I  0   7.3  FindPrimes 150
       2.4   jimezam        11/3  20:24   0+00:00:00 I  0   7.3  FindPrimes 200
 
    5 jobs; 5 idle, 0 running, 0 held

Al revisar los archivos generados después de la ejecución del trabajo se pueden apreciar los múltiples archivos de salida estándar (_FindPrimes-*.out) y error (_FindPrimes-*.err) individuales, y el único archivo de registro general (_FindPrimes.log) tal y como se indicó en el archivo de envío al clúster.

$ ls -l
 
    total 5560
    -rw-rw-r-- 1 jimezam jimezam       0 Nov  3 20:24 _FindPrimes-0.err
    -rw-rw-r-- 1 jimezam jimezam   29374 Nov  3 20:24 _FindPrimes-0.out
    -rw-rw-r-- 1 jimezam jimezam       0 Nov  3 20:24 _FindPrimes-1.err
    -rw-rw-r-- 1 jimezam jimezam   26754 Nov  3 20:24 _FindPrimes-1.out
    -rw-rw-r-- 1 jimezam jimezam       0 Nov  3 20:24 _FindPrimes-2.err
    -rw-rw-r-- 1 jimezam jimezam   29792 Nov  3 20:25 _FindPrimes-2.out
    -rw-rw-r-- 1 jimezam jimezam       0 Nov  3 20:24 _FindPrimes-3.err
    -rw-rw-r-- 1 jimezam jimezam   28952 Nov  3 20:25 _FindPrimes-3.out
    -rw-rw-r-- 1 jimezam jimezam       0 Nov  3 20:24 _FindPrimes-4.err
    -rw-rw-r-- 1 jimezam jimezam   28420 Nov  3 20:25 _FindPrimes-4.out
    -rw-rw-r-- 1 jimezam jimezam    1543 Nov  3 20:19 findPrimes.c
    -rwxrwxr-x 1 jimezam jimezam 5454993 Nov  3 20:20 findPrimes.exe
    -rw-rw-r-- 1 jimezam jimezam    3120 Nov  3 20:25 _FindPrimes.log
    -rw-rw-r-- 1 jimezam jimezam     716 Nov  3 20:24 findPrimes.submit

Enlaces

cluster/multiples_trabajos_varios_queue.txt · Last modified: 2012/02/26 22:35 (external edit)