prefetch 和 prefetchu ptx 指令有啥区别?

Posted

技术标签:

【中文标题】prefetch 和 prefetchu ptx 指令有啥区别?【英文标题】:What is the difference between prefetch and prefetchu ptx instructions?prefetch 和 prefetchu ptx 指令有什么区别? 【发布时间】:2015-04-06 00:03:41 【问题描述】:

Here 在文档中声明prefetchprefetchu ptx 指令“在指定状态空间中预取包含指定内存层次结构级别的通用地址的行” .还提到了语法是

prefetch.space.level [a]; // prefetch to data cache
prefetchu.L1 [a]; // prefetch to uniform cache

.space =  .global, .local ;
.level =  .L1, .L2 ;

我想知道这里提到的uniform cache 是什么;而语法(在第 2 行)指定数据将被预取到 L1 中? prefetchu 不是多余的,而存在 prefetch 指令也允许预取到 L1?比如下面这几行代码有什么区别?

prefetch.global.L1  [a];  // a maps to global memory.
prefetchu.L1  [a];  // a maps to global memory.

【问题讨论】:

我不确定,但我认为“统一缓存”是指“常量缓存”,它具有广播功能。它允许将相同的数据广播到 warp 中的所有线程,前提是访问是统一的,即 warp 中的所有线程都访问相同的地址。虽然在旧架构上,常量缓存与常规 L1 是分开的,但我相信它已被吸收到 Maxwell 上的通用只读缓存中。同样,我对此不确定。为什么这些预取指令的详细信息对您的用例很重要?你希望完成什么? @njuffa 在我的程序中,warp 中的一些线程在某个点进行非合并全局读取。在此读取之后可以安排非依赖指令,而无需等待读取的内容。所以我想我可以在发现地址后立即进行prefetch 操作,然后安排我的非依赖操作。当需要该地址的内容时,希望它可以在缓存中找到。基本上我试图隐藏内存访问延迟。 @njuffa 虽然我猜测 NVCC 编译器已经在做优化之类的事情,但我认为程序的设计者可能能够更好地推断哪里可以更好地获取此类数据。例如,如果在 Kepler 设备上,程序不使用共享内存并且没有寄存器溢出,如果 SM 内只有少数线程进行此类访问,那么在 L1 上预取可能会更好。 只是同意@njuffa,我认为prefetchu 使用与LDU 相同的机制。不确定它在非 cc2.x 设备上是否有任何意义。我怀疑prefetch 通常可以由 ptxas 编译器以不止一种方式解释。检查这些指令(如果有的话)发出的 SASS 可能是有益的。 【参考方案1】:

统一缓存确实是常量缓存,如《CUDA应用设计与开发》一书中所述:

..."SM 还包含常量 (labeled Uniform cache" (sic)...

https://books.google.com.tr/books?id=Y-XmJO2uwvMC&pg=PA112&lpg=PA112#v=onepage&q&f=false

【讨论】:

以上是关于prefetch 和 prefetchu ptx 指令有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PTX 和 CUBIN w.r.t 有啥区别? NVCC 编译器?

NVCC 和 NVRTC 在编译到 PTX 上的区别

NVCC和NVRTC在编译为PTX时的差异

ptx 汇编中的 %f, %rd 是啥意思

我应该研究 PTX 来优化我的内核吗?如果是这样,怎么做?

将 PTX 程序直接传递给 CUDA 驱动程序