OpenACC; copy_in не работает? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть этот пример кода:

 #include <stdio.h>
 #include <stdlib.h>

 #ifdef _OPENACC
 #include <openacc.h>
 #endif

 #define N 1000

 int main() {

    #ifdef _OPENACC
    acc_init(acc_device_not_host);
    printf(" Compiling with OpenACC support \n");
    #endif 


   double * a;
   int n = 100;
   a = (double *) malloc(n * sizeof(double));
   for (int i = 0; i < n; i++)
   a[i] = 1.0f;
   #pragma acc data copy_in(a[0:n])
   {
    #pragma acc kernels loop
     for (int i = 0; i < n; i++)
        a[i] = (double) i + a[i];
   }

  #ifdef _OPENACC
   acc_shutdown(acc_device_not_host);
  #endif 



  printf("Value of a[10]: %lf\n", a[10]);

  return 0;

}

Учитель сказал мне, что результат равен 1.0, потому что у меня есть copy_in; затем a копируется на acceñeratpr, но когда он заканчивается, a содержит 1.0 в каждой позиции; но если я запускаю этот код, я получаю 11.0, почему?

1 Ответ

0 голосов
/ 10 мая 2018

Здесь происходит несколько вещей.Во-первых, правильное предложение - copyin (без подчеркивания).Во-вторых, поскольку вы копируете только входные значения в область, любые изменения, сделанные в области данных, не возвращаются в ЦП, поэтому, если вы не выполняете это в системе с общей памятью, например, работающей на многоядерном ЦПтогда значение a в вашем операторе printf будет таким, что этот цикл никогда не выполнялся.Чтобы получить результаты из области данных, вместо этого вам понадобится предложение copy.Это информирует компилятор скопировать входные значения в область и скопировать выходные значения из области.

Поскольку вы получаете 11, ясно, что цикл где-то запускается.Какой компилятор вы используете и какие флаги?Либо вы на самом деле не строите с включенным OpenACC, либо вы используете цель с общей памятью, а ваш учитель - нет.

...