我正在使用纹理缓存来加速科学计算。我在想为什么纹理内存可以使代码更快。
一种可能性是纹理内存将L2缓存流量带到纹理缓存。如果纹理内存访问速度比L2缓存快,这是有意义的,但我还没有找到这样的基准。
有没有人知道这个?
答案 0 :(得分:0)
我有一些基准可能会解释一些事情。两个使用CUDA在PC CPU和图形卡上执行相同的计算。还有另一个使用OpenMP。请注意,下面显示的GPU有128个内核和多个寄存器,这些内核可以提供出色的性能,而不是内存速度。
http://www.roylongbottom.org.uk/linux_cuda_mflops.htm
http://www.roylongbottom.org.uk/linux%20multithreading%20benchmarks.htm#anchor5
执行的算术运算形式为x [i] =(x [i] + a)* b - (x [i] + c)* d +(x [i] + e)* f,其中2每个输入数据字8或32次操作。使用的数组大小为0.1,1或1000万个4字节单精度浮点字。以下是一些结果的摘要。
对于生成CPU要使用的输出的计算,主要障碍是图形总线速度相对较慢。第一个结果涉及400 KB转移到显卡并返回2500次。使用仅与输出相同的数据时速度加倍。最快的是没有返回所有数据(可能是一些总和)。这里。 L2缓存的基于CPU的计算速度要快得多。
第二组使用来自CPU上RAM的数据,并且可能比不涉及数据传输的CUDA计算慢。接下来的两组数据每个数据字有32个操作,其中GPU内核的数量可以带来比使用CPU更好的性能。
最终计算包括在GPU上运行的循环控制,包括使用GPU共享内存(缓存)。为了获得最佳性能,应该有最小的数据输入和输出以及每个数据字的大量计算。
AMD Phenom(tm) II X4 945 Processor 3000 MHz 4 Cores
GeForce GTS 250 with 16 Processors 128 cores
Global Memory 999 MB, Shared Memory/Block 16384 B, Max Threads/Block 512
GTS 250 ------------------------------ Phenom
Test 4 Byte Ops Repeat Seconds MFLOPS MFLOPS
Words /Wd Passes 4 Threads
Data in & out 100000 2 2500 1.035893 483 22321
Data out only 100000 2 2500 0.514445 972
Calculate only 100000 2 2500 0.082464 6063
Data in & out 10000000 2 25 0.639933 781 3240
Data out only 10000000 2 25 0.339051 1475
Calculate only 10000000 2 25 0.041672 11999
Data in & out 100000 32 2500 1.057142 7568 58670
Data out only 100000 32 2500 0.531691 15046
Calculate only 100000 32 2500 0.128706 62157
Data in & out 10000000 32 25 0.644074 12421 45377
Data out only 10000000 32 25 0.357000 22409
Calculate only 10000000 32 25 0.062001 129029
Extra tests - loop in main CUDA Function
Calculate 10000000 2 25 0.050288 9943
Shared Memory 10000000 2 25 0.009206 54313
Calculate 10000000 32 25 0.050531 158320
Shared Memory 10000000 32 25 0.046626 171580
答案 1 :(得分:0)
所有纹理事务也都流经L2缓存,所以一般来说,纹理很少比慢而不是L2。您可以将Kepler上的纹理缓存看作是只读数据的备用L1缓存。
纹理缓存的细节很复杂,并没有很好地记录,但它是一个非常高性能的缓存,特别是对于具有一定位置的流访问模式以及同一warp中不同线程之间的重用或线程块。
关于纹理缓存的一个重点是,与CPU L1缓存不同,它并不是真正旨在减少延迟。相反,它被设计成一个带宽聚合器"它聚合来自许多线程的同时加载,并尝试尽可能有效地将结果流回处理单元。这意味着内存系统可以在更少的总事务中获取相同数量的数据。
如果没有更多信息,很难说使用纹理缓存(例如通过Kepler上的ldg instrinsic)是否会提高任何特定访问模式的性能,但如果你的内核是带宽限制的,通常是值得一试。
关于您的具体观点,是的,在纹理缓存中遇到的数据不必转到L2。但是,再次由于纹理缓存的细节,这通常比带宽聚合的影响小,这导致发送到L2的总内存事务更少。