Go es un lenguaje de programación de código abierto orientado a la creación de software sencillo, fiable y eficiente.
Para consultar la información del módulo:
module spider Go/1.25.0
Para cargar Go:
module purge
module load rama0.4 Go/1.25.0
Comprobar la versión y la ruta del ejecutable:
go version
which go
module list
La salida de go version debe ser similar a:
go version go1.25.0 linux/amd64
Go se distribuye bajo una licencia de tipo BSD. Las dependencias externas de cada proyecto pueden utilizar licencias diferentes y deben revisarse antes de usar el programa.
Go puede utilizarse en nodos normales de cómputo. No necesita GPU, salvo que el programa utilice bibliotecas externas con soporte específico para aceleradores.
El flujo habitual es:
Las compilaciones importantes, las pruebas intensivas y la ejecución de aplicaciones deben realizarse en nodos de cómputo.
Los programas Go pueden ejecutar goroutines en paralelo. El número máximo de hilos que pueden ejecutar código Go simultáneamente está controlado por GOMAXPROCS.
Go 1.25 puede detectar límites de CPU de cgroups en Linux. Aun así, en los trabajos de SLURM se recomienda establecer explícitamente:
export GOMAXPROCS="${SLURM_CPUS_PER_TASK}"
El valor debe corresponder al solicitado:
#SBATCH --cpus-per-task=8
Asignar varias CPU no acelera automáticamente cualquier programa: el código debe utilizar concurrencia o paralelismo para aprovecharlas.
Puede comprobarse desde un programa:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("CPU visibles:", runtime.NumCPU())
fmt.Println("GOMAXPROCS:", runtime.GOMAXPROCS(0))
}
Archivo go_job.sh:
#!/bin/bash
#SBATCH --job-name=go-programa
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --mem=8G
#SBATCH --time=01:00:00
#SBATCH --partition=generic
#SBATCH --output=go-%j.out
#SBATCH --error=go-%j.err
set -euo pipefail
module purge
module load rama0.4 Go/1.25.0
export GOTOOLCHAIN=local
export GOMAXPROCS="${SLURM_CPUS_PER_TASK}"
export GOCACHE="$HOME/.cache/go-build"
export GOMODCACHE="$HOME/.cache/go-mod"
mkdir -p "$GOCACHE" "$GOMODCACHE"
echo "Nodo: $(hostname -s)"
echo "Versión: $(go version)"
echo "CPU asignadas: ${SLURM_CPUS_PER_TASK}"
echo "GOMAXPROCS: ${GOMAXPROCS}"
go mod download
go test ./...
go build -o mi-programa .
./mi-programa
Enviar el trabajo:
sbatch go_job.sh
Consultar su estado:
squeue -j <jobid>
Revisar la salida:
cat go-<jobid>.out
cat go-<jobid>.err
Solicitar una sesión:
salloc --partition=generic --nodes=1 --ntasks=1 --cpus-per-task=8 --mem=8G --time=02:00:00
Una vez concedida:
srun --pty bash
Dentro del nodo:
module purge
module load rama0.4 Go/1.25.0
export GOTOOLCHAIN=local
export GOMAXPROCS="${SLURM_CPUS_PER_TASK}"
go version
Al finalizar, salir del nodo y de la reserva:
exit
exit
Consultar la versión de Go:
go version mi-programa
Mostrar los módulos incluidos:
go version -m mi-programa
En formato JSON:
go version -m -json mi-programa
go: command not foundEl módulo no está cargado:
module load rama0.4 Go/1.25.0
which go
Comprobar:
grep -E '^(go|toolchain) ' go.mod
Usar exclusivamente el toolchain cargado:
export GOTOOLCHAIN=local
Definir:
export GOMAXPROCS="${SLURM_CPUS_PER_TASK}"
Debe comprobarse que el programa usa goroutines para trabajo paralelo y que no existe un cuello de botella de entrada/salida o una sección crítica que serialice la ejecución.
sacct -j <jobid> --format=JobID,JobName,State,ExitCode,Elapsed,AllocCPUS,ReqMem,MaxRSS
Revisar también los archivos de salida y error definidos en el script.