Struct cudaMemcpyAsync仅将结构的一个成员从设备同步到主机

Struct cudaMemcpyAsync仅将结构的一个成员从设备同步到主机,struct,cuda,Struct,Cuda,我有一个具有多个成员的结构,我想通过GPU对该成员的某些部分执行一些操作。为了使沟通的规模尽可能小,我希望只复制那些已修改的成员。库达能做到吗 struct nodeInfo; typedef struct nodeInfo { int x; int y; }nodeProp; int main(int argc, char* argv[]){ int ngpus; CHECK(cudaGetDeviceCount(&ngpus)); cudaStream_t s

我有一个具有多个成员的结构,我想通过GPU对该成员的某些部分执行一些操作。为了使沟通的规模尽可能小,我希望只复制那些已修改的成员。库达能做到吗

struct nodeInfo;

typedef struct nodeInfo
{
  int x;
  int y;
}nodeProp;

int main(int argc, char* argv[]){
  int ngpus;
  CHECK(cudaGetDeviceCount(&ngpus));
  cudaStream_t stream[ngpus];

  nodeProp *Nodes;
  nodeProp *gpuNodes[ngpus];

  int rankSize = 10;
  int deviceSize = rankSize/ngpus;

  CHECK(cudaMallocHost((void**)&Nodes,rankSize*sizeof(nodeProp)));

  for(int i = 0; i < ngpus; i++)
    {
      cudaSetDevice(i);
      cudaStreamCreate(&stream[i]);
      CHECK(cudaMalloc((void**)&gpuNodes[i],deviceSize*sizeof(nodeProp)));
      CHECK(cudaMemcpyAsync(gpuNodes[i],Nodes+i*deviceSize,deviceSize*sizeof(nodeProp),cudaMemcpyHostToDevice,stream[i]));
    }

  for(int i = 0; i < ngpus; i++)
    {
      cudaSetDevice(i);
      kernel_x_Operation<<<grid_size,block_size,0,stream[i]>>>(gpuNodes[i]);//Some operation on gpuNodes.x

     //How to write the memcpy function? Can I just copy one member of the struct back?
      CHECK((void*)cudaMemcpyAsync((Nodes+i*deviceSize)->x, gpuNodes[i]->x), sizeof(int)*deviceSize,cudaMemcpyDeviceToHost,stream[i]));

      cudaDeviceSynchronize();
   }
}
struct nodeInfo;
类型定义结构节点信息
{
int x;
int-y;
}nodeProp;
int main(int argc,char*argv[]){
int ngpus;
检查(cudaGetDeviceCount(&ngpus));
cudaStream_t stream[ngpus];
nodeProp*节点;
nodeProp*gpuNodes[ngpus];
int rankSize=10;
int deviceSize=rankSize/ngpus;
检查(cudaMallocHost((void**)和节点,rankSize*sizeof(nodeProp));
对于(int i=0;ix,gpuNodes[i]->x),sizeof(int)*设备大小,cudamemcpydevicetoost,流[i]);
cudaDeviceSynchronize();
}
}

不,你不能那样做。但是,您可以通过将数据作为数组的结构而不是结构的数组来进行布局,从而实现类似的效果


请看一看这可能会如何提高性能。

谢谢。我去看看。