====== 6. Cvičení - Paralelní programy pro DMS (jazyk C + MPI) ======
Znění úkolů pro cvičení: {{courses:B4M35PAP:tutorials:06:06_cviceni_zadani.pdf|}} \\ \\
Dokumentace a specifikace Open-MPI
* https://www.open-mpi.org/
* https://www.open-mpi.org/doc/v2.1/
Tutoriál Wes Kendall
* http://mpitutorial.com/
* https://github.com/wesleykendall/mpitutorial
Program pro úkol č.2 (testovací program):
#include
#include "mpi.h"
int main(int argc, char *argv[]) {
int numprocs, rank, namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(processor_name, &namelen);
printf("Hello from process %d out of %d on %s\n",
rank, numprocs, processor_name);
MPI_Finalize();
return 0;
}
\\ \\
------------------------------
==== Linux: ====
**Kompilace:**
mpiCC progam.c -lm -o program
\\
Pro **spouštění programů** se používá mpirun. Postupujte v těchto krocích:
1. Vygenerovat ssh
/usr/bin/ssh-keygen -N "" -t ecdsa -f ~/.ssh/id_ecdsa
cd ~/.ssh/
cat id_ecdsa.pub >> authorized_keys
chmod -c 600 authorized_keys
nebo jednodušeji
ssh-keygen
ssh-copy-id login@localhost
''ssh-copy-id'' zajistí zkopírování veřejného klíče ''~/.ssh/id_rsa.pub'' nebo ''~/.ssh/id_ecdsa'' do ''authorized_keys' cílového počítače. V tomto případě na vlastní počítač přes SSH. Je přitom nutné zapsat heslo k vašemu účtu. Na další počítače v laboratoři již není třeba klíče kopírovat, protože na všech je váš domovský adresář s klíči montovaný ze shodného zdroje na NFS. Adresář se ale na jednotlivé stanice připojuje až po prvním přihlášení studenta, která vyžaduje uvést heslo. Adresy počítačů v laboratoři jsou ve tvaru ''192.168.202.101'' až ''192.168.202.120''.
2. nejprve s pomoci ssh se prihlasit na vypucetni uzly
3. Spustit
mpirun --host 192.168.202.101,192.168.202.102 -np 2 ./program
\\ \\
**Zjištění IP adresy:** \\
Pro zjištění IP adresy počítače můžete použít následující kód. Za to patří dík Martinovi Velekovi. Poznámka: Pointer, který vrací getenv() používejte pouze pro čtení řetězce, na který ukazuje. Další volání getenv() může změnit jeho obsah.
#include
char* remote_ip = getenv("SSH_CONNECTION");
char localhost[] = "localhost";
char * pch;
if(NULL != remote_ip)
{
pch=strchr(remote_ip,' ');
pch=strchr(++pch,' ');
remote_ip = ++pch;
}
else remote_ip = localhost;
\\ \\
------------------------------
==== Windows: ====
**Kompilace:**
Nastavení NetBeans pro správnou kompilaci vytvářených programů:
Soubor -> Project Properties:
C Compiler:
- Include directories: .../Program Files/MPICH2/include
Linker:
- Additional Library directories: .../Program Files/MPICH2/lib
- Libraries: mpi.lib
Kompilace programu program.c **z příkazového řádku** Cygwin "Cygwin Bash Shell" (čili bez použití NetBeans) pomocí g++ (gcc, mpiCC):
g++ program.c -I"C:\Program Files\MPICH2\include" -L"C:\Program Files\MPICH2\lib" -lmpi
\\ \\
Pro **spouštění MPICH2 programů** se používá mpiexec.exe. Na každém uzlu/počítači musí běžet smpd.exe (manažér MPICH2 procesů). Program mpiexec.exe můžete ovládat z příkazové řádky, nebo pomocí grafického rozhraní wmpiexec.exe. Na obrázku níže je uveden příklad jak lze spouštět program.
\\
{{courses:B4M35PAP:tutorials:06:wmpiexec.jpg|}}
\\ \\
Dostupnost a jména okolních počítačů lze zjistit pomocí wmpiconfig.exe jak ilustruje obrázek níže (zeleně zvýrazněné položky jsou dostupné). Nejdřív třeba kliknout na **Get Hosts**, pak na **Scan Hosts**.
\\
{{courses:B4M35PAP:tutorials:06:wmpiconfig.jpg|}}
\\
**Pozn.: Nezapomeňte mít potřebné knihovny v adresáři s vlastním programem (typicky: cyggcc_s-1.dll, cyggomp-1.dll, cygstdc++-6.dll, cygwin1.dll).**
\\ \\