1

mpeg4dst リファレンス オーディオ エンコーダーを最適化することで、OpenCL を独学しています。CPU でベクトル命令を使用して 3 倍のスピードアップを達成しましたが、おそらく GPU の方が効率がよいと考えました。

最初の改善領域として、OpenCL での自己相関ベクトルの計算に焦点を当てています。CPUコードは次のとおりです。

for (int i = 0; i < NrOfChannels; i++) {
    for (int shift = 0; shift <= PredOrder[ChannelFilter[i]]; shift++)
        vDSP_dotpr(Signal[i] + shift, 1, Signal[i], 1, &out, NrOfChannelBits - shift);
}
NrOfChannels = 6
PredOrder = 129
NrOfChannelBits = 150528.

私のテスト ファイルでは、この関数が完了するまでに約 188 ミリ秒かかりました。

これが私のOpenCLメソッドです:

kernel void calculateAutocorrelation(size_t offset,
                                 global const float *input,
                                 global float *output,
                                 size_t size) {
size_t index = get_global_id(0);
size_t end = size - index;
float sum = 0.0;

for (size_t i = 0; i < end; i++)
    sum += input[i + offset] * input[i + offset + index];

output[index] = sum;
}

これは、次のように呼ばれます。

gcl_memcpy(gpu_signal_in, Signal, sizeof(float) * NrOfChannels * MAXCHBITS);

for (int i = 0; i < NrOfChannels; i++) {
    size_t sz = PredOrder[ChannelFilter[i]] + 1;
    cl_ndrange range = { 1, { 0, 0, 0 }, { sz, 0, 0}, { 0, 0, 0 } };

    calculateAutocorrelation_kernel(&range, i * MAXCHBITS, (cl_float *)gpu_signal_in, (cl_float *)gpu_out, NrOfChannelBits);
    gcl_memcpy(out, gpu_out, sizeof(float) * sz);
}

Instruments によると、私の OpenCL 実装には約 13 ミリ秒かかり、約 54 ミリ秒のメモリ コピー オーバーヘッド (gcl_memcpy) がかかるようです。

はるかに大きなテスト ファイルを使用すると、1 分間の 2 チャネルの音楽 vs. 1 秒間の 6 チャネルの音楽で、OpenCL コードの測定されたパフォーマンスは同じように見えますが、CPU 使用率は約 50% に低下し、全体がプログラムの実行には約 2 倍の時間がかかります。

Instruments でこの原因を見つけることができず、OpenCL の内外で非常に大きなオーバーヘッドの切り替えが予想されることを示唆するものをまだ読んでいません。

4

1 に答える 1

2

カーネルコードを正しく読んでいれば、各作業項目はその場所から最後まですべてのデータを繰り返し処理しています。これでは効率が上がりません。1 つ (および主要なパフォーマンスの問題) としては、メモリ アクセスが結合されないため、メモリ帯域幅がフルに使用されません。第 2 に、各作業項目には異なる量の作業があるため、作業グループ内で分岐分岐が発生し、一部のスレッドが他のスレッドを待機してアイドル状態になります。

これは、リダクションの問題と多くの共通点があるようです。このような操作を並行して実行するためのヒントを得るために、「並列リダクション」を読むことをお勧めします。

メモリがどのように読み取られているかを確認するには、16 個の作業項目 (たとえば、global_id 0 から 15) が各ステップでデータを読み取る方法を計算します。

ワークグループ内のすべてのワークアイテムが同じメモリにアクセスする場合、ハードウェアが実行できる「ブロードキャスト」最適化があることに注意してください。したがって、ループの順序を逆にするだけで状況が改善される可能性があります。

于 2013-11-25T04:07:50.767 に答える