首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenACC;copy_in不工作了吗?

OpenACC;copy_in不工作了吗?
EN

Stack Overflow用户
提问于 2018-05-10 00:32:47
回答 1查看 148关注 0票数 0

我有以下示例代码:

代码语言:javascript
复制
 #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,为什么?

EN

回答 1

Stack Overflow用户

发布于 2018-05-11 01:39:03

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50258124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档