我有以下示例代码:
#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,为什么?
发布于 2018-05-11 01:39:03
这里有几件事正在发生。首先,正确的子句是copyin (没有下划线)。其次,由于您只将输入值复制到区域中,因此在数据区域中所做的任何更改都不会返回到CPU,因此,除非您在共享内存系统上运行此程序,例如在多核CPU上运行,否则printf语句中的a值将如同该循环从未运行过一样。为了从数据区域返回结果,您实际上需要一个copy子句。这通知编译器将输入值复制到区域中,并从区域中复制出输出值。
既然你得到了11,很明显循环在某个地方运行。你使用的是什么编译器,有什么标志?要么你实际上没有在启用OpenACC的情况下构建,要么你在共享内存目标上运行,而你的老师没有。
https://stackoverflow.com/questions/50258124
复制相似问题