Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将结构指针数组成员复制到另一个数组_Arrays_Pointers_Cuda_Structure_Memcpy - Fatal编程技术网

Arrays 将结构指针数组成员复制到另一个数组

Arrays 将结构指针数组成员复制到另一个数组,arrays,pointers,cuda,structure,memcpy,Arrays,Pointers,Cuda,Structure,Memcpy,比如说,我有一个这样的结构 struct vertex { int x; int y; int z; } 我制作了一个指针数组,如 vertex *points = new vertex[100]; 因此,在某一点上,我只需要该指针数组的x个成员。那我该怎么做呢 例如一个新指针: int*xPoints=新的int[100] 在这里,我要存储顶点的所有x成员。有没有这样的命令? 我不想使用循环,我想使用特殊的memcopy或其他东西来实现。可以用于在主机和设备之间复制源或目标(或

比如说,我有一个这样的结构

struct vertex
{
  int x;
  int y;
  int z;
}
我制作了一个指针数组,如

vertex *points = new vertex[100];
因此,在某一点上,我只需要该指针数组的x个成员。那我该怎么做呢

例如一个新指针: int*xPoints=新的int[100]

在这里,我要存储顶点的所有x成员。有没有这样的命令? 我不想使用循环,我想使用特殊的memcopy或其他东西来实现。

可以用于在主机和设备之间复制源或目标(或两者)数据

下面是一个成功的例子:

$ cat t553.cu
#include <stdio.h>
#define DSIZE 4

struct vertex {
  int x,y,z;
};

__global__ void mykernel(int *data, unsigned length){
  for (int i = 0; i < length; i ++) printf("kernel data[%d] = %d\n",i,data[i]);
}

int main(){

  vertex *points = new vertex[DSIZE];
  for (int i = 0; i < DSIZE; i++){
    points[i].x = 1;
    points[i].y = 2;
    points[i].z = 3;}
  int *d_ypoints;
  cudaMalloc(&d_ypoints, DSIZE*sizeof(int));
  cudaMemcpy2D(d_ypoints, sizeof(int), ((int *)points)+1, 3*sizeof(int), sizeof(int), DSIZE, cudaMemcpyHostToDevice);
  mykernel<<<1,1>>>(d_ypoints, DSIZE);
  cudaDeviceSynchronize();
  return 0;
}


$ nvcc -arch=sm_20 -o t553 t553.cu
$ cuda-memcheck ./t553
========= CUDA-MEMCHECK
kernel data[0] = 2
kernel data[1] = 2
kernel data[2] = 2
kernel data[3] = 2
========= ERROR SUMMARY: 0 errors
$

这和CUDA有什么关系?你想在CUDA内核中实现吗?是的。实际上,它是主机到设备的内存拷贝。但如果可能的话,我甚至会考虑在主机上做。我正在优化内核的速度,希望消除结构数组指针。找到了可以优化速度的地方。所以,试一试,这就是我添加cuda标签的原因。这两篇文章可能会对你有所帮助:而且。我相信这个问题本质上是Farzad链接的第一个问题或与之链接的一个问题的重复
cudaMemcpy2D
可以在源端和目标端任意一方或同时进行快速复制。你能给我举个例子吗?英伟达的文档没有它的例子。即使解决上述问题也行。
  cudaMemcpy2D(d_ypoints,  // starting pointer on the device (destination)
             sizeof(int),  // stride on device (i.e. no stride)
       ((int *)points)+1,  // starting pointer on host (.y element of first struct)
           3*sizeof(int),  // stride on host (distance between consecutive .y elements)
             sizeof(int),  // number of bytes to transfer per "row"
                   DSIZE,  // number of "rows" to transfer
 cudaMemcpyHostToDevice);  // direction of transfer