根据《英特尔至强融核协处理器高性能编程》一书,我们可以将数据从一个变量移动到另一个变量。我尝试按照示例进行操作,发现它有效:
代码:
program example
real , target :: a(5),b(10)
a(1)=1
a(2)=2
a(3)=3
a(4)=4
a(5)=5
print *,'*************************'
print *,'a:'
print *, a
!dir$ offload begin target (mic:0) in(a(1:5): into(b(1:5)) alloc_if(.true.) free_if(.false.) )
print *, 'b on the phi'
print *, b(1:5)
b=b+10
!dir$ end offload
!dir$offload_transfer target(mic:0) out(b(1:5) : into(a(1:5)) alloc_if(.false.))
print *,'*************************'
print *,'a:'
print *, a
end program example
我在主机上有一个数组 A,我将它们复制到 Xeon Phi 上的数组 B 中。我向 B 中的所有元素添加 10,然后将 Xeon Phi 上的 B 中的元素卸载到主机上的 A。结果是:
但是,如果我使用指针,则会出现错误。
代码 2:
program example
real , target :: a(5),b(10)
real , pointer :: a_p(:),b_p(:)
a(1)=1
a(2)=2
a(3)=3
a(4)=4
a(5)=5
a_p=>a
b_p=>b
print *,'*************************'
print *,'a:'
print *, a
!dir$ offload begin target (mic:0) in(a_p(1:5): into(b_p(1:5)) alloc_if(.true.) free_if(.false.) )
print *, 'b on the phi'
print *, b_p(1:5)
b_p=b_p+10
!dir$ end offload
!dir$offload_transfer target(mic:0) out(b_p(1:5) : into(a_p(1:5)) alloc_if(.false.))
print *,'*************************'
print *,'a:'
print *, a
end program example
结果2:
当我尝试将内容复制回来时,似乎出了点问题。
into 支持指针吗?在实际项目中,我们需要指向数组的指针。