сокращение при размещении данных на устройстве

У меня есть простой код реализации nbody. Короче говоря, я убрал лишний код в randomizeBodies().

typedef struct
{ 
  float x; 
  float y; 
  float z;
  float w;
} Point4;
n=16384;
Point4  positions   [n];
Point4  velocities  [n];
Point4  acceleration[n];
float   E_pot       [n];
#pragma acc declare device_resident(positions,velocities,
acceleration,E_pot,n)
void randomizeBodies()
{
  float K=0;
  #pragma acc data copy(K)
  #pragma acc parallel loop reduction(+:K)
  for(int i=0;i<n; ++i)
  {
    ...
    Point4 velocity=...;
    K+=1;
    K+=velocity.y*velocity.y;
    K+=velocity.z*velocity.z;
    velocities[i].x = velocity.x ;
    velocities[i].y = velocity.y ;
    velocities[i].z = velocity.z ;
  }
  printf("K=%f",K); 
}

Здесь veleocity.x, velocity.y, velocity.z являются плавающими. Я вызываю randomizeBodies() в main() и не понимаю, почему вывод пишет "K=0". Что-то не так с этим кодом?


person And    schedule 23.09.2017    source источник


Ответы (1)


Исходя из этого, похоже, что вы управляете «K» через область неструктурированных данных, но не скопировали ее обратно на хост перед печатью. Попробуйте добавить директиву #pragma acc update self(K) перед оператором печати. В качестве альтернативы вы можете удалить оператор «#pragma acc enter data(K)», и в этом случае компилятор неявно скопирует K обратно после окончания параллельного цикла.

person Mat Colgrove    schedule 25.09.2017