0

我有这个示例代码:

 #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,为什么?

4

1 回答 1

1

这里发生了几件事。首先,正确的子句是copyin(没有下划线)。其次,由于您只是将输入值复制到区域中,因此在数据区域内所做的任何更改都不会返回到 CPU,因此除非您在共享内存系统上运行它,例如在多核 CPU 上运行,那么aat 你的printf语句的值将就像那个循环从未运行过。为了从数据区域取回结果,您实际上需要一个copy子句。这会通知编译器将输入值复制到该区域并从该区域复制输出值。

由于你得到 11,显然循环正在某个地方运行。您使用的是什么编译器以及什么标志?要么您实际上并没有在启用 OpenACC 的情况下进行构建,要么您在共享内存目标上运行而您的老师没有。

于 2018-05-10T17:39:03.023 回答