В моей программе виртуальной реальности я сильно ограничен пропускной способностью памяти:
#version 320 es
precision lowp float;
const int n_pool = 30;
layout(local_size_x = 8, local_size_y = 16, local_size_z = 1) in;
layout(rgba8, binding = 0) writeonly uniform lowp image2D image;
layout(rgba8, binding = 1) readonly uniform lowp image2DArray pool;
uniform mat3 RT[n_pool]; // <- this is a rotation-translation matrix
void main() {
uint u = gl_GlobalInvocationID.y;
uint v = gl_GlobalInvocationID.x;
vec4 Ir = imageLoad(pool, ivec3(u,v,29));
float cost = 1.0/0.0;
for (int j = 0; j < 16; j++) {
float C = 0.0;
for (int i = 0; i < n_pool; i++) {
vec3 w = RT[i]*vec3(u,v,j);
C += length(imageLoad(pool, ivec3(w[0],w[1],i)) - Ir);
}
}
cost = C < cost ? C : cost;
}
imageStore(image, ivec2(u,v), vec4(cost, cost, cost, 1.0));
}
Вы можете видеть, что у меня есть много случайных обращений к TEXTURE_2D_ARRAY
(ширина = 320, высота = 240, слои = 30). Однако доступ не такой уж случайный, потому что он будет в непосредственной близости от u,v.
Вот мои мысли:
- другой формат текстуры вместо rgba-floats (может быть, rgba-unsigned byte?).
- общая память слишком мала, чтобы хранить даже одно изображение в градациях серого.
- изменение порядка циклов. Как ни странно, этот порядок быстрее, хотя другой должен иметь лучшее поведение кэширования.
- изменение размеров рабочих групп, чтобы они лучше соответствовали текстурам.
- с использованием сжатых изображений (маловероятный сценарий, обеспечивающий повышение производительности). Теоретически, однако, это должно помочь с пропускной способностью.
о чем ты думаешь?