Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran OpenMP和内部子例程_Fortran_Openmp - Fatal编程技术网

Fortran OpenMP和内部子例程

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

我一直在测试简单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)  :: 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个子程序的实例吗???