cudaMemset是如何实现的?

时间:2012-09-08 17:56:37

标签: memory-management cuda

CUDA如何执行cudaMemset()功能?如果通过启动线程数=元素数来实现内存初始化,我已经观察到相当多的时间节省。为什么要实现这种节约?

1 个答案:

答案 0 :(得分:2)

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

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

  • 每个SM可以在每个周期发出1个LSU指令。在费米,你需要2 warps和Kepler你需要4次经线来实现这一点。
  • 每个SM可以在每个周期执行一次写入L2。

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