2012-01-13 5 views
1

FPGAやASIC用の汎用画像処理コアを開発しています。標準的なプロセッサーとインターフェースすることが考えられます。私が持っている問題の1つは、それを「プログラムする」方法です。私に説明してみましょう:コアには、私の "カスタム"拡張のための命令デコーダがあります。たとえば:標準のC/C++コードでカスタム命令/拡張機能を組み込んで翻訳する方法

vector_addition $vector[0], $vector[1], $vector[2] // (i.e. v2 = v0+v1) 

などです。この操作は、そのようなループは、非ベクトル演算など、ためにプロセッサを使用して、コアにバスを介してプロセッサによってsendedではれる:

for (i=0; i<15;i++)   // to be executed in the processor 
    vector_add(v0, v1, v2) // to be executed in my custom core 

プログラムがC/C++で書かれています。コアは、マシンコードに、命令自体を必要

  1. オペコード= vector_add = 0x12h
  2. register_src_1 = V0 = 0x00h
  3. register_src_2 = V1 = 0x01h
  4. register_dst = V2 = 0x02h

    マシンコード= opcore | v0 | v1 | V2 = 0x7606E600h

(または任意、バイナリ命令を構築するために、異なるフィールドのちょうどcontatenation)

一度コアにバスを介してそれを送信する、コアからすべてのデータを要求することができます専用バスでメモリを使用し、プロセッサを使用せずにすべてを処理します。大きな成功は:どのようにして前の命令を16進表現に変換できますか?(バスは問題ありません)。心に来ていくつかのオプションが

  • ランは、(プロセッサで実行時にマシンコードに変換)コードを解釈している - > 非常に遅い、でも、インラインのいくつかの種類を使用してマクロ
  • でカスタムセクションをコンパイルします外部のカスタムコンパイラ、外部メモリからバイナリをロードし、いくつかのユニークな命令でコアに移動 - >ソースコードの読み込み/理解が難しい、SDKの統合不良、コードが非常に分割されているとセクションが多すぎる
  • JITコンパイル - - >これだけのために複雑にする?
  • コンパイラの拡張 - >悪夢!
  • すべてを処理するためのカスタムコアに接続されたカスタムプロセッサ:ループ、ポインタ、メモリの割り当て、変数... - >あまりにも多くの仕事

問題は、ソフトウェア/コンパイラについてですが、その人のためこのトピックでは深い知識を持っていますが、これはFPGAのSoCで、メインプロセッサはMicroBlazeで、IPコアはAXI4バスを採用しています。

私はそれを正しく説明してくれたと思います...事前に感謝!

+0

多分、私はcuestionを短くする必要があります...私は使用しているコンパイラの[コード生成](http://en.wikipedia.org/wiki/Code_generation_%28compiler%29)ステージに新しい命令を追加する方法(gcc/g ++) – amnl

答えて

0

プログラム開始時にコードのすべてのセクションを機械コードに変換してはいけません。メモリブロック単位でバイナリ形式で保存し、必要に応じて使用します。

これは基本的にOpenGLシェーダがどのように機能するのか、私はそれを非常に簡単に管理することができます。

主な欠点は、同じスクリプトのテキストとバイナリ表現の両方をメモリに持っているため、メモリ消費量です。これがあなたにとって問題であるかどうかはわかりません。そうであれば、ソーステキストをコンパイルした後にアンロードするという部分的な解決策があります。

+0

ええ、それはいいアイデアです、ありがとう!私は似たようなことを考えていた。すべてのコードがプログラムの同じ部分になければならないので、統合が非常に悪いという問題は、実際には、すべてのプログラムに沿って分散されています。 SSEの指示を考えると、まさに同じ問題です。 – amnl

+0

何らかの形でシングルトンの "スクリプトファクトリ"を作成し、名前などでソースを識別することができます。または最初に使用するときに登録します。それに基づいて統合を改善する方法はたくさんあります。 – rodrigo

+0

私は、コードの途中、ループの途中、if-elseなど、それらの多くに疎な命令を持っています。 「プリコンパイル」の問題は、これらの関数の引数がプロセッサで計算され、命令内で転送されることです。引数が実行時に値を変更した場合(つまりループのインデックス)、それは機能しません。 vector_add(v0、v1、#constant) – amnl

1

私は完全に理解しているかどうかはわかりませんが、私はこれまでと同じようなことに直面していたと思います。 Rodrigoの回答に対するコメントに基づいて、あなたのコードに散在する小さな指示書があるように思えます。あなたはまた、外部コンパイラが可能であることに言及して、ただの痛みです。外部コンパイラをCマクロと組み合わせると、まともなものが得られます。 CORE_EXECマクロは2つの目的があります

for (i=0; i<15;i++) 
    CORE_EXEC(vector_add(v0, v1, v2), ref1) 

は、このコードを考えてみましょう

  1. あなたはこれらのエントリのためのソースファイルをスキャンし、コアコードをコンパイルするために外部ツールを使用することができます。このコードは "ref1"という名前を変数としてCにリンクされます(バイナリビットのCファイルを生成します)。
  2. Cでは、処理のために "ref1"文字列をコアに渡すCORE_EXECマクロを定義します。

したがって、上記のこのような文字列かもしれません例えば、コンパイルされたバイナリコア命令のファイルを生成しますステージ1:

const char * const cx_ref1[] = { 0x12, 0x00, 0x01, 0x02 }; 

をそして、あなたはこのようCORE_EXECを定義できます

#define CORE_EXEC(code, name) send_core_exec(cx_##name) 

もちろん、プレフィックスを自由に選択することはできますが、C++では代わりに名前空間を使用することもできます。

ツールチェーンに関しては、すべてのビットに対して1つのファイルを作成したり、C++ファイルごとに1つのファイルを作成したりすることができます。次に、生成されたファイルをソースコードに含めるだけです。

+0

私は考えが好きです。 「外部コンパイラ」は、単に質問票の例で示したように、命令の各フィールドを連結した、機械翻訳者へのアセンブラにすぎません。しかし、私が@rodrigoに返答したとき、実行時にいくつかのパラメータが計算されます。この「特別な」ケースにどう対処することができますか? – amnl

+0

パラメータの複雑さによって異なります。このアプローチを変更して、参照、関数名、およびパラメータを取る__VA_ARGS__マクロを作成することができます。固定ストリングの代わりに、特定のパラメーターをバイト相当物にすばやくマップするインライン関数を使用できます。あるいは、コードごとに一意のマクロを生成し、 'CORE_EXEC_REF1'のように完全なマクロを生成することもできます。 –

0

私はいくつかのカスタム命令を追加するためにアームコアを変更しようとしていましたが、実行したい操作はコンパイル時に知られていました(実行時に1秒間に取得されます)。

私は、たとえば、アセンブリを使用します。

.globl vecabc 
vecabc: 
    .word 0x7606E600 ;@ special instruction 
    bx lr 

または任意のインライン構文を使用してインライン化しますが、Cコンパイラが中に埋めどこ例えばプロセッサレジスタを使用する必要がある場合はそれが難しくなり、あなたのコンパイラのためでありますインラインアセンブリ言語のレジスタは、アセンブラによってそれらの命令をアセンブルします。私は実際のasmを書くだけで、上記のように命令ストリームに単語を挿入するだけで、コンパイラだけがデータとしていくつかのバイトをdistingし、命令としていくつかのバイトを、コアは書かれた順序でそれらを見ます。

自己修正コードを使用できるリアルタイムな処理が必要な場合は、再びasm to trampolineを使用します。その後、トランポリンはそれを呼び出すしているあなたは、ラムのどこかで実行する命令は、アドレス0x20000000で言うのビルド:

.globl tramp 
tramp: 
    bx r0 ;@ assuming you encoded a return in your instructions 

は、上記の他のパス関連する1つは、アセンブラを修正することである

tramp(0x20000000); 

でそれを呼び出します新しい命令を追加するには、その命令の構文を作成します。その後、まっすぐなアセンブリ言語やインラインアセンブリ言語を自由に使用することができます。コンパイラを変更せずにコンパイラを使用することはできません。これは、アセンブラが変更された後の別のパスです。

+0

mmm ...それについて考えると、asmを見直して、私はそれをキャッチしたかどうかはわかりません。ありがとう;) – amnl

関連する問題