#pragma acc host_data 是做什么的?
what does #pragma acc host_data do?
构造什么(p在gpu上)
#pragma acc host_data use_device(p)
{...}
到底是怎么回事?
"host_data 构造使设备数据的地址可用
在主机上。”(OpenAcc API)。use_device - "directs the compiler to use the device address of any entry in list, for instance, when passing a variable to procedure"(OpenAcc 编程和最佳实践指南)。这是否意味着,例如,如果我有变量
int A=1;
int B=2;
#pragma acc declare device_resident(A,B)
...
位于设备上,我可以从主机写入
#pragma acc host_data use_device(A,B)
{
memcpy(&A,&B,sizeof(int));
}
我想这是错误的。请给我解释一下。
OpenACC "host_data" 指令在您需要获取变量的设备地址以便在主机代码中使用时使用。当您想传入变量的设备地址时,它主要用于与 CUDA 或 CUDA 感知 MPI 的互操作性。
在您的示例中,这很可能会导致错误,因为将设备地址传递给系统 "memcpy" 会产生段错误。尽管如果您将 "memcpy" 更改为 "cudaMemcpy" 或其他需要传入设备地址的例程,那么它会很好。
这篇博客 post 可能会有帮助:https://devblogs.nvidia.com/parallelforall/3-versatile-openacc-interoperability-techniques/
构造什么(p在gpu上)
#pragma acc host_data use_device(p)
{...}
到底是怎么回事? "host_data 构造使设备数据的地址可用 在主机上。”(OpenAcc API)。use_device - "directs the compiler to use the device address of any entry in list, for instance, when passing a variable to procedure"(OpenAcc 编程和最佳实践指南)。这是否意味着,例如,如果我有变量
int A=1;
int B=2;
#pragma acc declare device_resident(A,B)
...
位于设备上,我可以从主机写入
#pragma acc host_data use_device(A,B)
{
memcpy(&A,&B,sizeof(int));
}
我想这是错误的。请给我解释一下。
OpenACC "host_data" 指令在您需要获取变量的设备地址以便在主机代码中使用时使用。当您想传入变量的设备地址时,它主要用于与 CUDA 或 CUDA 感知 MPI 的互操作性。
在您的示例中,这很可能会导致错误,因为将设备地址传递给系统 "memcpy" 会产生段错误。尽管如果您将 "memcpy" 更改为 "cudaMemcpy" 或其他需要传入设备地址的例程,那么它会很好。
这篇博客 post 可能会有帮助:https://devblogs.nvidia.com/parallelforall/3-versatile-openacc-interoperability-techniques/