1

次の C コードをより高速に処理する方法を探しています。640x480 の画像があり、画像の行と列を 1 つおきに削除して 2 倍に間引きたいと考えています。以下にコードを添付しました。コードを最適化するより良い方法はありますか。

#define INPUT_NUM_ROW 480
#define INPUT_NUM_COL 640
#define OUTPUT_NUM_ROW 240
#define OUTPUT_NUM_COL 320

unsigned char inputBuf[INPUT_NUM_ROW* INPUT_NUM_COL];
unsigned char outputBuf[OUTPUT_NUM_ROW* OUTPUT_NUM_COL];

void imageDecimate(unsigned char *outputImage , unsigned char *inputImage)
{
/* Fill in your code here */
for (int p = 0; p< OUTPUT_NUM_ROW; p++) {
    for (int q = 0; q < OUTPUT_NUM_COL; q++) {
        outputImage[p*OUTPUT_NUM_COL + q] = inputImage[(p*INPUT_NUM_COL+q)*2];
        // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl;
    }
  }
}
4

1 に答える 1

1

内側のループで毎回計算を行うのではなく、次のようにすることができます。

int outputIndex;
int inputIndex;
for (int p = 0; p< OUTPUT_NUM_ROW; p++) {
    inputIndex = p * INPUT_NUM_COL * 2;
    outputIndex = p * OUTPUT_NUM_COL;
    for (int q = 0; q < OUTPUT_NUM_COL; q++) {
        outputImage[outputIndex] = inputImage[inputIndex];
        inputIndex += 2;
        outputIndex++;
        // cout << "The pixel at " << p*OUTPUT_NUM_COL+q << " is " << outputImage[p*OUTPUT_NUM_COL+q] << endl;
    }
  }
}

コピー割り当てを使用してインクリメント インラインを行うこともできます。また、inputIndex と outputIndex を最初にのみ割り当てることもできますが、計算を内側のループから移動するほどパフォーマンスが向上することはありません。一括コピー機能にはこの種の漸進的な柔軟性がないと思いますが、それらがあり、すべてのターゲット プラットフォームで利用可能なハードウェア アクセラレーションを使用する場合は、それがより良い選択になります。

また、このような配列アクセスは、使用できる最も最適化されたポインター演算にコンパイルされると想定しています。

于 2016-10-21T22:48:47.677 に答える