C++ 英特尔至强Phi卸载代码+;STL向量

C++ 英特尔至强Phi卸载代码+;STL向量,c++,vector,stl,intel-mic,offloading,C++,Vector,Stl,Intel Mic,Offloading,我想将STL向量中存储的数据复制到英特尔至强Phi协处理器。在我的代码中,我创建了一个类,该类包含计算所需的数据向量。我想在主机上创建类对象,在主机上初始化数据,然后我想把这个对象发送到协处理器。这是一段简单的代码,说明了我要做的事情。将对象复制到协处理器后,向量为空。有什么问题吗?如何正确地使用它 #pragma offload_attribute (push, target(mic)) #include <vector> #include "offload.h" #include

我想将STL向量中存储的数据复制到英特尔至强Phi协处理器。在我的代码中,我创建了一个类,该类包含计算所需的数据向量。我想在主机上创建类对象,在主机上初始化数据,然后我想把这个对象发送到协处理器。这是一段简单的代码,说明了我要做的事情。将对象复制到协处理器后,向量为空。有什么问题吗?如何正确地使用它

#pragma offload_attribute (push, target(mic))
#include <vector>
#include "offload.h"
#include <stdio.h>
#pragma offload_attribute (pop)

class A
{
    public:
    A() {}
    std::vector<int> V;
};

int main()
{
    A* wsk = new A();
    wsk->V.push_back(1);

    #pragma offload target(mic) in(wsk)
    {
        printf("%d", wsk->V.size());

        printf("END OFFLOAD");
    }
    return 0;
}
#杂注卸载_属性(推送、目标(麦克风))
#包括
#包括“卸载.h”
#包括
#pragma卸载_属性(pop)
甲级
{
公众:
A(){}
std::向量V;
};
int main()
{
A*wsk=新的A();
wsk->V.向后推(1);
#pragma卸载目标(mic)输入(wsk)
{
printf(“%d”,wsk->V.size());
printf(“最终卸载”);
}
返回0;
}

当一个对象被复制到协处理器时,只有该元素本身的内存,它属于
A
std::vector
分配一个单独的内存块来存储其元素。在
A
中嵌入的
std::vector
上进行复制不会在其元素上进行复制。我建议不要直接使用
std::vector
。可以复制其元素,但不能复制向量本身

  int main()
  {
      A* wsk = new A();
      wsk->V.push_back(1);

      int* data = &wsk->V[0];
      int size = wsk->V.size();

      #pragma offload target(mic) in(data : length(size))
      {
          printf("%d", size);

          printf("END OFFLOAD");
      }
      return 0;
  }

好的,这就是我需要的:)。当我们有三个类:A类、B类和C类,分别是std::vector和std::vector时,情况如何?如果要在协处理器上可用,必须在
in
子句中显式列出每一块内存。该内存不能包含指针,除非这些指针指向的内容也在
in
子句中。这就排除了使用
std::vector
和大多数其他标准容器的可能性,因为它们都在内部使用指针,并且没有充分地公开它们以允许在
中使用
。一个值得注意的例外可能是
std::array
,您只需在(u数组)