1

このコードでは:

#include <iostream>

void intfun(int * variable, int value){
    #pragma acc parallel present(variable[:1]) num_gangs(1) num_workers(1)
    {
        *variable = value;
    }
}

int main(){
    int var, value = 29;

    #pragma acc enter data create(var) copyin(value)
        intfun(&var,value);
    #pragma acc exit data copyout(var) delete(value)

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

のデバイスメモリ上にあるとどのようにint value認識されintfunますか? present(variable[:1])プラグマでbypresent(variable[:1],value)に置き換えるintfunと、次のランタイム エラーが発生します。

FATAL ERROR: data in PRESENT clause was not found on device 1: name=_43144_33_value
 file:/opt/pgi/linux86-64/14.9/include/CC/iostream intfun__FPii line:5
Present table dump for device[1]: NVIDIA Tesla GPU 1, compute capability 3.5
host:0x7fffc11faa28 device:0x2303f20200 size:4 presentcount:1 line:14 name:_43152_14_value
host:0x7fffc11faa34 device:0x2303f20000 size:4 presentcount:2 line:14 name:_43152_9_var

valueそれを指定するとpresent上記の失敗につながる理由がわかりません。valueディレクティブで一度だけコピーされたNVVP で確認しました。つまり、ディレクティブでenter data再度コピーされていません。OpenACC はどのようにその魔法を働かせるのですか?parallelintfun

4

1 に答える 1