CUDA实践指南(十九)

简介:

本地内存:
本地内存是如此命名的,因为它的范围对于线程来说是本地的,而不是因为它的物理位置。事实上,本地内存是片外的。因此,访问本地内存与访问全局内存一样昂贵。换句话说,名称中的术语“本地”并不意味着访问速度更快。
本地内存仅用于保存自动变量。这是由nvcc编译器在确定没有足够的寄存器空间来保存变量时完成的。可能放置在本地内存中的自动变量是大型结构或数组,会占用太多的寄存器空间,而编译器确定的数组可能会动态编制索引。
检查PTX汇编代码(通过使用-ptx或-keep命令行选项编译到nvcc获得)显示在第一个编译阶段期间变量是否已放置在本地内存中。如果有,它将使用.local助记符进行声明并使用ld.local和st.local助记符进行访问。如果没有,则后续编译阶段可能仍然会作出其他决定,如果他们发现变量为目标架构消耗太多寄存器空间。没有办法针对特定变量检查这一点,但编译器在使用--ptxas-options = -v选项运行时报告每个内核的本地内存使用情况(lmem)。
纹理内存:
只读纹理内存空间被缓存。 因此,纹理读取只需要在高速缓存未命中时读取一个器件存储器; 否则,它只花费一次从纹理缓存中读取数据。 纹理缓存针对2D空间局部性进行了优化,因此读取贴近在一起的纹理地址的相同变形的线程将获得最佳性能。 纹理内存也被设计用于具有恒定延迟的流式抓取; 也就是说,缓存命中减少了DRAM带宽需求,但不能提取延迟。 在某些寻址情况下,通过纹理读取读取设备存储器可能是从全局或常量存储器读取设备存储器的有利替代方案。
其他纹理功能:
如果使用tex1D(),tex2D()或tex3D()而不是tex1Dfetch()来提取纹理,则硬件提供了其他功能,这些功能可能对图像处理等应用程序有用,如表4所示。
1

在内核调用中,纹理高速缓存不会与全局内存写入保持一致,因此从同一内核调用中通过全局存储器写入的地址获取的纹理会返回未定义的数据。 也就是说,如果该位置已被先前的内核调用或内存副本更新,则线程可以安全地通过纹理读取内存位置,但如果先前已由相同内核调用中的相同线程或另一线程更新,则线程可以安全地读取内存位置。

目录
相关文章
|
存储 并行计算
|
并行计算 C语言 存储
|
存储 并行计算 调度
|
存储 缓存 并行计算
|
并行计算 异构计算
|
并行计算 API 异构计算
|
并行计算 编译器 C语言
|
并行计算 编译器 C语言