<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/74746>74746</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [Flang][RT][OpenMP] system_clock behavior with multiple threads
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            portability,
            flang:runtime
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          vzakhari
      </td>
    </tr>
</table>

<pre>
    Reproducer:
```
program main
  use omp_lib
  integer, parameter :: n = 1000000
  integer(8) :: t1, t2, rate
  real :: a(n), b(n)
  real(8) :: start, end
  b = 1.0
  call system_clock(t1)
  start = omp_get_wtime()
  call work(a, b, n)
  call system_clock(t2, rate)
  end = omp_get_wtime()
  print *, 'system_clock: ', dble(t2-t1)/dble(rate)
  print *, 'omp_get_wtime: ', end-start
contains
  subroutine work(a, b, n)
    real :: a(:), b(:)
    !$omp parallel do
    do i=1,n
       a(i) = sin(b(i))
 end do
    !$omp end parallel do
  end subroutine work
end program main
```

Compile with: flang-new -fopenmp clock.f90 -O0
Run with `OMP_NUM_THREADS=1 ./a.out` and `OMP_NUM_THREADS=128 ./a.out`

In the multithreaded case, the program prints the wall time multiplied by the number of threads.  I guess this might be an acceptable behavior, but many other compilers return the wall time.

I think this might be related to our preference of `CLOCK_PROCESS_CPUTIME_ID` over other timers: https://github.com/llvm/llvm-project/blob/e3720bbc088d904ed7fad9ad1a4db294d2bcfc05/flang/runtime/time-intrinsic.cpp#L64

Note that gcc, for example, tries to use `CLOCK_MONOTONIC` and then `CLOCK_REALTIME`: https://github.com/gcc-mirror/gcc/blob/9693459e030977d6e906ea7eb587ed09ee4fddbd/libgfortran/intrinsics/system_clock.c#L39

@rovka , @Leporacanthicus, you've made changes in this code - would you agree that we should change the order of the ifdefs to match other compilers?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVl1vozgU_TXOy1UiMCTAQx4ySdFW2zZVp_McGfsC3oKNbNNu99evbPLVzGhWW1UBrs_9ONfHF5i1slGIa7L8Rpa7GRtdq836_R_21jIjZ5UWn-sXHIwWI0dDkg2JdiTakFV0_A-Pg9GNYT30TKrJAjBaBN0Ph05WJ5NUDhs0hG5hYIb16NCAj5lsQAFJdhBH4e8nhzwntDhBXewjOOp_DXN4Qhtk3QnDCM0VoYXHVKf7K9xNSOuYcR6LSpxg1VTR4lwNZ10H9tM67A-80_yN0NzXcg4cogQvT7xBd_hwskdC8ytQiPKhjfdmx_K2oG4Rt3kubC9AVOK_sg1GKgeEbrw7odmXsMnGm_yKqDoMWeYTIVoeLTcZb8N9zXyJh0rMp54GR66VY1LZc6PGyujRSYW_78TPe-pvL7t6fDqjCY0JTXU_BH11HXYg9GVZaJAk2Xn5qIsVIESWkxx2YKUiNK-Opkt83-3raJdkfuUXCb35lmlYCvifjszNmZp-t7ofZIfwIV3re1B3TDVzhR8wr_WAqh8g7OWiLiKY74--L6MKHkBW0f7x-fD04_Hw-sfL3Wb33fOHBaElW-jRkVUEzKvolziaf0Fe13WvwLUI_dg56VqDTKAAziyGo9nimV9QjA2mD69rL5TJbegkCqg-w5oa-woN6BqmaHYBcA_NiNb7Sgu9bFoHFQJTwDjHwbGqQ6iwZe9Sh5lSjQ56pj5BuxYN8Kl1xoJBNxr1tYbFFzY-h3q7yWSwYw4FOA16NDAYrNGg4ujLJKto-7Df_nl4ftlv775_P2yff7zeP94d7ne-qfrdswl1-GzG-s1rnRts0GxJaNlI147Vguue0LLr3k-X-WD0X8gdoWXV6YrQEpOMRlXFozwXRZSiyGomCiZiloqKFqmgFa95tCS0DPogtDSjmoZB6S9zqZyRykq-4MNAaPKwSq_5P2mH4FrmoOHct7LWBvBv1g_dtKFGovV98EP9zPxx_7R_3T_db08qci2qy_LL3ebBd8Qr5_fkG87nvTTGb2MZKjgxL1ZFki4LjJKoyDKxwiJaIcuwWuYZiqhATGshKuFbJ6um1sYZpggtz4QtoeX10FtwTz8prumTNDL6_Y1BmGpp9ICDNowz5VrJR-utn3okNHtH6JlA4C1TDVqQapIM1wJhDh967ISHAmsMHjv6gWDbsDB5BRlqI05qR5C1wDq0t2eOt7fyJUk5E-tEFEnBZriOsygusjRP01m7xoKn8bLIixyFoLFY5bSmGa9jVtdimeJMrmlEk5hGWZynGU0XUUyXWcF4XOVFnq4ikkbYM9ktvPQW2jQzae2I6yzN0tWsYxV2NnwdUDpo41glO-k-CfXvI0LppLdkc9Yb9Z8RZh2EXI2NJWnUSevsJb6TrgsfHGXwXe7I8tvL63TdD6gen8ly9-X9dz7l01A7Tg88jYrZaLr1_z5bgaZXR2D6bwAAAP__b7HAOQ">