Developer Guide

  • 2021.2
  • 03/31/2021
  • Public Content
Contents

Program Examples

pthreads - Explicit Submodel

#include <mpi.h> #include <pthread.h> #define n 2 int thread_id[n]; MPI_Comm split_comm[n]; pthread_t thread[n]; void *worker(void *arg) {     int i = *((int*)arg), j = i;     MPI_Comm comm = split_comm[i];     MPI_Allreduce(MPI_IN_PLACE, &j, 1, MPI_INT, MPI_SUM, comm);     printf("Thread %d: allreduce returned %d\n", i, j); } int main() {     MPI_Info info;     int i, provided;     char s[16];     MPI_Init_thread(NULL, NULL, MPI_THREAD_MULTIPLE, &provided);     MPI_Info_create(&info);     for (i = 0; i < n; i++) {         MPI_Comm_dup(MPI_COMM_WORLD, &split_comm[i]);         sprintf(s, "%d", i);         MPI_Info_set(info, "thread_id", s);         MPI_Comm_set_info(split_comm[i], info);         thread_id[i] = i;         pthread_create(&thread[i], NULL, worker, (void*) &thread_id[i]);     }     for (i = 0; i < n; i++) {         pthread_join(thread[i], NULL);     }     MPI_Info_free(&info);     MPI_Finalize(); }

OpenMP Runtime - Implicit Submodel

#include <mpi.h> #include <omp.h> #define n 2 MPI_Comm split_comm[n]; int main() {     int i, provided;     MPI_Init_thread(NULL, NULL, MPI_THREAD_MULTIPLE, &provided);     for (i = 0; i < n; i++)         MPI_Comm_dup(MPI_COMM_WORLD, &split_comm[i]);                                                     #pragma omp parallel for num_threads(n)     for (i = 0; i < n; i++) {         int j = i;         MPI_Allreduce(MPI_IN_PLACE, &j, 1, MPI_INT, MPI_SUM, split_comm[i]);         printf("Thread %d: allreduce returned %d\n", i, j);     }     MPI_Finalize(); }

OpenMP Tasks - Explicit Submodel

#include <mpi.h> #include <omp.h> #define n 2 MPI_Comm split_comm[n]; int main() {     MPI_Info info;     int i, provided;     char s[16];     MPI_Init_thread(NULL, NULL, MPI_THREAD_MULTIPLE, &provided);     MPI_Info_create(&info);     for (i = 0; i < n; i++) {         MPI_Comm_dup(MPI_COMM_WORLD, &split_comm[i]);         sprintf(s, "%d", i);         MPI_Info_set(info, "thread_id", s);         MPI_Comm_set_info(split_comm[i], info);     } #pragma omp parallel num_threads(n)     { #pragma omp task         {             int j = 1;             MPI_Allreduce(MPI_IN_PLACE, &j, 1, MPI_INT, MPI_SUM, split_comm[1]);             printf("OMP thread %d, logical thread %d: allreduce returned %d\n",                     omp_get_thread_num(), 1, j);         } #pragma omp task         {             int j = 0;             MPI_Allreduce(MPI_IN_PLACE, &j, 1, MPI_INT, MPI_SUM, split_comm[0]);             printf("OMP thread %d, logical thread %d: allreduce returned %d\n",                     omp_get_thread_num(), 0, j);         }     }     MPI_Info_free(&info);     MPI_Finalize(); }

Product and Performance Information

1

Performance varies by use, configuration and other factors. Learn more at www.Intel.com/PerformanceIndex.