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