1

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);
4

1 に答える 1

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];
于 2012-08-28T10:35:08.540 に答える