【问题标题】:Copy structure pointer array member to another array将结构指针数组成员复制到另一个数组
【发布时间】:2014-10-19 05:59:23
【问题描述】:

说,我有一个类似的结构

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

我创建了一个指针数组,如

vertex *points = new vertex[100];

所以,有时我只需要该指针数组的 x 个成员。那我该怎么做呢?

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

在此我想存储顶点的所有 x 成员。有什么命令可以做到这一点吗? 我不想使用循环来做到这一点,我想使用特殊的 memcopy 或其他东西来做到这一点。

【问题讨论】:

  • 它与 CUDA 有什么关系?你想在 CUDA 内核中做吗??
  • 是的。实际上它是一个内存复制主机到设备。但如果可能的话,我什至会考虑在主机上做。我正在优化我的内核的速度,并希望消除结构数组指针。找到可以优化速度的地方。所以,试一试,这就是我添加 cuda 标签的原因。
  • 这两个帖子可能对您有所帮助:thisthis
  • 我相信这个问题本质上是 Farzad 链接的第一个问题或从该问题链接的一个问题的副本。 cudaMemcpy2D 可以在源端和目标端的任一端或两端以跨步方式复制。
  • 你能给我举个例子吗? Nvidia 文档中没有相关示例。即使解决上述问题也可以。

标签: arrays pointers cuda structure memcpy


【解决方案1】:

cudaMemcpy2D 可用于在源或目标(或两者)数据应跨步时在主机和设备之间进行复制。

这是一个有效的例子:

$ 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
$

解析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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多