| 288 | |
| 289 | ==== MPI avec OpenMPI ==== |
| 290 | |
| 291 | Dans l'univers vanilla, les tâches MPI ne tourne que sur une seule machine en utilisant tous les cœurs et processeurs demandés dans la limite des capacités de la machine hôte. |
| 292 | |
| 293 | **run.sh** |
| 294 | |
| 295 | run.sh est un script shell pour faire le setup de l'environnement. |
| 296 | |
| 297 | {{{ |
| 298 | #!/bin/bash |
| 299 | |
| 300 | export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib/:${LD_LIBRARY_PATH} |
| 301 | export PATH=/usr/lib64/openmpi/bin/:${PATH} |
| 302 | |
| 303 | mpirun $* |
| 304 | |
| 305 | }}} |
| 306 | |
| 307 | L'executable est compilé au préalable avec : {{{/usr/lib64/mpi/bin/mpicc simple.c -o simple}}} |
| 308 | |
| 309 | **simple.c** |
| 310 | |
| 311 | #include <stdio.h> |
| 312 | #include <mpi.h> |
| 313 | |
| 314 | int main(int argc, char** argv) { |
| 315 | int rank, size; |
| 316 | |
| 317 | // Initialisation de l'environnement MPI |
| 318 | MPI_Init(&argc, &argv); |
| 319 | |
| 320 | // Obtention du rang du processus |
| 321 | MPI_Comm_rank(MPI_COMM_WORLD, &rank); |
| 322 | |
| 323 | // Obtention de la taille du communicateur |
| 324 | MPI_Comm_size(MPI_COMM_WORLD, &size); |
| 325 | |
| 326 | // Affichage du rang et de la taille |
| 327 | printf("Hello from process %d of %d\n", rank, size); |
| 328 | |
| 329 | // Finalisation de l'environnement MPI |
| 330 | MPI_Finalize(); |
| 331 | |
| 332 | return 0; |
| 333 | } |
| 334 | |
| 335 | **simple.submit** |
| 336 | {{{ |
| 337 | universe = vanilla |
| 338 | executable = run.sh |
| 339 | arguments = -np 8 simple |
| 340 | |
| 341 | output = simple.out |
| 342 | error = simple.err |
| 343 | log = simple.log |
| 344 | |
| 345 | should_transfer_files = yes |
| 346 | when_to_transfer_output = on_exit |
| 347 | transfer_input_files = simple |
| 348 | |
| 349 | # Spécifiez le nombre de slots (processus MPI) requis |
| 350 | request_cpus = 1 |
| 351 | request_memory = 1024M |
| 352 | request_disk = 10240K |
| 353 | |
| 354 | #+Requirements = OpSysAndVer =?= "AlmaLinux" |
| 355 | #+Requirements = machine =?= "lpsc-c21.in2p3.fr" |
| 356 | +Requirements = member(machine, {"lpsc-c22.in2p3.fr", "lpsc-c23.in2p3.fr"}) |
| 357 | |
| 358 | queue |
| 359 | |
| 360 | }}} |
| 361 | |
| 362 | ==== MPI avec MPICH ==== |
| 363 | |
| 364 | Dans l'univers vanilla, les tâches MPI ne tourne que sur une seule machine en utilisant tous les cœurs et processeurs demandés dans la limite des capacités de la machine hôte. |
| 365 | |
| 366 | **run.sh** |
| 367 | |
| 368 | run.sh est un script shell pour faire le setup de l'environnement. |
| 369 | |
| 370 | {{{ |
| 371 | #!/bin/bash |
| 372 | |
| 373 | export LD_LIBRARY_PATH=/usr/lib64/mpich/lib/:${LD_LIBRARY_PATH} |
| 374 | export PATH=/usr/lib64/mpich/bin/:${PATH} |
| 375 | |
| 376 | mpirun $* |
| 377 | |
| 378 | |
| 379 | }}} |
| 380 | |
| 381 | L'executable est compilé au préalable avec : {{{/usr/lib64/mpich/bin/mpicc simple.c -o simple}}} |
| 382 | |
| 383 | **simple.c** |
| 384 | |
| 385 | #include <stdio.h> |
| 386 | #include <mpi.h> |
| 387 | |
| 388 | int main(int argc, char** argv) { |
| 389 | int rank, size; |
| 390 | |
| 391 | // Initialisation de l'environnement MPI |
| 392 | MPI_Init(&argc, &argv); |
| 393 | |
| 394 | // Obtention du rang du processus |
| 395 | MPI_Comm_rank(MPI_COMM_WORLD, &rank); |
| 396 | |
| 397 | // Obtention de la taille du communicateur |
| 398 | MPI_Comm_size(MPI_COMM_WORLD, &size); |
| 399 | |
| 400 | // Affichage du rang et de la taille |
| 401 | printf("Hello from process %d of %d\n", rank, size); |
| 402 | |
| 403 | // Finalisation de l'environnement MPI |
| 404 | MPI_Finalize(); |
| 405 | |
| 406 | return 0; |
| 407 | } |
| 408 | |
| 409 | **simple.submit** |
| 410 | {{{ |
| 411 | universe = vanilla |
| 412 | executable = run.sh |
| 413 | |
| 414 | # Attention au chemin relatif pour l'executable avec MPICH: ./simple et pas simple |
| 415 | arguments = -np 8 ./simple |
| 416 | |
| 417 | output = simple.out |
| 418 | error = simple.err |
| 419 | log = simple.log |
| 420 | |
| 421 | should_transfer_files = yes |
| 422 | when_to_transfer_output = on_exit |
| 423 | transfer_input_files = simple |
| 424 | |
| 425 | # Spécifiez le nombre de slots (processus MPI) requis |
| 426 | request_cpus = 1 |
| 427 | request_memory = 1024M |
| 428 | request_disk = 10240K |
| 429 | |
| 430 | #+Requirements = OpSysAndVer =?= "AlmaLinux" |
| 431 | #+Requirements = machine =?= "lpsc-c21.in2p3.fr" |
| 432 | +Requirements = member(machine, {"lpsc-c22.in2p3.fr", "lpsc-c23.in2p3.fr"}) |
| 433 | |
| 434 | queue |
| 435 | |
| 436 | }}} |
| 437 | |