Nemo #6138(2008/04/04 16:00 GMT) [ FORTRAN ] Rating0/0=0.00
FORTRAN / OpenMP で。 15行で明示的に 8 threads 生成 18行で空きスレッドに仕事を割り当て 22行で NOWAIT 指定によりスレッド間同期を取らずに先へ 24行で全てのスレッドの終了待ち、 ってところです。 スレッドプールの管理は OpenMP に任せきりですが、通常の実装ではスレッドプールは残される、んではないかと。 # OpenMP の仕様を読みきれていない....
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
subroutine random_wait(i) integer omp_get_thread_num, omp_get_num_threads j=mod(irand(),10) write(*,'(AI2AI2AI2AI2)') 'begin ',i,' - ',j,' sec, thread ', c omp_get_thread_num(), '/', omp_get_num_threads() call sleep(j) write(*,'(AI2AI2AI2AI2)') 'end ',i,' - ',j,' sec, thread ', c omp_get_thread_num(), '/', omp_get_num_threads() end program thread_test integer omp_get_thread_num, omp_get_num_threads write(*,*) 'Single Thread' call sleep(4) !$OMP PARALLEL NUM_THREADS(8) write(*,'(AI2AI2)') 'Multi Thread ', c omp_get_thread_num(),'/',omp_get_num_threads() !$OMP DO SCHEDULE(DYNAMIC) do i=1,20 call random_wait(i) end do !$OMP END DO NOWAIT write(*,'(AI2)') 'finish', omp_get_thread_num() !$OMP BARRIER !$OMP MASTER write(*,*) 'Finish' !$OMP END MASTER !$OMP END PARALLEL end
Rating0/0=0.00-0+
[ reply ]
Nemo
#6138()
[
FORTRAN
]
Rating0/0=0.00
subroutine random_wait(i) integer omp_get_thread_num, omp_get_num_threads j=mod(irand(),10) write(*,'(AI2AI2AI2AI2)') 'begin ',i,' - ',j,' sec, thread ', c omp_get_thread_num(), '/', omp_get_num_threads() call sleep(j) write(*,'(AI2AI2AI2AI2)') 'end ',i,' - ',j,' sec, thread ', c omp_get_thread_num(), '/', omp_get_num_threads() end program thread_test integer omp_get_thread_num, omp_get_num_threads write(*,*) 'Single Thread' call sleep(4) !$OMP PARALLEL NUM_THREADS(8) write(*,'(AI2AI2)') 'Multi Thread ', c omp_get_thread_num(),'/',omp_get_num_threads() !$OMP DO SCHEDULE(DYNAMIC) do i=1,20 call random_wait(i) end do !$OMP END DO NOWAIT write(*,'(AI2)') 'finish', omp_get_thread_num() !$OMP BARRIER !$OMP MASTER write(*,*) 'Finish' !$OMP END MASTER !$OMP END PARALLEL endRating0/0=0.00-0+
[ reply ]