memory-management - cudaMemset 是如何实现的?

标签 memory-management cuda

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/

相关文章:

c++ - 如何将 constexpr 值传递给采用 const 引用的 CUDA 设备端函数?

c - (int*) 在 c 中动态分配 int 数组时

c - 如何处理 CUDA 设备上的 64 位字?

c# - 分配内存时线程争用

linux - 内存在 32 位系统中未使用?

cuda - 将参数按值传递给内核函数时,参数复制到哪里?

c++ - 设备上调用的 printf() 输出不完整

c++ - CUDA 的总线程数(随时间执行,非并行)是多少?

c++ - 外部 RAM 中的动态 vector 分配

c - 如何在库代码中分配和维护内存?