找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 75|回复: 1

复杂结构体以及Vector在CPU与GPU之间的拷贝

[复制链接]
发表于 2018-4-10 12:25:27 | 显示全部楼层 |阅读模式
ESC4000G3
本帖最后由 yuanye_sjtu 于 2018-4-10 12:27 编辑

系统配置:Win10、64位、CUDA9.0、GPU1080、VS2015

由于之前编写的CPU下运行的代码速度太慢,最近尝试用GPU进行加速,遇见几个数据拷贝相关的问题。
(1)如何将一个复杂的结构体从CPU内存拷贝到GPU内存?
现有的结构体代码如下:
  1. struct nodesTable
  2. {
  3.         int node_index;      //神经元节点的编号
  4.         double link_weight;  //连接权重
  5. };

  6. struct neuronModel
  7. {
  8. public:
  9.         char *neuron_type;    //神经元的类型
  10.         int neuron_index;     //神经元的编号
  11.         int inNodes_num;      //神经元的输入节点的数量
  12.         nodesTable *inNodes;  //神经元的输入节点链表

  13.         double sysTrans_total;      //神经元接收到的突触前电流
  14.         double input_total;         //神经元接收到的总电流
  15.         double memInteg_vol;        //神经元的膜电压
  16.         bool mem_fireflag;          //神经元发放脉冲的标志
  17.         int mem_fireNum;            //神经元发放脉冲的数量
  18.         vector<int> firetime;
  19.         
  20.         vector<double> transEnergy;
  21.         vector<double> integEnergy;
  22.         double transEnergyTotal;
  23.         double integEnergyTotal;
  24.         
  25.         double sysTrans_alpha;      //神经元突触传输消耗的能量在总能量中的占比
  26.         double sysTrans_ffunc;      //神经元的突触可塑性调节因子
  27.         

  28.         void initNeuronModel(char *nType, int nIndex, double ** matrix);
  29.         void computeCurrent(int stepNum);
  30.         void computeVoltage(int stepNum);
  31.         void updateSysWeight(int stepNum);
  32.         void computeEnergy(int stepNum);

  33. private:
  34. };
复制代码

我在网上看过一些技术博客,似乎都是将结构体中各种变量拆分后,使用cudaMemcpy等函数拷贝到GPU内存中。请问,有直接拷贝结构体的方法吗?如果存在直接整体拷贝的方法,请问直接拷贝和拆分后拷贝,哪一种方法好?

(2)因为我没找到直接拷贝复杂结构体的方法,所以我将上述结构体中的变量分别拷贝到GPU内存中。常见的数组的拷贝有教程可以参照,但是针对vector的拷贝,我找了很多资料,都没有得到合适的答案。根据我看的资料,GPU中vector的处理可以分为两种方法,一是转变为其他结构,二是使用thrust。我选择使用thrust,代码如下
  1. __global__ void computeCurrent(int* d_ftime)
  2. {
  3.     int idx = blockDim.x*blockIdx.x + threadIdx.x;
  4.     printf("ftime = %d\n", d_ftime[idx]);   
  5. }

  6. thrust::device_vector<int> dev_firetime[1000];
  7. int* d_ftime = thrust::raw_pointer_cast(dev_firetime[0].data());
  8. computeCurrent<<<....>>>(d_ftime);
复制代码
可以看到,我定义了1000个vector,此处仅仅将第一个vector的指针赋予d_ftime。有没有办法将1000个vector的指针一次性传递给核函数?我曾经模仿上述做法,尝试使用指针数组的形式将每个vector的指针存在数组中,将数组的地址传递给核函数,但是参数传递始终出现错误。



回复

使用道具 举报

发表于 2018-4-10 16:17:31 | 显示全部楼层
Jetson TX2
对于GPU来说,要处理一个类的对象实例其实是比较繁琐、浪费性能与资源的。尽管您这里用了struct,但本质上仍然是个class,两者毫无区别~
一般建议您把这里的vector类型直接改用数组,指针部分也得当心,因为CPU是64位还是32位;GPU的地址占多少位您必须确定,否则两者长度是不同的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表