OMAP3430 のビデオ コーデックに取り組んでいます。私はすでに C++ で記述されたコードを持っており、DSP (私が持っている SDK (OMAP ZOOM3430 SDK) には追加の DSP があります) を利用するために、その特定の部分を変更/移植しようとしています。
非常に少量のデータ (〜 250 バイト) で実行されている小さな for ループを移植しようとしましたが、異なるデータでは約 2M 回です。しかし、CPU と DSP 間の通信による過負荷は、ゲインよりもはるかに大きい (もしあれば)。
このタスクは、通常のコンピューターで GPU のコードを最適化するのとよく似ていると思います。私の質問は、どのような部品を移植すると有益でしょうか? GPU プログラマーはそのようなタスクをどのように処理するのでしょうか?
編集:
- GPP アプリケーションは、サイズ 0x1000 バイトのバッファーを割り当てます。
- GPP アプリケーションは、DSPProcessor_ReserveMemory を呼び出して、自動ページ アライメントを考慮して、割り当てられたバッファーよりも 4K 大きいサイズを使用して、割り当てられたバッファーごとに DSP 仮想アドレス空間を予約します。合計予約サイズも、4K ページ境界に沿って配置する必要があります。
- GPP アプリケーションは、DSPProcessor_Map を呼び出して、割り当てられた各バッファーを、前の手順で予約された DSP 仮想アドレス空間にマップします。
- GPP アプリケーションは、GPP 上に割り当てられたバッファにマッピングされた仮想アドレス空間のベース アドレスを DSP 実行フェーズに通知するメッセージを作成します。GPP アプリケーションは、DSPNode_PutMessage を使用してメッセージを DSP に送信します。
- GPP は memcpy を呼び出して、処理対象のデータを共有メモリにコピーします。
- GPP アプリケーションは DSPProcessor_FlushMemory を呼び出して、データ キャッシュがフラッシュされたことを確認します。
- GPP アプリケーションは、バッファへの書き込みが完了し、DSP がバッファにアクセスできるようになったことを DSP 実行フェーズに通知するメッセージを準備します。メッセージには、バッファに書き込まれたデータの量も含まれているため、DSP はコピーするデータの量を把握できます。GPP は、DSPNode_PutMessage を使用してメッセージを DSP に送信し、DSPNode_GetMessage を呼び出して、DSP からメッセージが返されるのを待ちます。
その後、DSP プログラムの実行が開始され、DSP は処理が終了するとメッセージで GPP に通知します。試しに、DSP プログラム内には何も処理を入れていません。「処理が完了しました」というメッセージを GPP に送り返すだけです。そして、これにはまだ多くの時間がかかります。内部/外部メモリの使用が原因でしょうか、それとも単に通信の過負荷が原因でしょうか?