ダイナミック メモリの使用 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

システム内のメモリ割り当てを管理するシステム コール、たとえば malloc()alloc()、および free() は、OS のメモリにあるリソースを使用し、ランタイム中に作成およびリリースされます。ハードウェア インプリメンテーションを合成できるようにするには、デザインに必要なリソースがすべて指定され、含まれている必要があります。

メモリ割り当てのシステム コールは、合成前にデザインから削除する必要がありますが、ダイナミック メモリ操作がデザインの機能を定義するために使用されているので、同等の範囲が制限された表現に変換する必要があります。次に、malloc() を使用するデザインを合成可能なバージョンに変換するコード例を示します。次の 2 つの便利なコーディング スタイル手法が含まれます。

  • このデザインでは __SYNTHESIS__ マクロは使用しません。

    合成可能なバージョンまたは合成不可能なバージョンの選択には、ユーザー定義の NO_SYNTH マクロを使用します。これにより、同じコードが C/C++ でシミュレーションされ、Vitis HLS で合成されます。

  • malloc() を使用する元のデザインのポインターは、固定サイズのエレメント用に書き直す必要はありません。

    固定サイズのリソースは作成でき、既存ポインターは単に固定サイズのリソースを指定するようにできます。この方法により、既存デザインを手動で書き直す必要はなくなります。


#include "malloc_removed.h"
#include <stdlib.h>
//#define NO_SYNTH

dout_t malloc_removed(din_t din[N], dsel_t width) {  

#ifdef NO_SYNTH
 long long *out_accum = malloc (sizeof(long long));
 int* array_local = malloc (64 * sizeof(int));
#else
 long long _out_accum;
 long long *out_accum = &_out_accum;
 int _array_local[64];
 int* array_local = &_array_local[0];
#endif
 int i,j;
  
 LOOP_SHIFT:for (i=0;i<N-1; i++) {
 if (i<width) 
 *(array_local+i)=din[i];
 else 
 *(array_local[i])=din[i]>>2;
 }

 *out_accum=0;
 LOOP_ACCUM:for (j=0;j<N-1; j++) {
 *out_accum += *(array_local+j);
 }

 return *out_accum;
}

コード変更はデザインの機能に影響するので、AMDでは __SYNTHESIS__ マクロの使用はお勧めしません。AMDでは、次の手順を推奨しています。

  1. ユーザー定義のマクロ NO_SYNTH をコードに追加して、コードを修正します。
  2. NO_SYNTH マクロをイネーブルにし、C/C++ シミュレーションを実行して結果を保存します。
  3. NO_SYNTH マクロをディスエーブルにし、C/C++ シミュレーションを実行して結果が同じになるかどうかを検証します。
  4. このユーザー定義のマクロをディスエーブルにして合成を実行します。

この方法を使用すると、アップデートされたコードが C/C++ シミュレーションで検証され、同じコードが合成されるようにできます。C/C++ でのダイナミック メモリ使用に関する制限と同様、Vitis HLS では、ダイナミックに作成/削除される C/C++ オブジェクトも合成でサポートされません。