
openmp
chder_白南
无话可说
展开
-
Fortran:openmp笔记1
program hello implicit none !.. 串行区域主线程为0,输出一次hello write( *,'(1x,a)' ) '第一个串行区' write( *,'(1x,a)' ) 'hello!' !.. 在并行区域,如果没有设置程序运行的线程数时,默认为最大线程 write( *,'(1x,a)' ) '并行区' !$omp parallel...原创 2018-09-02 15:32:05 · 962 阅读 · 0 评论 -
Fortran:openmp笔记18
!.. 1. sections指令在大多数情况下与一个独立的parallel指令一起使用,因此openmp提供了一个指令!$parallel sections来方便编程人员编程!.. 2. 一个程序中可以定义多个sections结构,每个sections结构中又可以定义多个section!.. 3. 同一个sections中section之间处于并行状态,sections与其他sections...原创 2018-09-03 18:17:49 · 545 阅读 · 0 评论 -
Fortran:openmp笔记19
!.. workshare指令!.. 1. workshare结构中的代码只能包括如下语句:数组赋值语句、标量赋值语句!.. forall/where语句和结构、atomic结构、critical结构和parallel结构!.. 其中,数组赋值语句允许使用算术操作符,包括+,-,*,/和**!.. 2. workshare指令指出代码块中的每条语句均为计算的共享单元!.. ...原创 2018-09-03 18:18:27 · 905 阅读 · 0 评论 -
Fortran:openmp笔记20
!.. single指令!.. 1. 一个single结构只能由一个线程来执行,但并不一定是主线程。!.. 不执行single指令的其他线程则会在single结构结束处同步!.. 但如果存在nowait指令,则不执行single指令的其他线程可以直接越过single继续向下执行!.. 2. single结构内部不允许出现能够到达single结构之外的跳转语句,也不允许有外部的跳...原创 2018-09-03 18:19:04 · 726 阅读 · 0 评论 -
Fortran:openmp笔记22
!.. master指令!.. master指令的语法格式如下:!.. !$omp master!.. code!.. !$omp end master!.. master指令要求主线程去执行并行区域内的部分程序代码!.. 而其他的线程则越过程序代码直接向下执行!.. 使用master应注意以下几项:!.. 1. master与single指令类似,但master没有隐...原创 2018-09-15 21:23:37 · 398 阅读 · 0 评论 -
Fortran:openmp笔记23
!.. critical指令!.. critical语法!.. !$omp critical!.. code!.. $omp end critical!.. 使用critical的注意事项:!.. 1. 在同一时间内,只允许一个线程执行critical结构,其他线程必须排队依次执行critical结构!.. 2. critical指令不允许相互嵌套!.. 3. critical...原创 2018-09-15 22:49:24 · 567 阅读 · 0 评论 -
Fortran:openmp笔记24
!.. atomic指令!.. atomic指令要求一个特定的内存地址必须自动更新,而不让其他的线程对此内存地址进行写操作!.. atomic操作实际上是一个'微型'的critical指令。!.. atomic指令在语法上可以认为等价于critical和end critical!.. critical指令对一个代码块有效,而atomic指令只对一个表达式语句有效!.. openmp利用a...原创 2018-09-16 10:03:55 · 857 阅读 · 0 评论 -
Fortran:openmp笔记25
!.. ordered指令!.. ordered指令要求循环区域内的代码必须按照循环迭代的次序来执行!.. 这是因为在执行循环的过程中,部分工作是可以并行执行的!.. 然而特定部分工作需要等待前面的工作全部完成以后才能够正确执行!.. 语法格式如下:!.. !$omp do ordered!.. do loop!.. !$omp ordered!.. code!.. ...原创 2018-09-16 12:17:02 · 565 阅读 · 0 评论 -
Fortran:openmp笔记26
!.. flush指令: 此指令很少被使用!.. flush定义了一个同步点,在该同步点处强制存储器的一致性,即确保并行执行的各线程对共享变量进行读写操作时读取的是最新值!.. 高速缓存一致性确保了所有的处理器最终能看到单个地址空间!.. flush的语法格式如下:!.. !$omp flush(var list) 即列表中的变量需要更新。!.. 如果变量列表省略,则表明对调用线程可见...原创 2018-09-16 12:17:52 · 749 阅读 · 0 评论 -
Fortran:openmp笔记27
!.. 环境变量设置方法举例说明Program do_schedule_runtime use omp_lib implicit none integer, parameter :: m = 10 integer :: i, tid, nthreads !$omp parallel do private(i) schedule( runtime ) do i = 1,...原创 2018-09-16 14:56:34 · 532 阅读 · 0 评论 -
Fortran:openmp笔记28
!.. openmp时间函数:omp_get_wtimeProgram timetick use omp_lib implicit none integer, parameter :: m = 1000000 integer :: i, j real(kind=8) :: starttime, endtime, usedtime real(kind=8) :: x ...原创 2018-09-16 15:44:44 · 791 阅读 · 0 评论 -
Fortran:openmp笔记29
!.. 简单锁!.. 简单锁不可以多次上锁,即使是同一个线程也不允许!.. 除了线程尝试给已经被某个线程持有的锁进行上锁操作不会被阻塞外,其他线程均处于阻塞状态!.. 下面举例说明阻塞加锁的用法Program lock use omp_lib implicit none integer, parameter :: m = 5 integer :: i, tid int...原创 2018-09-16 15:45:48 · 393 阅读 · 0 评论 -
Fortran:openmp笔记30
!.. 采用!$omp do指令执行任务!Program print_do! use omp_lib! implicit none ! integer :: i, m! integer :: a(100), b(100)!! call omp_set_num_threads(6)! m = 4! do i = 1, size(a)! a(i) = i ! ...原创 2018-09-16 20:51:47 · 589 阅读 · 0 评论 -
Fortran:openmp笔记31
!.. task指令解决斐波那契数列中的递归调用Program fibonacci_task use omp_lib implicit none integer :: n, fib n = 40 call omp_set_dynamic( .false. ) call omp_set_num_threads(8) !$omp parallel shared(n)...原创 2018-09-16 20:52:37 · 656 阅读 · 1 评论 -
Fortran:openmp笔记32
!.. collapse子句!.. collapse子句只能用于一个嵌套循环,它可以将多层嵌套循环进行合并并展开到一个更大的循环空间!.. 这样可以增加将在线程组上进行划分调度的循环总数Program do_collapse use omp_lib implicit none integer, parameter :: l = 4, m = 4, n = 2 integer...原创 2018-09-16 20:53:41 · 773 阅读 · 0 评论 -
Fortran:openmp笔记17
!.. 在不设置size参数情况下,分析各种调度方式的时间消耗Program do_schedule use omp_lib implicit none integer, parameter :: m = 10000, n = 10000 integer :: i, j, a real(kind=8) :: starttime, endtime, time call o...原创 2018-09-03 18:17:06 · 415 阅读 · 0 评论 -
Fortran:openmp笔记16
!.. parallel do指令静态调度用法Program do_schedule_static use omp_lib implicit none integer, parameter :: m = 12 integer :: nthreads, tid, i call omp_set_num_threads(3) !$omp parallel do private...原创 2018-09-03 18:16:27 · 462 阅读 · 0 评论 -
Fortran:openmp笔记2
Program hi_parallel use omp_lib implicit none integer :: tid, mcpu !call omp_set_num_threads(8) !.. 设置线程数 tid = omp_get_thread_num() !.. 获取当前线程号...主线程号为0 mcpu = omp_get_num_threads() !...原创 2018-09-02 15:33:36 · 959 阅读 · 1 评论 -
Fortran:openmp笔记3
Program test_shared_and_private use omp_lib !.. 上面一句也可替换为include 'omp_lib.h' implicit none integer :: tid integer :: a, b, c write( *,'(1x,a)' ) 'before parallel......' call omp_set_num...原创 2018-09-02 15:34:47 · 1074 阅读 · 1 评论 -
Fortran:openmp笔记4
Program test_firstprivate_and_lastprivate use omp_lib implicit none integer, parameter :: m = 4 integer :: tid, i, j integer :: a(m), b(m) call omp_set_num_threads(10) a = -10; b = -10...原创 2018-09-02 15:35:35 · 941 阅读 · 0 评论 -
Fortran:openmp笔记5
Module mod1 implicit none integer :: xEnd module mod1Program test_threadprivate use mod1 use omp_lib implicit none integer :: tid, a !$omp threadprivate( x ) !.. threadprivate子句将全局...原创 2018-09-02 15:36:42 · 930 阅读 · 1 评论 -
Fortran:openmp笔记6
Module mod1 implicit none integer :: xEnd module mod1Program test_copyin_and_copyprivate use mod1 use omp_lib implicit none integer :: tid, a !$omp threadprivate( x ) !.. 利用threadp...原创 2018-09-02 15:37:38 · 700 阅读 · 0 评论 -
Fortran:openmp笔记7
Program test_reduction use omp_lib implicit none integer, parameter :: m = 5 integer :: i, tid integer :: a(m), b(m) integer :: s, pdt, abmax call omp_set_num_threads(3) Do i = 1, m ...原创 2018-09-02 15:38:21 · 837 阅读 · 0 评论 -
Fortran:openmp笔记8
Program test_omp_in_parallel use omp_lib implicit none Integer :: tid, Nthreads Nthreads = omp_get_num_threads() !.. 获得串行域线程数,Nthreads =1,只有主线程一个线程 tid = omp_get_thread_num() !.. 获得当前线程号,...原创 2018-09-02 15:39:07 · 909 阅读 · 0 评论 -
Fortran:openmp笔记9
Program set_num_threads use omp_lib implicit none Integer :: nthreads_set, nthreads, tid !$omp parallel private( nthreads, tid ) nthreads = omp_get_num_threads() tid = omp_get_thread_num...原创 2018-09-02 15:39:48 · 689 阅读 · 0 评论 -
Fortran:openmp笔记10
!.. 默认模式实际上就是动态模式。即如果在程序中没有设定并行域中线程的数落,则程序自动转为动态模式!.. 在动态模式中,各并行域可以具有不同的线程数!.. 因此,一般建议尽量采用显示格式对所需的线程数量进行声明!.. 可用线程数的动态调整是通过调用环境库函数omp_set_dynamic来实现的!.. 如果参数为.true.,则表明启用了可用线程数的动态调整!.. 如果参数为.fals...原创 2018-09-02 15:40:30 · 555 阅读 · 0 评论 -
Fortran:openmp笔记11
!.. if子句:条件并行!.. 如果if条件得到满足,就采用并行方式运行并行区域内的代码!.. 如果if条件不能够满足,就采用串行方式来运行并行区域的代码Program if_parallel use omp_lib implicit none Integer :: nthreads, tid, ncpu ncpu = omp_get_num_procs() !.. 利...原创 2018-09-03 18:12:53 · 387 阅读 · 0 评论 -
Fortran:openmp笔记12
Program if_parallel_print use omp_lib implicit none call printnumthreads(2) write(*,'(1x,a)') "------------------------" call printnumthreads(20)End program if_parallel_printSubroutine p...原创 2018-09-03 18:13:40 · 477 阅读 · 0 评论 -
Fortran:openmp笔记13
!.. 单重循环:下面的例子不存在循环依赖!.. 采用do指令来实现数组相加运算的并行Program do_array_plus use omp_lib implicit none integer, parameter :: m = 10 integer :: nthreads, tid, i integer :: a(m), b(m), c(m) call omp_...原创 2018-09-03 18:14:23 · 483 阅读 · 0 评论 -
Fortran:openmp笔记14
Program double_do_array_plus_j use omp_lib implicit none integer, parameter :: m = 3, n = 3 integer :: nthreads, tid, i, j integer :: a(m,n), b(m,n), c(m,n) call omp_set_num_threads(3) ...原创 2018-09-03 18:15:12 · 899 阅读 · 0 评论 -
Fortran:openmp笔记15
Program double_do_array_plus_i use omp_lib implicit none integer, parameter :: m = 3, n = 3 integer :: nthreads, tid, i, j integer :: a(m,n), b(m,n), c(m,n) call omp_set_num_threads(3) ...原创 2018-09-03 18:15:51 · 539 阅读 · 0 评论 -
Fortran:openmp笔记21
!.. nowait指令Program nowait_do use omp_lib implicit none integer, parameter :: m = 4 integer :: tid, nthreads, i call omp_set_num_threads(3) !$omp parallel private(tid, nthreads, i) !$...原创 2018-09-14 14:28:57 · 382 阅读 · 0 评论