Использование OpenACC для установки значения переменной в памяти устройства

Почему следующий код не позволяет мне установить var в 10 с помощью функции intfun?

#include <iostream>

void intfun(int * variable){
    #pragma acc parallel deviceptr(variable) num_gangs(1) num_workers(1)
    {
        *variable = 10;
    }
}

int main(){
    int var;

    #pragma acc enter data create(var)
    #pragma acc host_data use_device(var)
    {
        intfun(&var);
    }
    #pragma acc exit data copyout(var)

    std::cout << var << std::endl;
}

Сборник:

pgcpp -acc main.cpp

Исполнение:

PGCC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Unknown variable reference (main.cpp: 5)
PGCC/x86 Linux 14.9-0: compilation completed with severe errors

Как заставить intfun установить значение параметра int var на устройстве?


person lodhb    schedule 22.09.2014    source источник
comment
Уберите все причудливые прагмы OpenACC и задайте себе вопрос, как можно intfun изменить аргумент, переданный value в области действия вызывающей стороны. Надеюсь, вы придете к ответу, что не может. Никакая магия и прагмы компилятора не могут это изменить....   -  person talonmies    schedule 23.09.2014
comment
Действительно, пожалуйста, смотрите мой отредактированный пост.   -  person lodhb    schedule 23.09.2014


Ответы (1)


Вы не предоставили компилятору достаточно информации для использования *variable в intfun.

Следующее работает нормально:

$ cat main7.cpp
#include <iostream>

void intfun(int * variable){
    #pragma acc parallel copy(variable[:1])
    {
        *variable = 10;
    }
}

int main(){
    int var;

        intfun(&var);

    std::cout << var << std::endl;
}
$ pgcpp -acc -Minfo main7.cpp
intfun(int *):
      5, Generating copy(variable[:1])
         Accelerator kernel generated
         Generating Tesla code
$ ./a.out
10
$

где у меня есть copy(variable[:1]), copyout(variable[:1]) также подойдет для этого конкретного примера.

person Robert Crovella    schedule 22.09.2014
comment
Спасибо! Дополнительный вопрос здесь: stackoverflow.com/questions/26003954/ - person lodhb; 24.09.2014