OpenAcc笔记——update

 1         program main
 2         use omp_lib
 3         use openacc
 4         implicit none
 5         
 6         real,allocatable:: v1(:)
 7         integer length, idx
 8         
 9         call acc_set_device_num(2,acc_device_nvidia)
10         length = 1024!*1024!*1024
11         allocate(v1(length))
12         v1(1:length) = 0.0
13         !使用data语句,将数据copy到device上
14         !$acc data copy(v1(1:length))
15         call add1(v1, length) !子程序在device上执行
16         
17         !print只能cpu实行,所以讲数据update到cpu上
18         !$acc update host(v1(1:5))
19         print*, "v1(1) = ", v1(1:5)
20         !下面是在cpu上执行
21         do idx = 1,length
22         v1(idx) = v1(idx) + 10
23         enddo
24         print*, "v1(1) = ", v1(1:5) !直接打印出cpu上的结果
25         
26         !将cpu上的执行结果update到device上
27         !$acc update device(v1(1:5))
28         call add1(v1, length)
29         
30         !上面子程序在device上执行完,update到本地输出
31         !$acc update host(v1(1:5))
32         print*, "v1(1) = ", v1(1:5)
33         !结束
34         !$acc end data
35         
36         deallocate(v1)
37 
38         end program 
39         
40         subroutine add1(vec, length)
41         use openacc
42         implicit none
43         integer, intent(in)::length
44         real, intent(inout) :: vec(1:length)
45         integer idx
46         !$acc parallel loop present(vec(1:length))
47         do idx = 1, length
48             vec(idx) = vec(idx) + idx
49         enddo
50         end subroutine

 

posted @ 2018-05-21 18:31  大蓝鲸  阅读(349)  评论(0编辑  收藏  举报