如何使用OpenMP将C中的用户定义结构传递给加速器?

时间:2017-03-07 22:22:16

标签: c openmp gpu hardware-acceleration offloading

我有一个结构定义,其中我有一个动态分配的数组,我需要通过一些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机器上编译它,这对编译器消息很重要,但不应该对一般问题起作用(如何将这样的结构传递给加速器 - 如果它是可能的)。不幸的是我现在可以访问该机器,因此不能提供有关我使用的编译器版本的更多信息 - 但同样,这不应该与一般问题相关(至少在我的理解中)。

0 个答案:

没有答案