|
本帖最后由 yuanye_sjtu 于 2018-4-10 12:27 编辑
系统配置:Win10、64位、CUDA9.0、GPU1080、VS2015
由于之前编写的CPU下运行的代码速度太慢,最近尝试用GPU进行加速,遇见几个数据拷贝相关的问题。
(1)如何将一个复杂的结构体从CPU内存拷贝到GPU内存?
现有的结构体代码如下:
- struct nodesTable
- {
- int node_index; //神经元节点的编号
- double link_weight; //连接权重
- };
- struct neuronModel
- {
- public:
- char *neuron_type; //神经元的类型
- int neuron_index; //神经元的编号
- int inNodes_num; //神经元的输入节点的数量
- nodesTable *inNodes; //神经元的输入节点链表
- double sysTrans_total; //神经元接收到的突触前电流
- double input_total; //神经元接收到的总电流
- double memInteg_vol; //神经元的膜电压
- bool mem_fireflag; //神经元发放脉冲的标志
- int mem_fireNum; //神经元发放脉冲的数量
- vector<int> firetime;
-
- vector<double> transEnergy;
- vector<double> integEnergy;
- double transEnergyTotal;
- double integEnergyTotal;
-
- double sysTrans_alpha; //神经元突触传输消耗的能量在总能量中的占比
- double sysTrans_ffunc; //神经元的突触可塑性调节因子
-
- void initNeuronModel(char *nType, int nIndex, double ** matrix);
- void computeCurrent(int stepNum);
- void computeVoltage(int stepNum);
- void updateSysWeight(int stepNum);
- void computeEnergy(int stepNum);
- private:
- };
复制代码
我在网上看过一些技术博客,似乎都是将结构体中各种变量拆分后,使用cudaMemcpy等函数拷贝到GPU内存中。请问,有直接拷贝结构体的方法吗?如果存在直接整体拷贝的方法,请问直接拷贝和拆分后拷贝,哪一种方法好?
(2)因为我没找到直接拷贝复杂结构体的方法,所以我将上述结构体中的变量分别拷贝到GPU内存中。常见的数组的拷贝有教程可以参照,但是针对vector的拷贝,我找了很多资料,都没有得到合适的答案。根据我看的资料,GPU中vector的处理可以分为两种方法,一是转变为其他结构,二是使用thrust。我选择使用thrust,代码如下
- __global__ void computeCurrent(int* d_ftime)
- {
- int idx = blockDim.x*blockIdx.x + threadIdx.x;
- printf("ftime = %d\n", d_ftime[idx]);
- }
- thrust::device_vector<int> dev_firetime[1000];
- int* d_ftime = thrust::raw_pointer_cast(dev_firetime[0].data());
- computeCurrent<<<....>>>(d_ftime);
复制代码 可以看到,我定义了1000个vector,此处仅仅将第一个vector的指针赋予d_ftime。有没有办法将1000个vector的指针一次性传递给核函数?我曾经模仿上述做法,尝试使用指针数组的形式将每个vector的指针存在数组中,将数组的地址传递给核函数,但是参数传递始终出现错误。
|
|