При использовании цикла OpenACC каждый поток получает частные копии скаляров?

У меня есть довольно простой фрагмент кода:

$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, или я должен объявить его частным, чтобы сохранить различные темы от затирания его?


person bob.sacamento    schedule 21.04.2016    source источник


Ответы (1)


В OpenACC скаляры по умолчанию являются firstprivate, поэтому обычно нет необходимости помещать их в «частное» предложение. Предложение «private» действительно необходимо использовать только в случае массивов или когда скаляр «ускользает» из вычислительной области, например, передается по ссылке в подпрограмму устройства или его значение используется за пределами вычислительной области.

person Mat Colgrove    schedule 21.04.2016
comment
Большое спасибо! Кстати, знаете ли вы какую-нибудь хорошую документацию по OpenACC? - person bob.sacamento; 22.04.2016
comment
openacc.org - лучшее место для начала. Внизу главной страницы есть раздел ресурсов, в котором есть несколько полезных ссылок. Руководство по программированию и передовым методам OpenACC - хорошее место для начала. - person Mat Colgrove; 25.04.2016