CUDA如何执行cudaMemset()
函数?如果通过启动线程数 = 元素数来实现内存初始化,我观察到可以节省大量时间。为什么能实现这样的节省?
最佳答案
cudaMemset 调用 cuMemsetD8 或 cuMemsetD8Aysnc。这在工具中很容易确定。驱动程序实现将尝试根据目标地址的对齐方式、要写入的值的大小和要写入的字节数来优化执行。这很容易通过编写一些基准来确定。 CUDA 实现必须处理所有情况(8 位对齐、尾部……)。如果您有非常具体的情况(32 位对齐,可被 4 整除),那么您应该能够编写一个在 CPU 开销方面超过驱动程序实现性能的内核。 GPU 执行时间可能相似。
就高效写入内存而言,您需要考虑几个设备限制。
- 每个 SM 每个周期可以发出 1 个 LSU 指令。在费米你需要 2 warp 和开普勒,你需要 4 个 warp 来实现这个。
- 每个 SM 每个周期可以对 L2 执行一次写入。
每个元素 1 个线程的简单映射(无论是 8 位还是 128 位)很容易实现,如果大小不是 WARP_SIZE 的倍数,则处理条件检查也相当容易。
关于memory-management - cudaMemset 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333144/