Configuración de Visual Studio Code y WSL para el desarrollo MPI


Muchos planes de estudios requieren que se realicen pequeños programas con  MPI como parte del curso de Computación paralela, por lo que en este post   intentaremos ver como hacer la configuración de WSL (Subsistema de Windows para Linux) y Visual Studio Code para el desarrollo de MPI, que se ejecuta en Ubuntu WSL Distro de Microsoft Store

Configuración de WSL

En las versiones recientes de Windows, WSL está habilitado de forma predeterminada y todo lo que necesita hacer es instalar una distribución debajo de él.

Comenzaremos descargando la distribución de Ubuntu de Microsoft Store. Abra la tienda desde el menú de inicio y busque Ubuntu 18.04 o haga clic aquí

Imagen para publicación
Toca “Obtener” para instalar la distribución de Ubuntu de WSL

después de  instalarlo, ábralo y siga todas las instrucciones para ingresar su nombre de usuario y contraseña predeterminados, etcétera.

Instalación de OpenMPI y herramientas de compilación para OpenMPI

Ahora debería estar mirando una ventana de línea de comandos, ejecutando bash, con el logotipo de ubuntu como el icono de la aplicación en la barra de tareas. Si ve esto, significa que ha instalado con éxito la distribución de Ubuntu en WSL

Ahora escriba el siguiente comando para instalar OpenMPI. En el caso de la siguiente captura de pantalla, ya se ha instalado.

sudo apt update && sudo apt install openmpi-bin libopenmpi-dev

Después de esto, inmediatamente podrá usar mpicc y mpirun para ejecutar y compilar programas que usen MPI, pero pronto verá este mensaje.

WARNING: Linux kernel CMA support was requested via thebtl_vader_single_copy_mechanism MCA variable, but CMA support isnot available due to restrictive ptrace settings.

Esto se debe a uno de los parámetros con los que WSL está configurado de forma predeterminada. Para resolver esto, necesitamos ejecutar este comando

  echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Después de esto, la advertencia simplemente desaparecerá.

Para compilar con MPI  simplemente debemos usr el compilador mpicc  , como por ejemplo:

>mpicc -o ejemplo ejemplo.c

Y para ejecutarlo usaremos mpirun  pasándole con el argumento -n el numero de procesadores:

mpirun -n 2 ./ejemplo

Ahora veamos un ejemplo sencillo para probar mpi :

 

#include<stdio.h>

#include<mpi.h>

int main( int argc, char* argv[] ) {

    int rank, size;

  

    // Paralelismo

    MPI_Init( &argc, &argv );

    // Indice del proceso

    MPI_Comm_size( MPI_COMM_WORLD, &size );

    // Tamano del comunicador seleccionado

    MPI_Comm_rank( MPI_COMM_WORLD, &rank );

    printf( "Hola mundo! Soy el proceso numero %d. En total somos %d procesos.\n", rank, size );




    MPI_Finalize();

}

 

 Para poder ejecutar con más procesadores  de los que físicamente tiene el equipo al usar  mpirun  pasándole con el argumento -n (el numero de procesadores) , nos dará un error :
>mpirun -n 4 ./ejemplo
There are not enough slots available in the system to satisfy the 3slots that were requested by the application:
  ./Step6-SendReceive
Either request fewer slots for your application, or make more slotsavailable for use.
A "slot" is the Open MPI term for an allocatable unit where we canlaunch a process.  The number of slots available are defined by theenvironment in which Open MPI processes are run:
  1. Hostfile, via "slots=N" clauses (N defaults to number of     processor cores if not provided)  2. The --host command line parameter, via a ":N" suffix on the     hostname (N defaults to 1 if not provided)  3. Resource manager (e.g., SLURM, PBS/Torque, LSF, etc.)  4. If none of a hostfile, the --host command line parameter, or an     RM is present, Open MPI defaults to the number of processor cores
In all the above cases, if you want Open MPI to default to the numberof hardware threads instead of the number of processor cores, use the--use-hwthread-cpus option.
Alternatively, you can use the --oversubscribe option to ignore thenumber of available slots when deciding the number of processes tolaunch.

Como no es difícil de adivinar el error advierte de que intentamos ejecutar  en mas procesadores los que realmente se tienen en nuestra máquina .Para simular los procesadores que no se tiene podemos utilizar el flag –oversubscribe

 
Sería así:
mpirun -np 4 –oversubscribe ./programa

 

 

Si solo desea ejecutar programas en el terminal y no necesitar configurar Visual Studio Code, ahora puede hacerlo usando mpicc y mpirun desde la consola .De lo contrario, siga leyendo para descubrir cómo configurar VSCode para la tarea.

Configuración de VSCode

Suponemos que ya tiene VSCode instalado, si no, descárguelos de su sitio web .

Necesitaremos instalar WSL Remote desde su página de Extensiones de Visual Studio , después de eso, haga clic en el nuevo ícono en la parte inferior izquierda para iniciar una nueva sesión de WSL.

Imagen para publicación

Después de eso, le pedirá que elija un directorio que desea abrir. Continúe y abra el directorio en el que planea realizar su desarrollo.

Para habilitar el resaltado de sintaxis, intellisense y otras características conscientes del lenguaje, también necesitamos configurar el soporte C / C ++ en VSCode. Para eso, vaya al panel de extensiones e instálelo

Imagen para publicación

Ahora, por defecto, VSCode no va a poder encontrar mpi.h, lo cual es fundamental para poder brindar sugerencias para Interfaces MPI, para eso necesitaremos configurar el includePath y la ruta ejecutable en el C / C ++ Ajustes.

 

Probablemente tenga  un archivo llamado c_ccp_properties.json en la carpeta .vscode en su directorio del programa 
    "configurations": [

        {

            "name": "Win32",

            "includePath": [

                "${workspaceFolder}/**", "C:\\Program Files (x86)\\Microsoft SDKs\\MPI\\Lib\\"

            ],

            "defines": [

                "_DEBUG",

                "UNICODE",

                "_UNICODE"

            ],

            "compilerPath": "C:\\MinGW\\bin\\gcc.exe",

            "cStandard": "gnu11",

            "cppStandard": "gnu++14",

            "intelliSenseMode": "windows-gcc-x86"

        }

    ],

    "version": 4

}

 Modifique ese archivo llamado c_ccp_properties.json en la carpeta .vscode en su directorio del programa MPI para poderlo  ejecutar desde Linux :

{

    "configurations": [

        {

            "name": "Linux",

            "includePath": [

                "${workspaceFolder}/**",

                "/usr/lib/x86_64-linux-gnu/openmpi/include"

            ],

            "defines": [],

            "compilerPath": "/usr/bin/mpicc",

            "cStandard": "c11",

            "cppStandard": "c++17",

            "intelliSenseMode": "clang-x64"

        }

    ],

    "version": 4

}
 
Se puede conseguir auto construcción y ejecución  por lo que además  de lo anteriror, si desea poder compilar y ejecutar directamente desde VSCode, debemos agregar las siguientes tareas de compilación y lanzamiento
 
fichero=launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(mpirun) Launch",
"type": "cppdbg",
"request": "launch",
"program": "/usr/bin/mpirun",
"args": ["-np", "4", "${fileDirname}/${fileBasenameNoExtension}.out"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,

}
]
}

fichero task.json

 
{

    "version": "2.0.0",

    "tasks": [

        {

            "type": "shell",

            "label": "gcc build active file",

            "command": "/usr/bin/gcc",

            "args": [

                "-g",

                "${file}",

                "-o",

                "${fileDirname}/${fileBasenameNoExtension}"

            ],

            "options": {

                "cwd": "/usr/bin"

            },

            "problemMatcher": [

                "$gcc"

            ],

            "group": "build"

        },

        {

            "type": "shell",

            "label": "mpicc build active file",

            "command": "/usr/bin/mpicc",

            "args": [

                "-g",

                "${file}",

                "-o",

                "${fileDirname}/${fileBasenameNoExtension}.out"

            ],

            "options": {

                "cwd": "/usr/bin"

            },

            "problemMatcher": [

                "$gcc"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            }

        },

    ]

}

Con esa configuración, debería poder usar sus atajos de teclado predeterminados para Ejecutar sin depurar (Ctrl + F5) y Generar (Ctrl + Shift + B) para construir y ejecutar sus programas MPI.

Generación manual de una clave SSH en Windows


 

En Windows se puede crear claves SSH de muchas formas. En este post debería aclaranos un poco como utilizar dos aplicaciones SSH, PuTTY y Git Bash .

Muchos proveedores recomiendan claves RSA porque los programas CLI de node-manta funcionan con claves RSA tanto localmente como con el agente ssh y las claves DSA solo funcionarán si la clave privada está en el mismo sistema que la CLI y no está protegida por contraseña.

Putty

PuTTY es un cliente SSH para Windows. Puede utilizar PuTTY para generar claves SSH. PuTTY es un emulador de terminal de código abierto gratuito que funciona de manera muy similar a la aplicación Terminal en macOS en un entorno Windows. Esta sección le muestra cómo generar y cargar manualmente una clave SSH cuando trabaja con PuTTY en el entorno de Windows.

 

PuTTY es un cliente SSH para Windows que utilizará para generar sus claves SSH. Puede descargar PuTTY desde www.chiark.greenend.org.uk .

Cuando instala el cliente PuTTY, también instala la utilidad PuTTYgen. PuTTYgen es lo que usará para generar su clave SSH para una VM de Windows.

Generando una clave SSH

Para generar una clave SSH con PuTTYgen, siga estos pasos:

  1. Abra el programa PuTTYgen.
  2. Para Tipo de clave a generar , seleccione SSH-2 RSA .
  3. Haga clic en el botón Generar .
  4. Mueva el mouse en el área debajo de la barra de progreso. Cuando la barra de progreso está llena, PuTTYgen genera su par de claves.
  5. Escriba una frase de contraseña en el campo Frase de contraseña de clave . Escriba la misma contraseña en el campo Confirmar contraseña . Puede utilizar una clave sin una frase de contraseña, pero no se recomienda.
  6. Haga clic en el botón Guardar clave privada para guardar la clave privada. ¡Advertencia!Usted debe guardar la clave privada. Lo necesitará para conectarse a su máquina.
  7. Haga clic con el botón derecho en el campo de texto etiquetado como Clave pública para pegar en el archivo de claves autorizadas de OpenSSH y elija Seleccionar todo .
  8. Vuelva a hacer clic derecho en el mismo campo de texto y elija Copiar .

Importando su clave SSH

Ahora debe importar la clave SSH copiada al portal.

  1. Después de copiar la clave SSH al portapapeles, regrese a la página de su cuenta de su proveedor .
  2. Elija Importar clave pública y pegue su clave SSH en el campo Clave pública.
  3. En el campo Nombre de clave , proporcione un nombre para la clave. Nota : aunque proporcionar un nombre de clave es opcional, es una buena práctica para facilitar la administración de varias claves SSH.
  4. Agrega la clave. Ahora aparecerá en su tabla de claves bajo SSH.
La tabla de claves SSH

¡Advertencia!PuTTY y OpenSSH usan diferentes formatos de claves SSH públicas. Si el texto que pegó en la clave SSH comienza con —— BEGIN SSH2 PUBLIC KEY, está en el formato incorrecto. Asegúrese de seguir las instrucciones cuidadosamente. Tu clave debe comenzar con ssh-rsa AAAA….

Una vez que cargue su clave SSH en el portal, puede conectarse a su máquina virtual desde Windows a través de una sesión PuTTY.

Git Bash

El paquete de instalación de Git viene con SSH. Con Git Bash, que es la herramienta de línea de comandos de Git, puede generar pares de claves SSH. Git Bash tiene un cliente SSH que le permite conectarse e interactuar con los contenedores de Triton en Windows.

Para instalar Git:

  1. (Descargue e inicie el instalador de Git] ( https://git-scm.com/download/win ).
  2. Cuando se le solicite, acepte los componentes predeterminados haciendo clic en Siguiente .
  3. Elija el editor de texto predeterminado. Si tiene Notepad ++ instalado, seleccione Notepad ++ y haga clic en Siguiente .
  4. Seleccione Usar Git en el símbolo del sistema de Windows y haga clic en Siguiente .
  5. Seleccione Usar la biblioteca OpenSSL y haga clic en Siguiente .
  6. Seleccione Checkout Windows-style, confirme los finales de línea de estilo Unix y haga clic en Siguiente .
  7. Seleccione Usar MinTTY (el terminal predeterminado de mYSYS2) y haga clic en Siguiente .
  8. Acepte la configuración de opción adicional predeterminada haciendo clic en Instalar .

Cuando se complete la instalación, es posible que deba reiniciar Windows.

Lanzamiento de GitBash

Para abrir Git Bash, recomendamos iniciar la aplicación desde el símbolo del sistema de Windows:

  1. En Windows, presione Inicio + R para abrir el cuadro de diálogo Ejecutar .
  2. Escribe C:\Program Files\Git\bin\bash.exey presiona Enter .

Generando claves SSH

Primero, cree el directorio SSH y luego genere el par de claves SSH.

Una suposición es que el perfil de Windows que está utilizando está configurado con privilegios administrativos. Dado esto, creará el directorio SSH en la raíz de su perfil, por ejemplo:

C:\Users\joetest
  1. En la línea de comando de Git Bash, cambie a su directorio raíz y escriba.
mkdir .ssh
  1. Cambie al directorio .ssh C:\Users\joetest\.ssh
  2. Para crear las claves, escriba:
ssh-keygen.exe
  1. Cuando se le solicite una contraseña, escriba una contraseña para completar el proceso. Cuando termine, el resultado será similar a:
Ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/joetest/.ssh/id_rsa): /c/Users/joetest/.ssh/
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/joetest/.ssh/
Your public key has been saved in /c/Users/joetest/.ssh/
The key fingerprint is:
SHA256:jieniOIn20935n0awtn04n002HqEIOnTIOnevHzaI5nak [email protected]
The key's randomart image is:

 +---[RSA 2048]----+
 |*= =+.           |
 |O*=.B            |
 |+*o* +           |
 |o +o.  .         |
 | ooo  + S        |
 | .o.ooo* o       |
 |  .+o+*oo .      |
 |   .=+..         |
 |   Eo            |
 +----[SHA256]-----+

$ dir .ssh
id_rsa  id_rsa.pub   

Subiendo una clave SSH

Para cargar la clave SSH pública en su cuenta de  su proveedor :

  1. Abra el portal del servicio , seleccione Cuenta para abrir la página Resumen de cuenta .
  2. En la sección SSH , seleccione Importar clave pública .
  3. Ingrese un nombre de clave . Aunque nombrar una clave es opcional, las etiquetas son una práctica recomendada para administrar varias claves SSH.
  4. Agrega tu clave SSH pública.

Cuando Triton finaliza el proceso de agregar o cargar, la clave SSH pública aparece en la lista de claves SSH.