我有一些在GPU上执行IDCT的代码。我注意到,在gpu上生成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);
最佳答案
假设您的转换大小较小且固定,则可以为此词使用查找表,例如
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];
关于c++ - 无分支生成IDCT矩阵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12157384/