我该如何清除/刷新GPU的L2缓存(以及TLB)?

5
我有一个离散的NVIDIA GPU(比如Kepler或Maxwell)。我想在一些核函数被调度之前清除我的L2缓存,以避免污染我的测试结果。
我可以做一些像分配一个大块内存并顺序读取它的东西,那可能会起作用。但我更愿意做一些更简单的事情...
注意:
  • 我也对如何在OpenCL中完成此操作感兴趣,尽管不是非常感兴趣。
  • PTX内联是可以接受的(但我宁愿编写适当的代码)。

1
你可以对已分配的内存使用cudaMemset,这应该也能起作用。我想不到更简单的方法了。 - Maxim Milakov
@MaximMilakov:我不想改变内存中的值,那样会破坏我的整个目的。我想要将一些东西写入内存,清除缓存,然后启动一些访问该内存的内核。 - einpoklum
3
你的解决方案是“分配一个大块内存并按顺序读取”。我想说的是,如果你只是为了清除L2缓存而分配了这么大的内存,那么你可以使用cudaMemset来清空这个大块内存,这也应该能够完成任务。 - Maxim Milakov
4
所有DRAM的访问都通过L2缓存进行。 - Maxim Milakov
2
@MaximMilakov所描述的解决方案也被用于Nvidia自己的nvbench(为了保持一致性,链接到特定的提交,但目前在主分支上是相同的)。 - paleonix
显示剩余2条评论
1个回答

1

因此,回顾一下@MaximMilakov和@paleonix的评论:

  1. 分配大块内存(至少与L2相同大小;可能更大)?
  2. 在此大块上执行cudaMemset()
  3. 据说,您将使用memset操作写入的内存将被缓存在L2中-清除先前在L2中的任何其他内容。

......这种方法是NVIDIA自己的nvbench实用程序中使用的。

警告:这有点奇怪,因为使用cudaMemset()进行读写不一定会导致L2缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接