3

CUDA如何执行cudaMemset()功能?如果通过启动线程数 = 元素数来实现内存初始化,我观察到可以节省大量时间。为什么会实现这样的节省?

4

1 回答 1

2

cudaMemset 调用 cuMemsetD8 或 cuMemsetD8Aysnc。这在工具中很容易确定。驱动程序实现将尝试根据目标地址的对齐、要写入的值的大小和要写入的字节数来优化执行。这很容易通过编写一些基准来确定。CUDA 实现必须处理所有情况(8 位对齐,尾部,...)。如果您有非常特殊的情况(32 位对齐,可被 4 整除),那么您应该能够编写一个在 CPU 开销方面超过驱动程序实现性能的内核。GPU 执行时间可能相似。

在有效写入内存方面,您需要考虑几个设备限制。

  • 每个 SM 每个周期可以发出 1 条 LSU 指令。在费米上你需要 2 条经线,而开普勒则需要 4 条经线来实现这一点。
  • 每个 SM 每个周期可以对 L2 执行一次写操作。

每个元素 1 个线程(无论是 8 位还是 128 位)的简单映射很容易实现,并且如果大小不是 WARP_SIZE 的倍数,则相当容易处理条件检查。

于 2012-09-08T20:04:45.980 回答