我有一些代码在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);
答案 0 :(得分: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];