From 619f5027ad442a1ac994c618d3fb6c9a29ce319b Mon Sep 17 00:00:00 2001 From: xieyihui Date: Wed, 7 Dec 2022 23:00:37 +0800 Subject: [PATCH] Add new test cases for OpenMP optimization and modify the test method --- ...d-test-cases-for-openmp-optimization.patch | 1492 ++++++++++++----- flang.spec | 10 +- 2 files changed, 1046 insertions(+), 456 deletions(-) diff --git a/4-add-test-cases-for-openmp-optimization.patch b/4-add-test-cases-for-openmp-optimization.patch index 61637e0..ca652ac 100644 --- a/4-add-test-cases-for-openmp-optimization.patch +++ b/4-add-test-cases-for-openmp-optimization.patch @@ -1,27 +1,338 @@ -From 22be02d7a701ced84b8f8b5b575f7f2d07e0524b Mon Sep 17 00:00:00 2001 +From 7d436b81de679f3e13810a8e91395d3e15b3878b Mon Sep 17 00:00:00 2001 From: xieyihui -Date: Fri, 11 Nov 2022 13:15:51 +0800 -Subject: [PATCH] Add test cases for openmp optimization +Date: Thu, 8 Dec 2022 10:52:07 +0800 +Subject: [PATCH] Add test cases for OpenMP optimizations +diff --git a/test/openmp_optimization/fortran_func001.f90 b/test/openmp_optimization/fortran_func001.f90 +new file mode 100644 +index 0000000..239b5aa +--- /dev/null ++++ b/test/openmp_optimization/fortran_func001.f90 +@@ -0,0 +1,13 @@ ++subroutine f(a, b) ++ integer :: a(100), b(100) ++ !$omp parallel do ++ do i = 1, 100 ++ a(i) = i ++ end do ++ !$omp end parallel do ++ !$omp parallel do ++ do i = 1, 100 ++ b(i) = i ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func002.f90 b/test/openmp_optimization/fortran_func002.f90 +new file mode 100644 +index 0000000..dbd669d +--- /dev/null ++++ b/test/openmp_optimization/fortran_func002.f90 +@@ -0,0 +1,10 @@ ++subroutine f(a) ++ integer :: a(100) ++ !$omp parallel ++ !$omp do ++ do i = 1, 100 ++ a(i) = i ++ end do ++ !$omp end do ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func004.f90 b/test/openmp_optimization/fortran_func004.f90 +new file mode 100644 +index 0000000..1e3c0e6 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func004.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, b, c, d) ++ integer :: a(100), b(100), c(100), d(100) ++ !$omp parallel ++ !$omp do ++ do i = 1, 100 ++ a(i) = d(i) ++ end do ++ !$omp end do ++ !$omp do ++ do i = 1, 100 ++ b(i) = c(i) ++ end do ++ !$omp end do ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func005.f90 b/test/openmp_optimization/fortran_func005.f90 +new file mode 100644 +index 0000000..81fc5d8 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func005.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, b) ++ integer :: a(100), b(100) ++ !$omp parallel ++ !$omp do ++ do i = 1, 99, 2 ++ a(i) = b(i) ++ end do ++ !$omp end do ++ !$omp do ++ do i = 2, 100, 2 ++ a(i) = b(i) ++ end do ++ !$omp end do ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func007.f90 b/test/openmp_optimization/fortran_func007.f90 +new file mode 100644 +index 0000000..e638b63 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func007.f90 +@@ -0,0 +1,7 @@ ++subroutine add1(s) ++ use omp_lib ++ real :: s ++ !$omp critical ++ s = s + 1 ++ !$omp end critical ++end subroutine add1 +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func008.f90 b/test/openmp_optimization/fortran_func008.f90 +new file mode 100644 +index 0000000..04dd669 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func008.f90 +@@ -0,0 +1,10 @@ ++subroutine add1(s, n) ++ use omp_lib ++ real :: s ++ integer :: n ++ !$omp parallel do ++ do i = 1, n ++ s = s + 1 ++ end do ++ !$omp end parallel do ++end subroutine add1 +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func009.f90 b/test/openmp_optimization/fortran_func009.f90 +new file mode 100644 +index 0000000..69e63f0 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func009.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, n) ++ integer :: a(100) ++ integer :: n ++ !$omp parallel do ++ do i = 1, 100 ++ a(i) = i + 1 ++ end do ++ !$omp end parallel do ++ !$omp parallel do ++ do i = 1, 100 ++ a(i) = i + a(i) ++ end do ++ !$omp end parallel do ++ n = n + 1 ++end +\ No newline at end of file diff --git a/test/openmp_optimization/fortran_func010.f90 b/test/openmp_optimization/fortran_func010.f90 new file mode 100644 -index 0000000..2c0b65e +index 0000000..20de122 --- /dev/null +++ b/test/openmp_optimization/fortran_func010.f90 @@ -0,0 +1,6 @@ -+subroutine f(a, b, c) -+ integer :: a(10000000), b(10000000), c(10000000) ++subroutine f(a, b, c, d) ++ integer :: a(10000000), b(10000000), c(10000000), d(10000000) + do i = 2, 10000000 -+ a(i) = a(i - 1) + b(i) * c(i) ++ a(i) = a(i - 1) + b(i) * c(i) / d(i) * b(i) ++ end do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func011.f90 b/test/openmp_optimization/fortran_func011.f90 +new file mode 100644 +index 0000000..2481284 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func011.f90 +@@ -0,0 +1,8 @@ ++subroutine f(a) ++ integer :: a(10000) ++ !$omp parallel do schedule (static, 1) ++ do i = 1, 10000 ++ a(i) = a(i) + 1 ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func012.f90 b/test/openmp_optimization/fortran_func012.f90 +new file mode 100644 +index 0000000..991e5f0 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func012.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, b) ++ integer :: a(1000), b(1000) ++ !$omp parallel ++ !$omp do private(a) ++ do i = 1, 1000 ++ temp = a(i) ++ end do ++ !$omp end do ++ !$omp do private(a) ++ do i = 1, 1000 ++ temp = b(i) ++ end do ++ !$omp end do ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func013.f90 b/test/openmp_optimization/fortran_func013.f90 +new file mode 100644 +index 0000000..7dd2e50 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func013.f90 +@@ -0,0 +1,9 @@ ++subroutine add1(s) ++ use omp_lib ++ real :: s(10000) ++ !$omp parallel do ++ do i = 1, 10000 ++ s(i) = i + 1 ++ end do ++ !$omp end parallel do ++end subroutine add1 +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func014.f90 b/test/openmp_optimization/fortran_func014.f90 +new file mode 100644 +index 0000000..cd1eed7 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func014.f90 +@@ -0,0 +1,7 @@ ++subroutine f() ++ !$omp parallel ++ !$omp end parallel ++ !$omp parallel ++ call foo() ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func015.f90 b/test/openmp_optimization/fortran_func015.f90 +new file mode 100644 +index 0000000..3283902 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func015.f90 +@@ -0,0 +1,7 @@ ++subroutine f(a, b, c) ++ integer :: a(1000000), b(1000000), c(1000000) ++ do i = 1, 1000000 ++ x = (b(i) + c(i)) / 2 ++ a(i) = a(i + 1) + x ++ end do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func016.f90 b/test/openmp_optimization/fortran_func016.f90 +new file mode 100644 +index 0000000..a826cc5 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func016.f90 +@@ -0,0 +1,7 @@ ++subroutine f(a, b, c) ++ integer :: a(1000000), b(1000000), c(1000000) ++ do i = 1, 1000000 ++ b(i) = b(i) + a(i - 1) ++ a(i) = a(i) + c(i) ++ end do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func017.f90 b/test/openmp_optimization/fortran_func017.f90 +new file mode 100644 +index 0000000..fd8b6e6 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func017.f90 +@@ -0,0 +1,17 @@ ++subroutine f(x, y) ++ integer, pointer :: x(:) ++ integer, pointer :: y ++ integer :: n = 512 ++ integer :: l ++ integer :: k ++ integer :: m ++ l = x(1) ++ a = n + l ++ !$omp parallel do firstprivate(x, y, n, l, a) ++ do i = 1, n ++ k = y ++ m = n * k ++ x(i) = m + a * l * i ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func018.f90 b/test/openmp_optimization/fortran_func018.f90 +new file mode 100644 +index 0000000..00ece0b +--- /dev/null ++++ b/test/openmp_optimization/fortran_func018.f90 +@@ -0,0 +1,13 @@ ++subroutine f(a, t) ++ integer :: a(100000), t ++ logical :: b = .FALSE. ++ !$omp parallel shared(a, b) ++ !$omp do ++ do i = 1, 100000 ++ if (a(i) == t) then ++ b = .TRUE. ++ end if + end do ++ !$omp end do ++ !$omp end parallel +end \ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func019.f90 b/test/openmp_optimization/fortran_func019.f90 +new file mode 100644 +index 0000000..c893706 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func019.f90 +@@ -0,0 +1,14 @@ ++subroutine f(a, b) ++ integer :: a(10000), b(10000) ++ integer :: max = -1 ++ !$omp parallel do shared(a, b, max) ++ do i =1, 10000 ++ b(i) = 0.5 * a(i) ++ !$omp critical ++ if (b(i) > max) then ++ max = b(i) ++ end if ++ !$omp end critical ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_func020.f90 b/test/openmp_optimization/fortran_func020.f90 +new file mode 100644 +index 0000000..dec0737 +--- /dev/null ++++ b/test/openmp_optimization/fortran_func020.f90 +@@ -0,0 +1,11 @@ ++subroutine f(a, b) ++ use omp_lib ++ integer :: a(32), b(32), tid ++ !$omp parallel private(tid) shared(a, b) ++ tid = omp_get_thread_num() ++ do i = 1, 100 ++ call work(a, b) ++ end do ++ !$omp end parallel ++end ++ diff --git a/test/openmp_optimization/fortran_main001.f90 b/test/openmp_optimization/fortran_main001.f90 new file mode 100644 -index 0000000..2ef72a2 +index 0000000..7dfe448 --- /dev/null +++ b/test/openmp_optimization/fortran_main001.f90 -@@ -0,0 +1,28 @@ +@@ -0,0 +1,19 @@ +! Test optimizaton for fortran use openmp about parallel region merge +! +program main @@ -31,16 +342,7 @@ index 0000000..2ef72a2 + integer :: b(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel do -+ do i = 1, 100 -+ a(i) = i -+ end do -+ !$omp end parallel do -+ !$omp parallel do -+ do i = 1, 100 -+ b(i) = i -+ end do -+ !$omp end parallel do ++ call f(a, b) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -53,10 +355,10 @@ index 0000000..2ef72a2 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main002.f90 b/test/openmp_optimization/fortran_main002.f90 new file mode 100644 -index 0000000..84302b4 +index 0000000..9059ded --- /dev/null +++ b/test/openmp_optimization/fortran_main002.f90 -@@ -0,0 +1,25 @@ +@@ -0,0 +1,19 @@ +! Test optimizaton for fortran use openmp about implicit nowait at end +! of parallel region +! @@ -66,13 +368,7 @@ index 0000000..84302b4 + integer :: a(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel -+ !$omp do -+ do i = 1, 100 -+ a(i) = i -+ end do -+ !$omp end do -+ !$omp end parallel ++ call f(a) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -123,10 +419,10 @@ index 0000000..687127f \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main004.f90 b/test/openmp_optimization/fortran_main004.f90 new file mode 100644 -index 0000000..1ce7826 +index 0000000..679c7e3 --- /dev/null +++ b/test/openmp_optimization/fortran_main004.f90 -@@ -0,0 +1,33 @@ +@@ -0,0 +1,22 @@ +! Test optimizaton for fortran use openmp about remove the redundant +! barrier +! @@ -136,18 +432,7 @@ index 0000000..1ce7826 + integer :: a(100), b(100), c(100), d(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel -+ !$omp do -+ do i = 1, 100 -+ a(i) = d(i) -+ end do -+ !$omp end do -+ !$omp do -+ do i = 1, 100 -+ b(i) = c(i) -+ end do -+ !$omp end do -+ !$omp end parallel ++ call f(a, b, c, d) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -163,10 +448,10 @@ index 0000000..1ce7826 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main005.f90 b/test/openmp_optimization/fortran_main005.f90 new file mode 100644 -index 0000000..f79d9d7 +index 0000000..af058f6 --- /dev/null +++ b/test/openmp_optimization/fortran_main005.f90 -@@ -0,0 +1,33 @@ +@@ -0,0 +1,22 @@ +! Test optimizaton for fortran use openmp about remove the redundant +! barrier +! @@ -176,18 +461,7 @@ index 0000000..f79d9d7 + integer :: a(100), b(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel -+ !$omp do -+ do i = 1, 99, 2 -+ a(i) = b(i) -+ end do -+ !$omp end do -+ !$omp do -+ do i = 2, 100, 2 -+ a(i) = b(i) -+ end do -+ !$omp end do -+ !$omp end parallel ++ call f(a, b) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -236,19 +510,12 @@ index 0000000..653a0c9 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main007.f90 b/test/openmp_optimization/fortran_main007.f90 new file mode 100644 -index 0000000..b8feee7 +index 0000000..7aac1b3 --- /dev/null +++ b/test/openmp_optimization/fortran_main007.f90 -@@ -0,0 +1,25 @@ +@@ -0,0 +1,18 @@ +! Test optimizaton for fortran use openmp about orphaned directives +! -+subroutine add1(s) -+ use omp_lib -+ real :: s -+ !$omp critical -+ s = s + 1 -+ !$omp end critical -+end subroutine add1 +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time @@ -268,24 +535,14 @@ index 0000000..b8feee7 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main008.f90 b/test/openmp_optimization/fortran_main008.f90 new file mode 100644 -index 0000000..fac91c0 +index 0000000..6f9af95 --- /dev/null +++ b/test/openmp_optimization/fortran_main008.f90 -@@ -0,0 +1,28 @@ +@@ -0,0 +1,18 @@ +! Test optimizaton for fortran use openmp about alternative code. The +! goal is to have the performance of the serial code if it is faster +! than the parallel +! -+subroutine add1(s, n) -+ use omp_lib -+ real :: s -+ integer :: n -+ !$omp parallel do -+ do i = 1, n -+ s = s + 1 -+ end do -+ !$omp end parallel do -+end subroutine add1 +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time @@ -303,10 +560,10 @@ index 0000000..fac91c0 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main009.f90 b/test/openmp_optimization/fortran_main009.f90 new file mode 100644 -index 0000000..6f219de +index 0000000..985e748 --- /dev/null +++ b/test/openmp_optimization/fortran_main009.f90 -@@ -0,0 +1,32 @@ +@@ -0,0 +1,22 @@ +! Test optimizaton for fortran use openmp about parallel region expand +! +program main @@ -316,17 +573,7 @@ index 0000000..6f219de + integer :: n = 0 + starttime = omp_get_wtime() + do while (n <= 100000) -+ !$omp parallel do -+ do i = 1, 100 -+ a(i) = i + 1 -+ end do -+ !$omp end parallel do -+ !$omp parallel do -+ do i = 1, 100 -+ a(i) = i + a(i) -+ end do -+ !$omp end parallel do -+ n = n + 1 ++ call f(a, n) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -342,36 +589,40 @@ index 0000000..6f219de \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main010.f90 b/test/openmp_optimization/fortran_main010.f90 new file mode 100644 -index 0000000..9542916 +index 0000000..7bcc705 --- /dev/null +++ b/test/openmp_optimization/fortran_main010.f90 -@@ -0,0 +1,19 @@ -+! Test optimizaton for fortran use openmp about partial simd +@@ -0,0 +1,23 @@ ++! Test optimizaton for fortran use openmp about partial parallel +! +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time -+ integer :: a(10000000), b(10000000), c(10000000) ++ integer :: a(10000000), b(10000000), c(10000000), d(10000000) + do i = 1, 10000000 + a(i) = i + b(i) = i + c(i) = i ++ d(i) = i + end do + starttime = omp_get_wtime() -+ do i = 1, 50 -+ call f(a, b, c) ++ do i = 1, 100 ++ call f(a, b, c, d) + end do + endtime = omp_get_wtime() + time = endtime - starttime -+print *, time ++ print *, time +end program main ++ ++! Reference ++! https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#dpcpp-cpp \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main011.f90 b/test/openmp_optimization/fortran_main011.f90 new file mode 100644 -index 0000000..0c53aea +index 0000000..b2cfa65 --- /dev/null +++ b/test/openmp_optimization/fortran_main011.f90 -@@ -0,0 +1,25 @@ +@@ -0,0 +1,21 @@ +! Test optimizaton for fortran use openmp about avoid false sharing +! +program main @@ -384,15 +635,11 @@ index 0000000..0c53aea + end do + starttime = omp_get_wtime() + do n = 1, 50000 -+ !$omp parallel do schedule (static, 1) -+ do i = 1, 10000 -+ a(i) = a(i) + 1 -+ end do -+ !$omp end parallel do ++ call f(a) + end do + endtime = omp_get_wtime() + time = endtime - starttime -+print *, time ++ print *, time +end program main + +! Reference @@ -400,10 +647,10 @@ index 0000000..0c53aea \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main012.f90 b/test/openmp_optimization/fortran_main012.f90 new file mode 100644 -index 0000000..2a02961 +index 0000000..0d4841a --- /dev/null +++ b/test/openmp_optimization/fortran_main012.f90 -@@ -0,0 +1,29 @@ +@@ -0,0 +1,18 @@ +! Test optimizaton for fortran use openmp about variable attributes +! +program main @@ -413,18 +660,7 @@ index 0000000..2a02961 + integer :: temp + starttime = omp_get_wtime() + do n = 1, 5000 -+ !$omp parallel -+ !$omp do private(a) -+ do i = 1, 1000 -+ temp = a(i) -+ end do -+ !$omp end do -+ !$omp do private(a) -+ do i = 1, 1000 -+ temp = b(i) -+ end do -+ !$omp end do -+ !$omp end parallel ++ call f(a, b) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -436,22 +672,13 @@ index 0000000..2a02961 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main013.f90 b/test/openmp_optimization/fortran_main013.f90 new file mode 100644 -index 0000000..f7eb485 +index 0000000..22ec5dd --- /dev/null +++ b/test/openmp_optimization/fortran_main013.f90 -@@ -0,0 +1,27 @@ +@@ -0,0 +1,18 @@ +! Test optimizaton for fortran use openmp about parallel region +! reconstruction +! -+subroutine add1(s) -+ use omp_lib -+ real :: s(10000) -+ !$omp parallel do -+ do i = 1, 10000 -+ s(i) = i + 1 -+ end do -+ !$omp end parallel do -+end subroutine add1 +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time @@ -470,10 +697,10 @@ index 0000000..f7eb485 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main014.f90 b/test/openmp_optimization/fortran_main014.f90 new file mode 100644 -index 0000000..5e6f6b7 +index 0000000..06bcea5 --- /dev/null +++ b/test/openmp_optimization/fortran_main014.f90 -@@ -0,0 +1,24 @@ +@@ -0,0 +1,20 @@ +! Test optimizaton for fortran use openmp about parallel removing +! parallel region with no side-effects +! @@ -485,11 +712,7 @@ index 0000000..5e6f6b7 + real(kind = 8) :: starttime, endtime, time + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel -+ !$omp end parallel -+ !$omp parallel -+ call foo() -+ !$omp end parallel ++ call f() + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -501,10 +724,10 @@ index 0000000..5e6f6b7 \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main015.f90 b/test/openmp_optimization/fortran_main015.f90 new file mode 100644 -index 0000000..9c9ee4d +index 0000000..f1c593c --- /dev/null +++ b/test/openmp_optimization/fortran_main015.f90 -@@ -0,0 +1,28 @@ +@@ -0,0 +1,25 @@ +! Test optimizaton for fortran use openmp about remove dependencies +! +program main @@ -521,14 +744,11 @@ index 0000000..9c9ee4d + end do + starttime = omp_get_wtime() + do w = 1, 100 -+ do i = 1, 1000000 -+ x = (b(i) + c(i)) / 2 -+ a(i) = a(i + 1) + x -+ end do ++ call f(a, b, c) + end do + endtime = omp_get_wtime() + time = endtime - starttime -+print *, time ++ print *, time +end program main + +! Reference @@ -536,10 +756,10 @@ index 0000000..9c9ee4d \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main016.f90 b/test/openmp_optimization/fortran_main016.f90 new file mode 100644 -index 0000000..4aa262e +index 0000000..e33bfcb --- /dev/null +++ b/test/openmp_optimization/fortran_main016.f90 -@@ -0,0 +1,27 @@ +@@ -0,0 +1,24 @@ +! Test optimizaton for fortran use openmp about remove dependencies +! +program main @@ -555,14 +775,11 @@ index 0000000..4aa262e + end do + starttime = omp_get_wtime() + do w = 1, 1000 -+ do i = 1, 1000000 -+ b(i) = b(i) + a(i - 1) -+ a(i) = a(i) + c(i) -+ end do ++ call f(a, b, c) + end do + endtime = omp_get_wtime() + time = endtime - starttime -+print *, time ++ print *, time +end program main + +! Reference @@ -570,30 +787,12 @@ index 0000000..4aa262e \ No newline at end of file diff --git a/test/openmp_optimization/fortran_main017.f90 b/test/openmp_optimization/fortran_main017.f90 new file mode 100644 -index 0000000..014f0b6 +index 0000000..6cd5232 --- /dev/null +++ b/test/openmp_optimization/fortran_main017.f90 -@@ -0,0 +1,53 @@ +@@ -0,0 +1,35 @@ +! Test optimizaton for fortran use openmp about communication +! -+subroutine f(x, y) -+ integer, pointer :: x(:) -+ integer, pointer :: y -+ integer :: n = 512 -+ integer :: l -+ integer :: k -+ integer :: m -+ l = x(1) -+ a = n + l -+ !$omp parallel do firstprivate(x, y, n, l, a) -+ do i = 1, n -+ k = y -+ m = n * k -+ x(i) = m + a * l * i -+ end do -+ !$omp end parallel do -+end -+ +program main + use omp_lib + interface @@ -628,30 +827,447 @@ index 0000000..014f0b6 +! IWOMP 2018. Lecture Notes in Computer Science(), vol 11128. Springer, +! Cham. https://doi.org/10.1007/978-3-319-98521-3_8 \ No newline at end of file -diff --git a/test/openmp_optimization/fortran_optimized_func010.f90 b/test/openmp_optimization/fortran_optimized_func010.f90 +diff --git a/test/openmp_optimization/fortran_main018.f90 b/test/openmp_optimization/fortran_main018.f90 +new file mode 100644 +index 0000000..97c8bb2 +--- /dev/null ++++ b/test/openmp_optimization/fortran_main018.f90 +@@ -0,0 +1,21 @@ ++! Test optimizaton for fortran use openmp about use cancel construction ++! ++program main ++ use omp_lib ++ real(kind = 8) :: starttime, endtime, time ++ integer :: a(100000) ++ integer :: t = 50000 ++ do i = 1, 100000 ++ a(i) = i ++ end do ++ starttime = omp_get_wtime() ++ do i = 1, 100000 ++ call f(a, t) ++ end do ++ endtime = omp_get_wtime() ++ time = endtime - starttime ++ print *, time ++end ++ ++! Reference ++! https://www.cines.fr/wp-content/uploads/2014/10/lesson3_slides.pdf +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_main019.f90 b/test/openmp_optimization/fortran_main019.f90 +new file mode 100644 +index 0000000..ec85db7 +--- /dev/null ++++ b/test/openmp_optimization/fortran_main019.f90 +@@ -0,0 +1,21 @@ ++! Test optimizaton for fortran use openmp about Reduce threads ++! synchronisations about critical ++! ++program main ++ use omp_lib ++ real(kind = 8) :: starttime, endtime, time ++ integer :: a(10000), b(10000) ++ do i = 1, 10000 ++ a(i) = i ++ end do ++ starttime = omp_get_wtime() ++ do n = 1, 200 ++ call f(a, b) ++ end do ++ endtime = omp_get_wtime() ++ time = endtime - starttime ++ print *, time ++end program main ++ ++! Reference ++! https://www.cines.fr/wp-content/uploads/2014/10/lesson3_slides.pdf +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_main020.f90 b/test/openmp_optimization/fortran_main020.f90 +new file mode 100644 +index 0000000..51da303 +--- /dev/null ++++ b/test/openmp_optimization/fortran_main020.f90 +@@ -0,0 +1,21 @@ ++! Test optimizaton for fortran use openmp about Change the way ++! variables are passed ++! ++program main ++ use omp_lib ++ real(kind = 8) :: starttime, endtime, time ++ integer :: a(32), b(32) ++ starttime = omp_get_wtime() ++ do i = 1, 100000 ++ call f(a, b) ++ end do ++ endtime = omp_get_wtime() ++ time = endtime - starttime ++ print *, time ++end ++subroutine work(a, b) ++ a = a + 1 ++ b = b + 1 ++end ++! Reference ++! 孙志刚. 基于键涨落模型数值模拟的并行优化[D].山东大学,2013. +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func001.f90 b/test/openmp_optimization/fortran_optimized_func001.f90 +new file mode 100644 +index 0000000..b2f0bc3 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func001.f90 +@@ -0,0 +1,9 @@ ++subroutine f(a, b) ++ integer :: a(100), b(100) ++ !$omp parallel do ++ do i = 1, 100 ++ a(i) = i ++ b(i) = i ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func002.f90 b/test/openmp_optimization/fortran_optimized_func002.f90 +new file mode 100644 +index 0000000..55a8af2 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func002.f90 +@@ -0,0 +1,10 @@ ++subroutine f(a) ++ integer :: a(100) ++ !$omp parallel ++ !$omp do ++ do i = 1, 100 ++ a(i) = i ++ end do ++ !$omp end do nowait ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func004.f90 b/test/openmp_optimization/fortran_optimized_func004.f90 +new file mode 100644 +index 0000000..d98e388 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func004.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, b, c, d) ++ integer :: a(100), b(100), c(100), d(100) ++ !$omp parallel ++ !$omp do ++ do i = 1, 100 ++ a(i) = d(i) ++ end do ++ !$omp end do nowait ++ !$omp do ++ do i = 1, 100 ++ b(i) = c(i) ++ end do ++ !$omp end do nowait ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func005.f90 b/test/openmp_optimization/fortran_optimized_func005.f90 +new file mode 100644 +index 0000000..69e4b7b +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func005.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, b) ++ integer :: a(100), b(100) ++ !$omp parallel ++ !$omp do ++ do i = 1, 99, 2 ++ a(i) = b(i) ++ end do ++ !$omp end do nowait ++ !$omp do ++ do i = 2, 100, 2 ++ a(i) = b(i) ++ end do ++ !$omp end do nowait ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func007.f90 b/test/openmp_optimization/fortran_optimized_func007.f90 +new file mode 100644 +index 0000000..826dcbc +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func007.f90 +@@ -0,0 +1,11 @@ ++subroutine add1(s) ++ use omp_lib ++ real :: s ++ if(omp_in_parallel()) then ++ !$omp critical ++ s = s + 1 ++ !$omp end critical ++ else ++ s = s + 1 ++ end if ++end subroutine add1 +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func008.f90 b/test/openmp_optimization/fortran_optimized_func008.f90 +new file mode 100644 +index 0000000..d43d572 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func008.f90 +@@ -0,0 +1,16 @@ ++subroutine add1(s, n) ++ use omp_lib ++ real :: s ++ integer :: n ++ if(n > 10000) then ++ !$omp parallel do ++ do i = 1, n ++ s = s + 1 ++ end do ++ !$omp end parallel do ++ else ++ do i = 1, n ++ s = s + 1 ++ end do ++ end if ++end subroutine add1 +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func009.f90 b/test/openmp_optimization/fortran_optimized_func009.f90 +new file mode 100644 +index 0000000..6850535 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func009.f90 +@@ -0,0 +1,18 @@ ++subroutine f(a, n) ++ integer :: a(100) ++ integer :: n ++ !$omp do ++ do i = 1, 100 ++ a(i) = i + 1 ++ end do ++ !$omp end do ++ !$omp do ++ do i = 1, 100 ++ a(i) = i + a(i) ++ end do ++ !$omp end do ++ !$omp master ++ n = n + 1 ++ !$omp end master ++ !$omp barrier ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func010.f90 b/test/openmp_optimization/fortran_optimized_func010.f90 +new file mode 100644 +index 0000000..d9061f0 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func010.f90 +@@ -0,0 +1,11 @@ ++subroutine f(a, b, c, d, e) ++ integer :: a(10000000), b(10000000), c(10000000), d(10000000), e(10000000) ++ !$omp parallel do ++ do i = 2, 10000000 ++ d(i) = b(i) * c(i) / e(i) * b(i) ++ end do ++ !$omp end parallel do ++ do i = 2, 10000000 ++ a(i) = a(i - 1) + d(i) ++ end do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func011.f90 b/test/openmp_optimization/fortran_optimized_func011.f90 +new file mode 100644 +index 0000000..5ad2b2e +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func011.f90 +@@ -0,0 +1,8 @@ ++subroutine f(a) ++ integer :: a(10000) ++ !$omp parallel do schedule (static, 1) ++ do i = 1, 10000 ++ a(i) = a(i * 16) + 1 ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func012.f90 b/test/openmp_optimization/fortran_optimized_func012.f90 +new file mode 100644 +index 0000000..abcb3c5 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func012.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, b) ++ integer :: a(1000), b(1000) ++ !$omp parallel private(a) ++ !$omp do ++ do i = 1, 1000 ++ temp = a(i) ++ end do ++ !$omp end do ++ !$omp do ++ do i = 1, 1000 ++ temp = b(i) ++ end do ++ !$omp end do ++!$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func013.f90 b/test/openmp_optimization/fortran_optimized_func013.f90 +new file mode 100644 +index 0000000..088475c +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func013.f90 +@@ -0,0 +1,9 @@ ++subroutine add1(s) ++ use omp_lib ++ real :: s(10000) ++ !$omp do ++ do i = 1, 10000 ++ s(i) = i + 1 ++ end do ++ !$omp end do ++end subroutine add1 +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func014.f90 b/test/openmp_optimization/fortran_optimized_func014.f90 +new file mode 100644 +index 0000000..48248cb +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func014.f90 +@@ -0,0 +1,2 @@ ++subroutine f() ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func015.f90 b/test/openmp_optimization/fortran_optimized_func015.f90 +new file mode 100644 +index 0000000..10da81b +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func015.f90 +@@ -0,0 +1,14 @@ ++subroutine f(a, b, c, a_copy) ++ integer :: a(1000000), b(1000000), c(1000000), a_copy(1000000) ++ !$omp parallel do shared(a_copy) ++ do i = 1, 1000000 ++ a_copy(i) = a(i + 1) ++ end do ++ !$omp end parallel do ++ !$omp parallel do shared(a) ++ do i = 1, 1000000 ++ x = (b(i) + c(i)) / 2 ++ a(i) = a_copy(i) + x ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func016.f90 b/test/openmp_optimization/fortran_optimized_func016.f90 +new file mode 100644 +index 0000000..3defc51 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func016.f90 +@@ -0,0 +1,11 @@ ++subroutine f(a, b, c) ++ integer :: a(1000000), b(1000000), c(1000000) ++ b(1) = b(1) - a(0) ++ !$omp parallel do shared(a, b, c) ++ do i = 2, 1000000 ++ b(i) = b(i) + a(i - 1) ++ a(i) = a(i) + c(i) ++ end do ++ !$omp end parallel do ++ a(1000000 - 1) = a(1000000 - 1) + c(1000000 - 1) ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func017.f90 b/test/openmp_optimization/fortran_optimized_func017.f90 new file mode 100644 -index 0000000..be0920d +index 0000000..ccc88eb --- /dev/null -+++ b/test/openmp_optimization/fortran_optimized_func010.f90 -@@ -0,0 +1,11 @@ -+subroutine f(a, b, c, d) -+ integer :: a(10000000), b(10000000), c(10000000), d(10000000) -+ !$omp parallel do -+ do i = 2, 10000000 -+ d(i) = b(i) * c(i) ++++ b/test/openmp_optimization/fortran_optimized_func017.f90 +@@ -0,0 +1,17 @@ ++subroutine f(x, y) ++ integer, pointer :: x(:) ++ integer, pointer :: y ++ integer :: l ++ integer :: k ++ integer :: m ++ integer :: a ++ l = x(1) ++ k = y ++ m = 512 * k ++ a = 512 + l ++ !$omp parallel do firstprivate(x, m, l, a) ++ do i = 1, 512 ++ x(i) = m + a * l * i ++ end do ++ !$omp end parallel do ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func018.f90 b/test/openmp_optimization/fortran_optimized_func018.f90 +new file mode 100644 +index 0000000..d7dd87a +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func018.f90 +@@ -0,0 +1,14 @@ ++subroutine f(a, t) ++ integer :: a(100000), t ++ logical :: b = .FALSE. ++ !$omp parallel shared(a, b) ++ !$omp do ++ do i = 1, 100000 ++ if (a(i) == t) then ++ b = .TRUE. ++ !$omp cancel do ++ end if + end do -+ !$parallel end do -+ do i = 2, 10000000 -+ a(i) = a(i - 1) + d(i) ++ !$omp end do ++ !$omp end parallel ++end +\ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func019.f90 b/test/openmp_optimization/fortran_optimized_func019.f90 +new file mode 100644 +index 0000000..a7d30da +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func019.f90 +@@ -0,0 +1,16 @@ ++subroutine f(a, b) ++ integer :: a(10000), b(10000) ++ integer :: max = -1 ++ !$omp parallel do shared(a, b, max) ++ do i =1, 10000 ++ b(i) = 0.5 * a(i) ++ if(b(i) > max) then ++ !$omp critical ++ if (b(i) > max) then ++ max = b(i) ++ end if ++ !$omp end critical ++ end if + end do ++ !$omp end parallel do +end \ No newline at end of file +diff --git a/test/openmp_optimization/fortran_optimized_func020.f90 b/test/openmp_optimization/fortran_optimized_func020.f90 +new file mode 100644 +index 0000000..bbc7ac3 +--- /dev/null ++++ b/test/openmp_optimization/fortran_optimized_func020.f90 +@@ -0,0 +1,15 @@ ++subroutine f(a, b) ++ use omp_lib ++ integer :: a(32), b(32), tid, ia, ib ++ !$omp parallel private(tid, ia, ib) shared(a, b) ++ tid = omp_get_thread_num() ++ ia = a(tid) ++ ib = b(tid) ++ do i = 1, 100 ++ call work(ia, ib) ++ end do ++ a(tid) = ia ++ b(tid) = ib ++ !$omp end parallel ++end ++ diff --git a/test/openmp_optimization/optimized_main001.f90 b/test/openmp_optimization/optimized_main001.f90 new file mode 100644 -index 0000000..f3c3cfa +index 0000000..4a7f4dc --- /dev/null +++ b/test/openmp_optimization/optimized_main001.f90 -@@ -0,0 +1,24 @@ +@@ -0,0 +1,19 @@ +! Test optimizaton for fortran use openmp about parallel region merge +! +program main @@ -661,12 +1277,7 @@ index 0000000..f3c3cfa + integer :: b(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel do -+ do i = 1, 100 -+ a(i) = i -+ b(i) = i -+ end do -+ !$omp end parallel do ++ call f(a, b) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -679,10 +1290,10 @@ index 0000000..f3c3cfa \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main002.f90 b/test/openmp_optimization/optimized_main002.f90 new file mode 100644 -index 0000000..8a9a641 +index 0000000..ec4c7fd --- /dev/null +++ b/test/openmp_optimization/optimized_main002.f90 -@@ -0,0 +1,25 @@ +@@ -0,0 +1,19 @@ +! Test optimizaton for fortran use openmp about implicit nowait at end +! of parallel region +! @@ -692,13 +1303,7 @@ index 0000000..8a9a641 + integer :: a(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel -+ !$omp do -+ do i = 1, 100 -+ a(i) = i -+ end do -+ !$omp end do nowait -+ !$omp end parallel ++ call f(a) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -710,10 +1315,10 @@ index 0000000..8a9a641 +! WOMPAT (2001). diff --git a/test/openmp_optimization/optimized_main004.f90 b/test/openmp_optimization/optimized_main004.f90 new file mode 100644 -index 0000000..234aa76 +index 0000000..679c7e3 --- /dev/null +++ b/test/openmp_optimization/optimized_main004.f90 -@@ -0,0 +1,33 @@ +@@ -0,0 +1,22 @@ +! Test optimizaton for fortran use openmp about remove the redundant +! barrier +! @@ -723,18 +1328,7 @@ index 0000000..234aa76 + integer :: a(100), b(100), c(100), d(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel -+ !$omp do -+ do i = 1, 100 -+ a(i) = d(i) -+ end do -+ !$omp end do nowait -+ !$omp do -+ do i = 1, 100 -+ b(i) = c(i) -+ end do -+ !$omp end do nowait -+ !$omp end parallel ++ call f(a, b, c, d) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -750,10 +1344,10 @@ index 0000000..234aa76 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main005.f90 b/test/openmp_optimization/optimized_main005.f90 new file mode 100644 -index 0000000..102e387 +index 0000000..af058f6 --- /dev/null +++ b/test/openmp_optimization/optimized_main005.f90 -@@ -0,0 +1,33 @@ +@@ -0,0 +1,22 @@ +! Test optimizaton for fortran use openmp about remove the redundant +! barrier +! @@ -763,18 +1357,7 @@ index 0000000..102e387 + integer :: a(100), b(100) + starttime = omp_get_wtime() + do n = 1, 100000 -+ !$omp parallel -+ !$omp do -+ do i = 1, 99, 2 -+ a(i) = b(i) -+ end do -+ !$omp end do nowait -+ !$omp do -+ do i = 2, 100, 2 -+ a(i) = b(i) -+ end do -+ !$omp end do nowait -+ !$omp end parallel ++ call f(a, b) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -790,23 +1373,12 @@ index 0000000..102e387 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main007.f90 b/test/openmp_optimization/optimized_main007.f90 new file mode 100644 -index 0000000..5b35421 +index 0000000..7aac1b3 --- /dev/null +++ b/test/openmp_optimization/optimized_main007.f90 -@@ -0,0 +1,29 @@ +@@ -0,0 +1,18 @@ +! Test optimizaton for fortran use openmp about orphaned directives +! -+subroutine add1(s) -+ use omp_lib -+ real :: s -+ if(omp_in_parallel()) then -+ !$omp critical -+ s = s + 1 -+ !$omp end critical -+ else -+ s = s + 1 -+ end if -+end subroutine add1 +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time @@ -826,30 +1398,14 @@ index 0000000..5b35421 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main008.f90 b/test/openmp_optimization/optimized_main008.f90 new file mode 100644 -index 0000000..728c8a8 +index 0000000..6f9af95 --- /dev/null +++ b/test/openmp_optimization/optimized_main008.f90 -@@ -0,0 +1,34 @@ +@@ -0,0 +1,18 @@ +! Test optimizaton for fortran use openmp about alternative code. The +! goal is to have the performance of the serial code if it is faster +! than the parallel +! -+subroutine add1(s, n) -+ use omp_lib -+ real :: s -+ integer :: n -+ if(n > 10000) then -+ !$omp parallel do -+ do i = 1, n -+ s = s + 1 -+ end do -+ !$omp end parallel do -+ else -+ do i = 1, n -+ s = s + 1 -+ end do -+ end if -+end subroutine add1 +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time @@ -867,10 +1423,10 @@ index 0000000..728c8a8 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main009.f90 b/test/openmp_optimization/optimized_main009.f90 new file mode 100644 -index 0000000..fdfc304 +index 0000000..1b67d12 --- /dev/null +++ b/test/openmp_optimization/optimized_main009.f90 -@@ -0,0 +1,37 @@ +@@ -0,0 +1,24 @@ +! Test optimizaton for fortran use openmp about partial simd +! +program main @@ -881,20 +1437,7 @@ index 0000000..fdfc304 + starttime = omp_get_wtime() + !$omp parallel shared(n, a) + do while (n <= 100000) -+ !$omp do -+ do i = 1, 100 -+ a(i) = i + 1 -+ end do -+ !$omp end do -+ !$omp do -+ do i = 1, 100 -+ a(i) = i + a(i) -+ end do -+ !$omp end do -+ !$omp master -+ n = n + 1 -+ !$omp end master -+ !$omp barrier ++ call f(a, n) + end do + !$omp end parallel + endtime = omp_get_wtime() @@ -911,36 +1454,40 @@ index 0000000..fdfc304 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main010.f90 b/test/openmp_optimization/optimized_main010.f90 new file mode 100644 -index 0000000..ca0189f +index 0000000..59d1578 --- /dev/null +++ b/test/openmp_optimization/optimized_main010.f90 -@@ -0,0 +1,19 @@ -+! Test optimizaton for fortran use openmp about partial simd +@@ -0,0 +1,23 @@ ++! Test optimizaton for fortran use openmp about partial parallel +! +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time -+ integer :: a(10000000), b(10000000), c(10000000), d(10000000) ++ integer :: a(10000000), b(10000000), c(10000000), d(10000000), e(10000000) + do i = 1, 10000000 + a(i) = i + b(i) = i + c(i) = i ++ e(i) = i + end do + starttime = omp_get_wtime() -+ do i = 1, 50 -+ call f(a, b, c, d) ++ do i = 1, 100 ++ call f(a, b, c, d, e) + end do + endtime = omp_get_wtime() + time = endtime - starttime +print *, time +end program main ++ ++! Reference ++! https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#dpcpp-cpp \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main011.f90 b/test/openmp_optimization/optimized_main011.f90 new file mode 100644 -index 0000000..dd7fd85 +index 0000000..c4b595b --- /dev/null +++ b/test/openmp_optimization/optimized_main011.f90 -@@ -0,0 +1,25 @@ +@@ -0,0 +1,21 @@ +! Test optimizaton for fortran use openmp about avoid false sharing +! +program main @@ -953,11 +1500,7 @@ index 0000000..dd7fd85 + end do + starttime = omp_get_wtime() + do n = 1, 50000 -+ !$omp parallel do schedule (static, 1) -+ do i = 1, 10000 -+ a(i) = a(i * 16) + 1 -+ end do -+ !$omp end parallel do ++ call f(a) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -969,10 +1512,10 @@ index 0000000..dd7fd85 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main012.f90 b/test/openmp_optimization/optimized_main012.f90 new file mode 100644 -index 0000000..6a2c1f6 +index 0000000..0d4841a --- /dev/null +++ b/test/openmp_optimization/optimized_main012.f90 -@@ -0,0 +1,29 @@ +@@ -0,0 +1,18 @@ +! Test optimizaton for fortran use openmp about variable attributes +! +program main @@ -982,18 +1525,7 @@ index 0000000..6a2c1f6 + integer :: temp + starttime = omp_get_wtime() + do n = 1, 5000 -+ !$omp parallel private(a) -+ !$omp do -+ do i = 1, 1000 -+ temp = a(i) -+ end do -+ !$omp end do -+ !$omp do -+ do i = 1, 1000 -+ temp = b(i) -+ end do -+ !$omp end do -+ !$omp end parallel ++ call f(a, b) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -1005,22 +1537,13 @@ index 0000000..6a2c1f6 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main013.f90 b/test/openmp_optimization/optimized_main013.f90 new file mode 100644 -index 0000000..f5b1ae6 +index 0000000..2f972d2 --- /dev/null +++ b/test/openmp_optimization/optimized_main013.f90 -@@ -0,0 +1,29 @@ +@@ -0,0 +1,20 @@ +! Test optimizaton for fortran use openmp about parallel region +! reconstruction +! -+subroutine add1(s) -+ use omp_lib -+ real :: s(10000) -+ !$omp do -+ do i = 1, 10000 -+ s(i) = i + 1 -+ end do -+ !$omp end do -+end subroutine add1 +program main + use omp_lib + real(kind = 8) :: starttime, endtime, time @@ -1041,7 +1564,7 @@ index 0000000..f5b1ae6 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main014.f90 b/test/openmp_optimization/optimized_main014.f90 new file mode 100644 -index 0000000..96393d0 +index 0000000..06bcea5 --- /dev/null +++ b/test/openmp_optimization/optimized_main014.f90 @@ -0,0 +1,20 @@ @@ -1056,7 +1579,7 @@ index 0000000..96393d0 + real(kind = 8) :: starttime, endtime, time + starttime = omp_get_wtime() + do n = 1, 100000 -+ ++ call f() + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -1068,10 +1591,10 @@ index 0000000..96393d0 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main015.f90 b/test/openmp_optimization/optimized_main015.f90 new file mode 100644 -index 0000000..727fe74 +index 0000000..d5c335a --- /dev/null +++ b/test/openmp_optimization/optimized_main015.f90 -@@ -0,0 +1,37 @@ +@@ -0,0 +1,25 @@ +! Test optimizaton for fortran use openmp about remove dependencies +! +program main @@ -1087,21 +1610,9 @@ index 0000000..727fe74 + c(i) = i + 2 + end do + starttime = omp_get_wtime() -+ !$omp parallel shared(a, a_copy) -+ do w = 1, 100 -+ !$omp do -+ do i = 1, 1000000 -+ a_copy(i) = a(i + 1) -+ end do -+ !$omp end do -+ !$omp do -+ do i = 1, 1000000 -+ x = (b(i) + c(i)) / 2 -+ a(i) = a_copy(i) + x -+ end do -+ !$omp end do -+ end do -+ !$omp end parallel ++ do w = 1, 100 ++ call f(a, b, c, a_copy) ++ end do + endtime = omp_get_wtime() + time = endtime - starttime +print *, time @@ -1112,10 +1623,10 @@ index 0000000..727fe74 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main016.f90 b/test/openmp_optimization/optimized_main016.f90 new file mode 100644 -index 0000000..2b0f650 +index 0000000..e7be707 --- /dev/null +++ b/test/openmp_optimization/optimized_main016.f90 -@@ -0,0 +1,31 @@ +@@ -0,0 +1,24 @@ +! Test optimizaton for fortran use openmp about remove dependencies +! +program main @@ -1131,14 +1642,7 @@ index 0000000..2b0f650 + end do + starttime = omp_get_wtime() + do w = 1, 1000 -+ b(1) = b(1) - a(0) -+ !$omp parallel do shared(a, b, c) -+ do i = 2, 1000000 -+ b(i) = b(i) + a(i - 1) -+ a(i) = a(i) + c(i) -+ end do -+ !$omp end parallel do -+ a(1000000 - 1) = a(1000000 - 1) + c(1000000 - 1) ++ call f(a, b, c) + end do + endtime = omp_get_wtime() + time = endtime - starttime @@ -1150,30 +1654,12 @@ index 0000000..2b0f650 \ No newline at end of file diff --git a/test/openmp_optimization/optimized_main017.f90 b/test/openmp_optimization/optimized_main017.f90 new file mode 100644 -index 0000000..09d6741 +index 0000000..344e9c1 --- /dev/null +++ b/test/openmp_optimization/optimized_main017.f90 -@@ -0,0 +1,53 @@ +@@ -0,0 +1,35 @@ +! Test optimizaton for fortran use openmp about communication +! -+subroutine f(x, y) -+ integer, pointer :: x(:) -+ integer, pointer :: y -+ integer :: l -+ integer :: k -+ integer :: m -+ integer :: a -+ l = x(1) -+ k = y -+ m = 512 * k -+ a = 512 + l -+ !$omp parallel do firstprivate(x, m, l, a) -+ do i = 1, 512 -+ x(i) = m + a * l * i -+ end do -+ !$omp end parallel do -+end -+ +program main + use omp_lib + interface @@ -1208,12 +1694,96 @@ index 0000000..09d6741 +! IWOMP 2018. Lecture Notes in Computer Science(), vol 11128. Springer, +! Cham. https://doi.org/10.1007/978-3-319-98521-3_8 \ No newline at end of file +diff --git a/test/openmp_optimization/optimized_main018.f90 b/test/openmp_optimization/optimized_main018.f90 +new file mode 100644 +index 0000000..97c8bb2 +--- /dev/null ++++ b/test/openmp_optimization/optimized_main018.f90 +@@ -0,0 +1,21 @@ ++! Test optimizaton for fortran use openmp about use cancel construction ++! ++program main ++ use omp_lib ++ real(kind = 8) :: starttime, endtime, time ++ integer :: a(100000) ++ integer :: t = 50000 ++ do i = 1, 100000 ++ a(i) = i ++ end do ++ starttime = omp_get_wtime() ++ do i = 1, 100000 ++ call f(a, t) ++ end do ++ endtime = omp_get_wtime() ++ time = endtime - starttime ++ print *, time ++end ++ ++! Reference ++! https://www.cines.fr/wp-content/uploads/2014/10/lesson3_slides.pdf +\ No newline at end of file +diff --git a/test/openmp_optimization/optimized_main019.f90 b/test/openmp_optimization/optimized_main019.f90 +new file mode 100644 +index 0000000..ec85db7 +--- /dev/null ++++ b/test/openmp_optimization/optimized_main019.f90 +@@ -0,0 +1,21 @@ ++! Test optimizaton for fortran use openmp about Reduce threads ++! synchronisations about critical ++! ++program main ++ use omp_lib ++ real(kind = 8) :: starttime, endtime, time ++ integer :: a(10000), b(10000) ++ do i = 1, 10000 ++ a(i) = i ++ end do ++ starttime = omp_get_wtime() ++ do n = 1, 200 ++ call f(a, b) ++ end do ++ endtime = omp_get_wtime() ++ time = endtime - starttime ++ print *, time ++end program main ++ ++! Reference ++! https://www.cines.fr/wp-content/uploads/2014/10/lesson3_slides.pdf +\ No newline at end of file +diff --git a/test/openmp_optimization/optimized_main020.f90 b/test/openmp_optimization/optimized_main020.f90 +new file mode 100644 +index 0000000..51da303 +--- /dev/null ++++ b/test/openmp_optimization/optimized_main020.f90 +@@ -0,0 +1,21 @@ ++! Test optimizaton for fortran use openmp about Change the way ++! variables are passed ++! ++program main ++ use omp_lib ++ real(kind = 8) :: starttime, endtime, time ++ integer :: a(32), b(32) ++ starttime = omp_get_wtime() ++ do i = 1, 100000 ++ call f(a, b) ++ end do ++ endtime = omp_get_wtime() ++ time = endtime - starttime ++ print *, time ++end ++subroutine work(a, b) ++ a = a + 1 ++ b = b + 1 ++end ++! Reference ++! 孙志刚. 基于键涨落模型数值模拟的并行优化[D].山东大学,2013. +\ No newline at end of file diff --git a/test/openmp_optimization/readme.md b/test/openmp_optimization/readme.md new file mode 100644 -index 0000000..e8cf656 +index 0000000..d999a41 --- /dev/null +++ b/test/openmp_optimization/readme.md -@@ -0,0 +1,71 @@ +@@ -0,0 +1,83 @@ +These files are designed to test how OpenMP programs can be optimized. +This folder has two types of test file, one is unoptimized, the other +one is optimized. @@ -1222,45 +1792,51 @@ index 0000000..e8cf656 +3.20GHz, 512GB RAM, X86 +OMP_NUM_THREADS=8 + -+test every case 10 times with flang-new ++test every case 20 times with flang-new -O3 + unoptimized optimized -+test001: 1.424 0.660 -+test002: 0.636 0.442 ++test001: 1.437 0.690 ++test002: 0.611 0.430 +test003: Unable to optimize with hand-written code -+test004: 1.021 0.568 -+test005: 0.992 0.572 ++test004: 0.961 0.574 ++test005: 0.983 0.582 +test006: Unable to optimize with hand-written code -+test007: 3.682 0.960 -+test008: 0.0185 0.000089 -+test009: 1.428 0.820 -+test010: 1.886 0.604 -+test011: 2.468 1.758 -+test012: 0.0986 0.0981 -+test013: 0.626 0.621 -+test014: 0.284 0.00102 -+test015: 0.463 0.907 -+test016: 3.903 0.713 -+test017: 0.0295 0.0221 //run by gfortran ++test007: 3.681 0.961 ++test008: 0.0218 0.000026 ++test009: 1.480 0.818 ++test010: 2.222 1.398 ++test011: 3.271 2.957 ++test012: 0.0697 0.0686 ++test013: 0.388 0.393 ++test014: 0.287 0.000411 ++test015: 0.127 0.249 ++test016: 0.759 0.301 ++test017: ERROR ++test018: ERROR ++test019: 1.044 0.0272 ++test020: 5.573 0.343 + -+test every case 10 times with flang ++test every case 20 times with flang -O3 + unoptimized optimized -+test001: 0.899 0.461 -+test002: 0.592 0.437 ++test001: 0.986 0.464 ++test002: 0.614 0.440 +test003: Unable to optimize with hand-written code -+test004: 0.939 0.562 -+test005: 0.981 0.559 ++test004: 0.969 0.568 ++test005: 0.977 0.575 +test006: Unable to optimize with hand-written code -+test007: 3.644 1.550 -+test008: 0.0146 0.0028 -+test009: 0.938 0.802 -+test010: 1.347 0.585 -+test011: 3.148 2.070 -+test012: 0.120 0.120 -+test013: 0.489 0.520 -+test014: 0.608 0.000495 -+test015: 0.392 1.812 -+test016: 2.822 0.593 -+test017: 0.0362 0.0254 ++test007: 3.714 1.577 ++test008: 0.0203 0.0029 ++test009: 1.003 0.775 ++test010: 2.216 1.334 ++test011: 3.842 2.610 ++test012: 0.0684 0.0672 ++test013: 0.231 0.318 ++test014: 0.639 0.000251 ++test015: 0.0578 0.0575 ++test016: 0.749 0.217 ++test017: 0.0355 0.0323 ++test018: 0.609 1.3886 ++test019: 1.028 0.0262 ++test020: 6.012 0.348 + +Reference +[1] Müller, Matthias S.. "Some Simple OpenMP Optimization Techniques." @@ -1285,152 +1861,160 @@ index 0000000..e8cf656 +[6] http://akira.ruc.dk/~keld/teaching/IPDC_f10/Slides/pdf4x/4_Performance.4x.pdf + +[7] https://openmp.llvm.org/remarks/OptimizationRemarks.html ++ ++[8] https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#dpcpp-cpp ++ ++[9] https://www.cines.fr/wp-content/uploads/2014/10/lesson3_slides.pdf ++ ++[10] 孙志刚. 基于键涨落模型数值模拟的并行优化[D].山东大学,2013. \ No newline at end of file diff --git a/test/openmp_optimization/run_flang-new.sh b/test/openmp_optimization/run_flang-new.sh new file mode 100644 -index 0000000..1faa2e3 +index 0000000..23de4fe --- /dev/null +++ b/test/openmp_optimization/run_flang-new.sh -@@ -0,0 +1,67 @@ -+for i in {001..009} +@@ -0,0 +1,68 @@ ++for i in {001..002} +do +echo "------- test $i ------." -+flang-new fortran_main$i.f90 -fopenmp -+export OMP_NUM_THREADS=8 -+./a.out -+rm a.out -+done -+echo "------- test 10 ------." -+flang-new fortran_main010.f90 -c -o fortran-test.o -fopenmp -+flang-new fortran_func010.f90 -c -o fortran-test2.o ++flang-new fortran_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang-new fortran_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 +flang-new fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out +rm *.o +rm a.out ++done + -+for i in {011..017} ++for i in {004..005} +do +echo "------- test $i ------." -+flang-new fortran_main$i.f90 -fopenmp ++flang-new fortran_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang-new fortran_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang-new fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done + -+for i in {001..002} ++for i in {007..020} +do +echo "------- test $i ------." -+flang-new optimized_main$i.f90 -fopenmp ++flang-new fortran_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang-new fortran_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang-new fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done -+for i in {004..005} ++for i in {001..002} +do +echo "------- test $i ------." -+flang-new optimized_main$i.f90 -fopenmp ++flang-new optimized_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang-new fortran_optimized_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang-new fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done -+for i in {007..009} ++for i in {004..005} +do +echo "------- test $i ------." -+flang-new optimized_main$i.f90 -fopenmp -+export OMP_NUM_THREADS=8 -+./a.out -+rm a.out -+done -+echo "------- test 10 ------." -+flang-new optimized_main010.f90 -c -o fortran-test.o -fopenmp -+flang-new fortran_optimized_func010.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang-new optimized_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang-new fortran_optimized_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 +flang-new fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out +rm *.o +rm a.out -+ -+for i in {011..017} ++done ++for i in {007..020} +do +echo "------- test $i ------." -+flang-new optimized_main$i.f90 -fopenmp ++flang-new optimized_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang-new fortran_optimized_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang-new fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done \ No newline at end of file diff --git a/test/openmp_optimization/run_flang.sh b/test/openmp_optimization/run_flang.sh new file mode 100644 -index 0000000..9977b42 +index 0000000..49ec972 --- /dev/null +++ b/test/openmp_optimization/run_flang.sh -@@ -0,0 +1,67 @@ -+for i in {001..009} +@@ -0,0 +1,68 @@ ++for i in {001..002} +do +echo "------- test $i ------." -+flang fortran_main$i.f90 -fopenmp -+export OMP_NUM_THREADS=8 -+./a.out -+rm a.out -+done -+echo "------- test 10 ------." -+flang fortran_main010.f90 -c -o fortran-test.o -fopenmp -+flang fortran_func010.f90 -c -o fortran-test2.o ++flang fortran_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang fortran_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 +flang fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out +rm *.o +rm a.out ++done + -+for i in {011..017} ++for i in {004..005} +do +echo "------- test $i ------." -+flang fortran_main$i.f90 -fopenmp ++flang fortran_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang fortran_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done + -+for i in {001..002} ++for i in {007..020} +do +echo "------- test $i ------." -+flang optimized_main$i.f90 -fopenmp ++flang fortran_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang fortran_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done -+for i in {004..005} ++for i in {001..002} +do +echo "------- test $i ------." -+flang optimized_main$i.f90 -fopenmp ++flang optimized_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang fortran_optimized_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done -+for i in {007..009} ++for i in {004..005} +do +echo "------- test $i ------." -+flang optimized_main$i.f90 -fopenmp -+export OMP_NUM_THREADS=8 -+./a.out -+rm a.out -+done -+echo "------- test 10 ------." -+flang optimized_main010.f90 -c -o fortran-test.o -fopenmp -+flang fortran_optimized_func010.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang optimized_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang fortran_optimized_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 +flang fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out +rm *.o +rm a.out -+ -+for i in {011..017} ++done ++for i in {007..020} +do +echo "------- test $i ------." -+flang optimized_main$i.f90 -fopenmp ++flang optimized_main$i.f90 -c -o fortran-test.o -fopenmp -O3 ++flang fortran_optimized_func$i.f90 -c -o fortran-test2.o -fopenmp -O3 ++flang fortran-test2.o fortran-test.o -fopenmp -O3 +export OMP_NUM_THREADS=8 +./a.out ++rm *.o +rm a.out +done \ No newline at end of file diff --git a/flang.spec b/flang.spec index 9e13516..6144c86 100644 --- a/flang.spec +++ b/flang.spec @@ -2,7 +2,7 @@ Name: flang Version: flang_20210324 -Release: 15 +Release: 16 Summary: Fortran language compiler targeting LLVM License: Apache-2.0 @@ -25,6 +25,7 @@ Patch10: 11-test-interoperability-with-c-c-call-fortran-array.patch Patch11: 12-test-interoperability-with-c-c-call-fortran-function.patch Patch12: 13-test-interoperability-with-c-c-call-fortran-global-and-struct.patch Patch13: 14-add-test-cases-for-attribute-declarations-and-specifications-2.patch +Patch14: 15-add-test-cases-for-types-2.patch %description Flang depends on a fork of the LLVM project (https://github.com/flang-compiler/classic-flang-llvm-project). The fork made some changes to the upstream LLVM project to support Flang toolchain. Flang cannot build independently for now. @@ -46,6 +47,12 @@ TODO: support build Flang. %changelog +* Thu Dec 8 2022 xieyihui - flang_20210324-17 +- Fix 4-add-test-cases-for-openmp-optimization.patch for add new test cases for OpenMP optimization and modify the test method + +* Wed Dec 7 2022 MinchaoLiang - flang_20210324-16 +- Add patch for add test cases for types 2 + * Tue Nov 29 2022 wangzhewei - flang_20210324-15 - Add patch for add test cases for attribute declarations and specifications 2 @@ -90,4 +97,3 @@ TODO: support build Flang. * Thu Nov 25 2021 qiaopeixin - flang_20210324-20211125.1 - Add flang source tar file - -- Gitee