纹理缓存位于GPU中的哪个位置?

时间:2018-03-20 21:02:09

标签: textures opencl gpu

我开始使用OpenCL编程并了解纹理缓冲区(也称为图像)和常规缓冲区之间的差异。从我的内容来看,其中一个不同之处在于纹理提取被缓存,并且具有2D局部性。

问题是:这个纹理缓存位于何处?它是跨线程共享还是仅对单个线程中的访问有用?

例如,考虑一下这个内核:

__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;

__kernel void myCoolKernel( __read_only image2d_t image, __global float * dst) {
        const int i = get_global_id(0);
        const int j = get_global_id(1);
        dst[i+j*get_global_size(0)] = read_imagef(image, sampler, (int2){i,j}).x;
}

附近的线程(我想在同一个工作组上?)利用图像缓存吗?或者它对下面的内核更有用?

__kernel void myCoolKernel( __read_only image2d_t image, __global float * dst) {
        // Pray it's not a boundary
        const int i = get_global_id(0);
        const int j = get_global_id(1);
        float pixel1 = read_imagef(image, sampler, (int2){i+1,j}).x;
        float pixel2 = read_imagef(image, sampler, (int2){i,j-1}).x;
        float pixel3 = read_imagef(image, sampler, (int2){i-1,j}).x;
        float pixel4 = read_imagef(image, sampler, (int2){i,j+1}).x;
        dst[i+j*get_global_size(0)] = pixel1+pixel2+pixel3+pixel4;
}

我希望自己清楚明白。谢谢大家。

2 个答案:

答案 0 :(得分:2)

它在线程之间共享。它存在是因为图形API纹理(例如,OpenGL,DirectX,Vulkan等),但OpenCL图像也可以使用它。它通常具有2D位置,可能是由于Z顺序存储。它比非合并缓冲区访问快得多,但可能没有合并缓冲区访问那么快。

答案 1 :(得分:1)

它依赖于GPU。例如,某些系统可能有几个独立的系统。着色器"单位",每个单元将运行所有可用线程的子集。每个着色器单元可能都有自己的L0纹理缓存,因此分配给该单元的所有线程都将共享该缓存。

然而,像CPU一样,可能会有一个缓存层次结构,这样就有一个L1缓存可以为多个着色器单元L0提供信息。

所以回答你的问题......

  

附近的线程(我想在同一个工作组上?)会利用图像缓存吗?

...是的,如果线程作为一个集合的访问是连贯的,那么它将利用缓存层次结构。

FWIW还有更多关于the computer graphics site

上纹理缓存的使用情况