es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Trabajo individual de GNU Parallel divido en múltiples hilos

Quiero lanzar un trabajo único, que tome dos parámetros como entrada, y dividir su ejecución entre 128 hilos de la CPU con GNUparallel. Explico lo que hice y cómo lo hice, y pido ayuda.

Tengo un script de bash llamado “job.sh” donde defino dos variables y lanzo un trabajo.

#!/bin/bash

first=70
second=10

./ejecutable $((first-1)) $second

echo "$first $second"

Ahora quiero dividir este trabajo intenso en 128 hilos de la CPU del servidor en el que estoy trabajando, usando GNU parallel.

Después de leer la documentación, intenté sustituir la línea ./ejecutable $((first-1)) $second por parallel -j+128 ./ejecutable $((first-1)) $second, luego intenté ejecutarlo de la siguiente manera:

user@server$ nohup bash job.sh&

El trabajo falla. ¿Alguien sabe cómo ejecutar un ejecutable con GNU parallel?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no puedo acceder a la terminal de tu servidor ni ver errores del sistema; por lo tanto, no puedo estar seguro de la razón exacta por la que el trabajo está fallando. Sin embargo, aquí tienes algunas sugerencias y un código de ejemplo para lanzar un solo trabajo con dos parámetros, divididos en 128 hilos utilizando GNU Parallel:

    1. Verifica que tu archivo “ejecutable” esté presente en el directorio donde ejecutas el script “job.sh”. En caso contrario, define la ruta completa (por ejemplo, /home/user/executable).
    2. Asegúrate de tener GNU Parallel instalado en tu servidor. Puedes verificar su presencia escribiendo which parallel o simplemente parallel en la terminal.
    3. Utiliza llaves de apertura y cierre {} para representar los parámetros pasados a través de Parallel. En tu caso, puedes usar {1} para la primera variable (es decir, $((first-1))) y {2} para la segunda variable ($second).
    4. En lugar de nohup, que desconecta el trabajo de la terminal y redirige su salida a un archivo, utiliza las banderas --joblog y --resume con Parallel para guardar los registros de cada hilo y reanudar el trabajo si se interrumpe.

    Aquí tienes una versión modificada de tu script que utiliza GNU Parallel:

    #!/bin/bash
    
    first=70
    second=10
    
    echo "$first $second" > parameters.txt # Almacenar los parámetros en un archivo para mayor legibilidad (opcional)
    
    parallel -j 128 --joblog log.txt --resume ./executable {1} {2} :::: parameters.txt
    
    

    Permíteme explicar cada línea, comenzando desde el comando parallel:

    • -j 128 indica a Parallel que queremos ejecutar 128 trabajos en paralelo (es decir, utilizando los hilos de CPU disponibles).
    • --joblog log.txt guarda la salida de cada hilo en el archivo “log.txt”. Si no necesitas los registros, puedes omitir esta bandera.
    • --resume indica a Parallel que reanude el trabajo si se interrumpe, por ejemplo, debido a un reinicio del servidor o una conexión perdida.
    • ./ejecutable {1} {2} es el comando que queremos ejecutar para cada par de parámetros, donde {1} es el primer parámetro (es decir, $((first-1))) y {2} es el segundo parámetro ($second).
    • :::: parameters.txt especifica el archivo de entrada (es decir, “parameters.txt”) que tiene los pares de parámetros separados por un espacio.

    Una vez que guardes y ejecutes el script “job.sh” modificado, deberías ver la salida de cada hilo en el archivo “log.txt”. Si el trabajo falla, verifica los registros en busca del mensaje de error o contacta a un administrador de sistema para obtener ayuda.

Comments are closed.