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

C 如何在Xeon Phi中传递结构以卸载,c,openmp,xeon-phi,C,Openmp,Xeon Phi,我有一个struct a和几个int和一个int*成员。如何在卸载中使用此功能 我可能无法在输出(A){}中执行#pragma卸载目标(mic:0){code>,但是如何呢 #pragma卸载目标(mic:0)在(A->firstInt,A->secondInt)inout(A->intPointer:length(A->firstInt*A->secondInt)){} 但当我尝试此操作时,我得到了以下错误:在编译时,卸载子句中此变量列表的实体无效您的第一次尝试失败,因为该结构不可按位复制。事

我有一个
struct a
和几个
int
和一个
int*
成员。如何在卸载中使用此功能

我可能无法在输出(A){}中执行
#pragma卸载目标(mic:0){code>,但是如何呢

#pragma卸载目标(mic:0)在(A->firstInt,A->secondInt)inout(A->intPointer:length(A->firstInt*A->secondInt)){}


但当我尝试此操作时,我得到了以下错误:在编译时,卸载子句中此变量列表的实体无效

您的第一次尝试失败,因为该结构不可按位复制。事实上,不允许传输包含指针的结构。对于第二种方法,编译器无法匹配成员变量,因为加速器上没有
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. */
}
在复制
指针所引用的数据之前,请确保在设备上分配内存

或者,可以从结构中排除指针,并将其作为单独的变量传递。通过这种方式,您可以分别复制整个结构(现在可以按位复制)和指针

#pragma offload target(mic: 0) in(A) inout(pointer:length(A.first*A.second))

从我对
#pragma offload
的发现来看,我正在绘制Mandelbrot系列,我需要并行化绘图循环。从我收集的信息来看,我无法传递结构,因为
A->*成员*
在编译时被解决了“无法传递结构(在哪里?),因为A->*成员*…”没有告诉我太多,如果有的话。这里没有心灵感应,不要以为我们知道你的情况。