我有一个struct A
,其中包含一些int
和一个int *
成员。如何在卸载中使用它?
我可能无法#pragma offload target(mic: 0) inout(A){}
...,但
#pragma offload target(mic: 0) in(A->firstInt, A->secondInt) inout(A->intPointer:length(A->firstInt*A->secondInt)){}
但是当我尝试这个时,我在编译时得到了error: invalid entity for this variable list in offload clause
答案 0 :(得分:1)
您的第一次尝试失败,因为结构不是按位可复制的。实际上,不允许传输包含指针的结构。使用第二种方法时,编译器无法匹配成员变量,因为A
在加速器上不可用。您可以通过预先提取成员并使用单个变量来解决问题。
struct S {
int firstInt;
int secondInt;
int *intPointer;
};
假设您有上述结构的实例A
,您可以执行以下操作。
int first = A.firstInt;
int second = A.secondInt;
int *pointer = A.intPointer;
之后,您可以使用卸载区域内的各个变量。
#pragma offload target(mic: 0) in(first, second)
inout(pointer:length(first*second))
{
/* Use individual variables here. */
}
确保在复制pointer
引用的数据之前在设备上分配内存。
或者,您可以从结构中排除指针并将其作为单独的变量传递。这样,您可以复制整个结构(现在可以按位复制)和单独指针。
#pragma offload target(mic: 0) in(A) inout(pointer:length(A.first*A.second))