如何在 Xeon Phi 中传递结构以卸载

How to pass struct to offload in Xeon Phi

我有一个 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 的响应

您的第一次尝试失败,因为该结构不可按位复制。事实上,不允许传输包含指针的结构。使用第二种方法,编译器无法匹配成员变量,因为 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))