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 の内外で非常に大きなオーバーヘッドの切り替えが予想されることを示唆するものをまだ読んでいません。