结构体的数组传输,目前的理解是在GPU开辟一块显存,和CPU中的数据的排列顺序一一对应,并在GPU定义一个结构体,能够灵活的访问数据。
现在就以pycuda的DemoStruct为例来进行说明。目前指针只用到了一维的,在GPU中定义结构体:
在这个结构体中有三个变量datalen,__padding,ptr。其中ptr是一个指针,datalen指的当前ptr中的数据长度,__padding为占位符无具体意义,为了能够访问到ptr。
根据当前结构体的定义,我们可以发现,在这个结构模型中使用的内存空间为4+4+8=16个字节。那么在CPU端申请GPU端的结构体时,一个结构体需要的GPU空间为16个字节。
现在申请GPU内存空间:
如图所示,其中DoubleOpStruct.mem_size为GPU端结构体的空间大小,及16个字节。
在该程序中,向GPU传输数据写在了python的构造函数中,其中array为数组,cuda.to_device(array)将array数组传到GPU上,并返回一个GPU地址,之后将返回的地址传到GPU上结构体对应的地址上。
如图所示,接下来构造第二个结构体 ,即将起始地址移动一个结构体大小,寻找下一个结构体的起始位置,依次类推。
数据传输完成后,就可以在GPU上以结构体的方式访问数据了。