가 나는 무겁게 메모리 대역폭을 준수하고 있습니다 :FPS를 개선하고 텍스처에 임의 액세스로 메모리 대역폭을 극복하는 방법은 무엇입니까? 내 가상 현실 프로그램에서
#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-수레.
- 공유 메모리가 너무 작아 하나의 그레이 스케일 이미지를 저장할 수 없습니다.
- 루프 순서가 변경됩니다. 이상하게도,이 순서는 더 빠르지 만 다른 것은 더 나은 캐싱 동작을 가져야합니다.
- 질감을 잘 맞출 수 있도록 작업 그룹 크기를 조정하십시오.
- 압축 된 이미지 사용 (성능 향상을주는 경우는 거의 없습니다). 그러나 이론적으로 대역폭이 도움이됩니다.
귀하의 의견은 무엇입니까?
을 충족. OpenGLES 장치에서 무거운 텍스처 읽기의 목적이 무엇인지 궁금합니다. 코드의 목적에 대해 더 많은 정보를 제공하지 않으면 최적화가 다소 까다 롭습니다. – codetiger
장면의 깊이 맵 (여기서는 16 개의 개별 깊이 값)을 무차별 방식으로 최적화 할 수 있습니다. 한 프레임에서 다른 프레임으로 매트릭스 변환을하면 후속 프레임의 픽셀을 일치시킬 수 있습니다 (깊이 값이 맞다고 가정). 편집 된 버전을 참조하십시오. –
"brute force"와 "optimize"라는 단어는 거의 같은 문장에 속합니다. 텍스처 형식 RGBA F32는 무엇입니까? – solidpixel