【发布时间】:2012-06-05 17:32:48
【问题描述】:
CUDA C 编程指南 (p.70) 说,
全局内存驻留在设备内存中,设备内存被访问 通过 32、64 或 128 字节的内存事务。这些记忆 事务必须自然对齐:仅 32、64 或 128 字节 与其大小对齐的设备内存段(即其 第一个地址是它们大小的倍数)可以读取或写入 内存事务。
所以,如果我想在 device 函数中一次访问 32、64 或 128 个连续字节,(例如复制到共享内存)什么是最合适的函数(或分配)对于这个操作?
传统 C 的 memcpy 函数似乎不能一次访问 32 个字节(非常慢)。而且因为这不是向量数据,所以我想要一个线程一次读取这些数据。
致 dbaupp
memcpy 运行良好,但我说的是速度。 例如,假设我有设备内存指针 p 并在设备函数中运行以下代码。
a) 字符 c[8]; memcpy(c, p, 8);
b) 字符 c[8]; * (双 * )c = * (双 * )p;
对于以上两种情况,结果是相同的,但是情况 b 比情况 a 快了近 8 倍(我在我的代码中测试并确认了)。
仅供参考,cudaMemcpy 功能在设备功能中不起作用。
所以,我想知道是否有任何方法可以从单个操作中复制 16 个字节。 (希望比 memcpy(c, p, 16); 快 16 倍;)
【问题讨论】:
-
如果要加载 16 个字节,请使用 CUDA 向量类型之一,例如 uint4。
-
@user727062,您应该对我的回答发表评论,以便我收到通知。你读过我所说的关于跨线程合并内存访问的内容吗?这正是 memcpy 如此缓慢以及您不应该在设备代码中使用它的原因。 (我什至给了你一个一次复制 16 个字节的例子。)
标签: cuda