Сколько приватных копий массива находится в цикле opena cc - PullRequest
0 голосов
/ 21 марта 2020

если у меня есть

#pragma acc parallel loop gang num_gangs(4) \
 num_workers(5) vector_length(6) private(arrayB)
 {
  for(j=0; j<len; j++)
  {
   ...
  }
 }

регион, я предполагаю, что у каждой из 4 банд будет отдельная копия arrayB (для этого примера вы можете предположить, что arrayB - это целочисленный массив с 5 элементами).

  1. Прав ли я, если предположить, что в вышеприведенном случае каждая из 4 банд имеет личную копию arrayB (и рабочие и векторы, т. Е. 5 рабочих в банде увидят единственная частная копия arrayB , которая будет разделена между этими 5 работниками и аналогичными векторами)? Кроме того,
#pragma acc parallel loop num_gangs(4) \
 num_workers(5) vector_length(6)
 {
  for(j=0; j<len; j++)
  {
   ...
  }
 }  

будет таким же с точки зрения частных копий arrayB к вышеуказанному?

теперь предположим,
#pragma acc parallel loop gang worker \
 num_gangs(4) num_workers(5) \
 vector_length(6) private(arrayB)
 {
  for(j=0; j<len; j++)
  {
   ...
  }
 }

тогда, кто имеет личную копию arrayB и кто разделяет одну личную копию arrayB ? сколько всего частных копий массива B ?

теперь предположим,
#pragma acc parallel loop gang vector \
 num_gangs(4) num_workers(5) \
 vector_length(6) private(arrayB)
 {
  for(j=0; j<len; j++)
  {
   ...
  }
 }

тогда, кто имеет личную копию arrayB и кто разделяет одну личную копию arrayB ? сколько всего частных копий arrayB ?

также, пожалуйста, сообщите мне, если я пропускаю другие возможные комбинации.

1 Ответ

0 голосов
/ 23 марта 2020

Предложение «private» применяется к самому низкому расписанию (банда, рабочий, вектор), используемому для примененного l oop.

Таким образом, «l oop частная банда (обр.») Будет иметь личный массив для каждой банды, который распределяется между рабочими и векторами в этой банде.

A "l oop gang worker private (arr .. "будет иметь личный массив для каждого работника, который будет использоваться среди векторов этого работника.

" l oop gang worker vector private (arr .. "будет иметь личный массив для каждого вектора, который не является общим.

Для случая # 1 число созданных частных массивов будет зависеть от расписания l oop, применяемого компилятором. Если вы используете PGI компилятор, посмотрите на сообщения обратной связи компилятора (-Minfo = accel), чтобы увидеть, как планировалось l oop. Если бы это была опечатка, и вы намеревались включить сюда «банду», то число частных массивов будет равно количество банд.

Для # 2 у вас есть расписание "рабочий банды", поэтому число частных массивов будет произведено на количество банд и количество рабочих.

Для # 3, у вас есть «вектор рабочего банды» Таким образом, число частных массивов будет произведено на число банд, количество рабочих и длину вектора.

Обратите внимание, что в целом я не рекомендую использовать «num_workers» или «vector_length», за исключением более продвинутой настройки производительности, когда известно, что размер внутренних циклов меньше размера по умолчанию или при настройке для использования реестра. В противном случае вы ограничиваете параллельность кода.

Я также использую "num_gangs" очень редко. Это имеет смысл использовать только тогда, когда у вас очень большое количество (или размер) частных массивов, а ограничение количества банд позволяет частным массивам помещаться в память графического процессора. Кроме того, в очень редких случаях, когда количество банд необходимо фиксировать для алгоритма (например, для ГСЧ).

...