如何清除/刷新 GPU 的 L2 缓存(和 TLB)?

ein*_*ica 5 cuda gpgpu tlb cpu-cache

我有一个独立的 NVIDIA GPU(例如 Kepler 或 Maxwell)。我想在调度某些内核之前清除 L2 缓存,以免污染我的测试结果。

我可以做一些事情,比如分配一大块内存并按顺序读取远处的大量内存,这可能会起作用。但我宁愿做一些简单的事情......

笔记:

  • 我也对如何在 OpenCL 中做到这一点感兴趣,尽管不太感兴趣。
  • PTX 内联是可以接受的(但我宁愿编写正确的代码)。

ein*_*ica 1

那么,回顾一下 @MaximMilakov 和 @paleonix 的评论:

  1. 分配一大块内存(至少与 L2 一样大;也许更大)?
  2. cudaMemset()在这个大平板上执行一个操作。
  3. 据推测,您使用 memset 操作写入的内存将缓存在 L2 中 - 清除之前 L2 中的任何其他内容。

...并且这种方法被用在 NVIDIA 自己的nvbench实用程序中。

警告:这有点奇怪,因为读取和写入cudaMemset()不一定会导致 L2 缓存。