是否可以将cudaMemcpy与src和dest一起用作不同的类型?

时间:2012-01-09 03:35:46

标签: memory cuda

我正在使用特斯拉,这是我第一次在CPU内存而不是GPU内存上运行不足!因此,我认为我可以通过将所有整数切换为short来缩小主机内存的大小(我的所有值都低于255)。

但是,我希望我的设备内存使用整数,因为内存访问速度更快。那么有没有办法将我的主机内存(简称)复制到我的设备全局内存(在int中)?我想这不会起作用:

short *buf_h = new short[100];
int *buf_d = NULL;

cudaMalloc((void **)&buf_d, 100*sizeof(int));

cudaMemcpy( buf_d, buf_h, 100*sizeof(short), cudaMemcpyHostToDevice );

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:3)

没有办法直接做你要求的事情。 CUDA API不支持使用填充或对齐的“智能复制”,或嵌套指针的“深度复制”或类似的东西。内存传输需要线性主机和设备内存,并且源和目标内存之间的对齐必须相同。

话虽如此,绕过这种限制的一种方法是将主机short数据复制到设备上的short2分配。您的设备代码可以检索包含两个打包短信的short2,提取所需的值,然后将值转换为int。这将为每个线程提供代码32位内存事务,允许内存合并,并且(如果您使用的是Fermi GPU)良好的L1缓存命中率,因为块内的相邻线程将读取相同的32位字。在非Fermi GPU上,您可以使用共享内存方案,使用合并读取有效地检索块的所有值。