Fortran OpenMP和内部子例程
我一直在测试简单Fortran代码的OpenMP加速,1)在并行区域内调用内部子例程,2)在内部子例程内初始化并行区域。在这两种情况下,openmp do循环都放置在内部子例程中。下面是一个简单的代码:Fortran OpenMP和内部子例程,fortran,openmp,Fortran,Openmp,我一直在测试简单Fortran代码的OpenMP加速,1)在并行区域内调用内部子例程,2)在内部子例程内初始化并行区域。在这两种情况下,openmp do循环都放置在内部子例程中。下面是一个简单的代码: module module_with_subroutine include "omp_lib.h" integer ,parameter :: rkind = selected_real_kind(15,307) real(rkind) ,dimension(100,100,100
module module_with_subroutine
include "omp_lib.h"
integer ,parameter :: rkind = selected_real_kind(15,307)
real(rkind) ,dimension(100,100,100) :: A
real(rkind) :: elapsed_time
integer :: clock_start ,clock_end ,clock_rate
contains
subroutine module_subprogram
A = 3.14_rkind
call SYSTEM_CLOCK(count_rate = clock_rate)
call SYSTEM_CLOCK(count = clock_start)
!!$omp parallel num_threads(12) !!! For case 1
call intrinsic_subprogram
!!$omp end parallel
call SYSTEM_CLOCK(count = clock_end)
elapsed_time = (clock_end-clock_start)/real(clock_rate,rkind)
print *, 'Elapsed time in seconds: ',elapsed_time
print *, 'Clock start: ',clock_start
print *, 'Clock end: ',clock_end
print *, 'Clock rate: ',clock_rate
contains
subroutine intrinsic_subprogram
integer :: i, j, k, steps ,nthread
do steps = 1,10000
!$omp parallel num_threads(12) !!! For case 2
!$omp do collapse(3) private (i,j,k,nthread)
do k = 1,100
do j = 1,100
do i = 1,100
nthread = omp_get_thread_num()
A(i,j,k) = (exp(A(i,j,k)**3.14 + sqrt(A(i,j,k)**3.14) + log(A(i,j,k)**3.14)))**1.414
if(A(i,j,k) <= 3.14) then
A(i,j,k) = 1.0
end if
!print *, 'thread number',nthread
!print *, 'i,j,k',i,j,k
end do
end do
end do
!$omp end do
!$omp end parallel
end do
end subroutine
end subroutine
end module
带有子例程的模块
包括“omp_lib.h”
整数,参数::rkind=所选的实数种类(15307)
真实(rkind),尺寸(100100)::A
真实(rkind)::经过的时间
整数::时钟开始、时钟结束、时钟速率
包含
子程序模块\子程序
A=3.14
呼叫系统时钟(计数率=时钟率)
呼叫系统时钟(计数=时钟开始)
!!$omp并行线程数(12)!!!案例1
调用内部程序
!!$端并联
呼叫系统时钟(计数=时钟结束)
已用时间=(时钟结束-时钟开始)/实际(时钟速率,rkind)
打印*,“已用时间(秒):,已用时间
打印*,“时钟开始:”,时钟开始
打印*,“时钟结束:”,时钟结束
打印*,“时钟频率:”,时钟频率
包含
子程序
整数::i,j,k,步长,n读取
执行步骤=110000
!$omp并行线程数(12)!!!案例2
!$omp do折叠(3)专用(i、j、k、N读)
Dok=1100
do j=1100
i=1100吗
nthread=omp\u get\u thread\u num()
A(i,j,k)=(exp(A(i,j,k)**3.14+sqrt(A(i,j,k)**3.14)+log(A(i,j,k)**3.14))**1.414
if(A(i,j,k)时差有多大?你是如何计算时间的?你做过统计吗?OT,但我真的建议使用
!$use omp_lib
,而不是include。是的,我试过好几次了。时差非常小,大约是75秒对80秒。计时部分在代码中,除此之外,我还做了VTune分析,它显示了类似的功能。Vladimir F,谢谢你的第一个例子对我来说很奇怪:你知道你创建了12个子程序的实例吗???