我定义了一个结构,其中我有一个动态分配的数组,我需要通过一些 OpenMP 指令(在 C 代码中)将此结构从主机传输到加速器(在我的情况下,它将是一些 nvidia GPU) .
struct
外观如下:
struct my_grid {
double **a,
**b,
**c;
};
它初始化如下:
initialize_my_grid( struct my_grid *my_gd,
struct grid_config grid_cfg ) {
my_gd->a = matrix_double( grid_cfg.N1.value, grid_cfg.N2.value );
my_gd->b = matrix_double( grid_cfg.N1.value, grid_cfg.N2.value );
my_gd->c = matrix_double( grid_cfg.N1.value, grid_cfg.N2.value );
}
附加struct
grid_config
只包含一些标量,相关部分如下所示:
struct grid_config {
struct my_variable_size_t
N1, N2;
}
struct my_variable_size_t {
size_t value;
内存分配函数如下(为了便于阅读省略了NULL错误检查):
double **matrix_double( size_t n_rows, size_t n_cols ) {
size_t ii;
double *arr;
// (c)allocate pointers to rows
arr = calloc( (size_t)n_rows, sizeof(double*) );
// (c)allocate rows and set pointer to cols (?)
arr[0] = calloc( (size_t)(n_rows*n_cols), sizeof(double) );
for ( ii=1 ; ii<n_rows ; ++ii )
arr[ii] = arr[ii-1] + n_cols;
}
在我想在加速器(GPU)上运行的相关循环中,我想我可以做类似的事情
#pragma omp target teams distribute private(jj,kk)
for ( jj=2 ; jj<grid_cfg.N1.value-2 ; jj+=2 ) {
for ( kk=2 ; kk<grid_cfg.N2.value-2 ; kk+=2 ) {
wf_gd->a[jj ][kk ] += wf_gd->b[jj+1][kk ]; // plus additional calculations
}
}
但这不起作用,因为我遇到编译器错误,例如Unsupported OpenACC construct Deep copy -- wf_gd
使用cc
.
首先,我不明白为什么编译器会提到 OpenACC,然后我也想知道是否可以使用这种数据结构,或者我是否需要在这种情况下摆脱它?
编辑:我试图在 CRAY 机器上编译它,这对编译器消息很重要,但不应该对一般问题起作用(如何将这样的构造传递给加速器 - 如果可能的话)。不幸的是,我现在可以访问那台机器,因此没有提供有关我使用的编译器版本的更多信息 - 但同样,这不应该与一般问题相关(至少在我的理解中)。