我正在使用纹理缓存来加速科学计算。我在想为什么纹理记忆可以使代码更快。
一种可能是纹理内存将L2缓存流量引入纹理缓存。如果纹理内存访问速度快于L2缓存,这将是有意义的,但我还没有找到这样的基准测试。
有人知道这件事吗?
发布于 2014-04-12 23:08:26
所有纹理事务也都流经L2缓存,因此一般来说,纹理比L2慢的情况很少。你可以把开普勒上的纹理缓存想象成只读数据的备用L1缓存。
纹理缓存的细节是复杂的,并且没有详细的文档,但是它是一个非常高性能的缓存,特别是对于具有一定局部性的流访问模式和在同一翘曲或线程块中的不同线程之间的重用。
纹理缓存的一个要点是,与CPU L1缓存不同,它实际上并不是为了减少延迟而设计的。相反,它被设计为一个“带宽聚合器”,它聚合来自多个线程的同时负载,并试图尽可能高效地将结果流回处理单元。这意味着内存系统可以在较少的总事务中获取相同数量的数据。
如果没有更多的信息,很难判断使用纹理缓存(例如通过开普勒上的ldg内部缓存)是否会提高任何特定访问模式的性能,但是如果您的内核是带宽受限的,则通常值得一试。
关于您的特定点,是的,在纹理缓存中命中的数据将不必输出到L2。但是,由于纹理缓存的特殊性,这通常比带宽聚集的影响更小,后者导致发送给L2的总内存事务较少。
发布于 2014-04-11 10:20:58
我有一些基准可以解释一些事情。两个程序在PC CPU和图形卡上使用CUDA进行相同的计算。还有一种使用OpenMP的方法。请注意,下面显示的GPU有128个具有多个寄存器的内核,正是这些内核提供了出色的性能,而不是内存速度。
mflops.htm
http://www.roylongbottom.org.uk/linux%20multithreading%20benchmarks.htm#anchor5
执行的算术运算为xi = (xi + a) *b- (xi + c) *d+ (xi + e) *f,每个输入数据字有2、8或32个操作。所使用的数组大小为0.1、1或1 000万字节--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 171580https://stackoverflow.com/questions/22999754
复制相似问题