对于 OpenACC 循环,每个线程是否都获得标量的私有副本?
With an OpenACC loop, does each thread get private copies of scalars?
我有一个非常简单的代码片段:
$acc data copy(a(:),b(:))
$acc kernels
$acc loop vector
do i=1,1000
x = a(i)
b(i) = sqrt(x)
enddo
$acc end kernels
$acc end data
当然,我可以轻松地省去 x
,但这是一个示例,x
是我的问题的重点,即:这里的每个线程是否都有自己的副本x
自动,还是我应该将其声明为私有以防止各种线程破坏它?
在 OpenACC 中,默认情况下标量是 firstprivate,因此通常不需要将它们放在 "private" 子句中。您真正需要使用 "private" 子句的唯一情况是用于数组,或者当标量 "escapes" 计算区域时,例如通过引用传递给设备例程或其值在计算之外使用地区。
我有一个非常简单的代码片段:
$acc data copy(a(:),b(:))
$acc kernels
$acc loop vector
do i=1,1000
x = a(i)
b(i) = sqrt(x)
enddo
$acc end kernels
$acc end data
当然,我可以轻松地省去 x
,但这是一个示例,x
是我的问题的重点,即:这里的每个线程是否都有自己的副本x
自动,还是我应该将其声明为私有以防止各种线程破坏它?
在 OpenACC 中,默认情况下标量是 firstprivate,因此通常不需要将它们放在 "private" 子句中。您真正需要使用 "private" 子句的唯一情况是用于数组,或者当标量 "escapes" 计算区域时,例如通过引用传递给设备例程或其值在计算之外使用地区。