2012-01-09 59 views
0

我正在使用特斯拉,而且我第一次使用CPU内存而不是GPU内存。因此,我认为我可以通过将所有整数缩短(我所有的值都低于255)来缩减主机内存的大小。是否有可能使用src和dest作为不同类型的cudaMemcpy?

但是,我希望我的设备内存使用整数,因为内存访问速度更快。那么有没有办法将我的主机内存(简而言之)复制到我的设备全局内存中(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); 

任何想法?谢谢!

回答

3

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

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

+0

如果我正确理解提问者,他们问在memcpy期间memcpy是否可以促进short-> int,答案是否定的。快递,但。即它的运行速度与cudaMemcpy()一样快。 – ArchaeaSoftware 2012-01-11 10:47:17

相关问题