Как передать пользовательскую структуру в C с OpenMP для ускорителя?

У меня есть определенная структура, в которой у меня есть динамически распределенный массив, и мне нужно передать эту структуру с хоста на ускоритель (в моем случае это будет некоторый графический процессор nvidia) через некоторые директивы OpenMP (в C-коде),

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 ); 
}

Дополнительный structgrid_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 ответов

Другие вопросы по тегам