Memory management cudaMemset是如何实现的?

Memory management cudaMemset是如何实现的?,memory-management,cuda,Memory Management,Cuda,CUDA如何执行cudaMemset()函数?我观察到,如果通过启动线程数=元素数来实现内存初始化,可以节省大量时间。为什么会实现这样的节省?CudAmSet调用CumSetD8或CumSetD8AySNC。这很容易在工具中确定。驱动程序实现将尝试根据目标地址的对齐方式、要写入的值的大小以及要写入的字节数优化执行。这很容易通过编写一些基准来确定。CUDA实现必须处理所有情况(8位对齐、尾部等)。如果您有非常特殊的情况(32位对齐,可被4整除),那么您应该能够编写一个内核,在CPU开销方面超过驱动

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

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

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

  • 每个SM每个周期可以发出1条LSU指令。关于费米,你需要2 扭曲和开普勒你需要4扭曲来实现这一点
  • 每个SM每个周期可以对L2执行一次写入

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

看一下这个演示:值得一提的是,驱动程序API函数是使用NVIDIA编写的内核实现的。开发人员使用自己的内核实现更高的性能并非闻所未闻,特别是如果开发人员利用了NVIDIA无法依赖的先验知识(例如Greg提到的指针对齐和字节计数输入)。