program openmp !=========================================================================! ! OpenMP es un paradigma de programacion paralela de memoria compartida ! ! Se insertan secciones de codigo paralelo entre las directivas: ! ! !$OMP PARALLEL ! ! ..... ! ! !$OMP END PARALLEL ! ! Se compila con la opcion: -fopenmp ! !=========================================================================! use omp_lib integer :: nthreads, id integer :: temp,suma integer :: n=1000 integer,dimension(1000) :: vector,vector1 suma = 0 !$OMP PARALLEL PRIVATE(nthreads) id=omp_get_thread_num() ! obtengo el thread id de turno if (id == 0 ) then nthreads=omp_get_num_threads() ! Para el thread root (0), obtengo la cantidad de threads print*, "Soy thread root (0). el nro de threads es: ",nthreads end if print*, "Hola mi thread id: ", id !$OMP END PARALLEL !============ ejemplo de parelizacion de un loop`======== !$OMP PARALLEL !$OMP DO do i = 1,n vector(i) = i end do !$OMP END DO !$OMP END PARALLEL print *,"vector: ",vector print*, print*, !============ ciertas vars deben ser protegidas en el espacio de memoria del thread ============ !$OMP PARALLEL PRIVATE(temp) SHARED(vector,vector1,n) !$OMP DO do i=1,n temp = vector(i)*2 vector(i) = temp vector1(i) = vector(i)+3 end do !$OMP END DO !$OMP END PARALLEL print*,"vector: ",vector print*,"-----------------------------------------" print*, print*,"vector1: ",vector1 !================== operaciones de reduccion ====================== ! puede ser necesario tener variables que dependan del flujo del loop ! la operacion de reduccion pemite reducir los valores de los distintos threads en uno unico !$OMP PARALLEL !$OMP DO REDUCTION(+:suma) do i = 1,n suma = suma + vector(i) end do !$OMP END DO !$OMP END PARALLEL print*, "suma: ",suma end program openmp