2012-08-28 2 views
1

GPU에서 IDCT를 수행하는 코드가 있습니다. 변환 매트릭스를 미리 계산하고이를 상수 메모리에 저장하는 것보다 GPI에서 IDCT 매트릭스를 생성하는 것이 더 빠르다는 것을 알았습니다.분기없는 IDCT 매트릭스 생성?

문제는 IDCT 행렬을 생성하는 코드가 GPU와 잘 맞지 않는 분기를 갖고 있다는 것입니다.

GPU에서 더 빠른 IDCT 매트릭스를 생성하는 다른 방법이 있는지 궁금합니다.

// Old way 
// local_idct[x][y] = idct[x][y]; // read from precalculated matrix in constant memory 
// New way 
local_idct[x][y] = cos((x+x+1)*y * (PI/16.0f)) * 0.5f * (y == 0 ? rsqrt(2.0f) : 1); 
+0

그 코드가 어떤 분기 명령이 발생할 가능성이 없습니다. 아마도 select를 대신 수행 할 것이므로 스레드의 분기가 발생하지 않을 것입니다. 이 코드가 GPU에있는 그대로 "적합"하지 않을 이유는 없습니다. @ Paul R의 제안은 잠재적으로 유용한 최적화입니다. – harrism

답변

2

변환 크기가 작고 고정되어 있다고 가정하면이 용어에 대한 검색 표를 사용할 수 있습니다. 예 :

const float y_term[8] = { 1.0f/sqrtf(2.0f), 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; 

local_idct[x][y] = cos((x+x+1)*y * (PI/16.0f)) * 0.5f * y_term[y]; 

또한 0.5 용어를 접을 수 :

const float y_term[8] = { 0.5f/sqrtf(2.0f), 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; 

local_idct[x][y] = cos((x+x+1)*y * (PI/16.0f)) * y_term[y];