2012-08-28 90 views
1

我有一些代碼在GPU上執行IDCT。我注意到,在GPU上生成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

該代碼是不太可能產生任何分支指令。它可能會做一個選擇,所以不會有線程分歧。這個代碼沒有理由不能像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];