program workshare !$ use OMP_LIB implicit none real(8), dimension(:), allocatable :: T integer :: Nx1 = 4096+4096, i, j, tnot integer,parameter :: seed = 86456 call srand(seed) ! initialize random number allocate(T(1:Nx1)) do i=1,Nx1 T(i) = rand() end do !$OMP PARALLEL SHARED(T,Nx1) PRIVATE(i,j) DEFAULT(SHARED) tnot = OMP_GET_NUM_THREADS() ! get the total number of threads currently running this PR !$OMP DO SCHEDULE(STATIC,Nx1/tnot) do i=1,Nx1 do j=1,Nx1 T(i) = T(i) + dsqrt(dabs((dcos(T(i))+dsin(T(j)))))/T(j) end do end do !$OMP END DO !$OMP END PARALLEL deallocate(T) end program workshare
#include <stdio.h> #include <time.h> #include <stdlib.h> #include <math.h> #include <omp.h> int main(int argc, char** argv) { int Nx1 = 4096+4096; int i; int j; int tnot; int seed = 86456; double * T = malloc(Nx1 * sizeof(double)); srand(time(NULL)); for ( i = 0; i < Nx1; i++ ) T[i] = rand(); #pragma omp parallel shared(T,Nx1) private(i,j) default(shared) { tnot = omp_get_num_threads(); // get the total number of threads currently running this PR # pragma omp for schedule(static,Nx1/tnot) for ( i = 0; i < Nx1; i++ ) for ( j = 0; j < Nx1; j++ ) T[i] = T[i] + sqrt(abs((cos(T[i]+sin(T[j])))))/T[j]; } free(T); return 0; }