Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

e-AIで作成したファイルをビルドすると、エラーになる(E0562300:Duplicate symbol "_add_0_pad" in ".\src\Translator\dnn_compute.obj")

RX72Tを用いてe-AIで作成したCNN処理を行いたいです。

「e-AIトランスレータ V1.4.0 ユーザーズマニュアル」に沿って作業を行っております。

マニュアルのP30に記載の通りe-AIで作成されたファイルをインクルードすると、e-AI出力のファイル内で宣言されたシンボルに対してシンボル重複のエラーが出ます

(E0562300:Duplicate symbol "_add_0_pad" in ".\src\Translator\dnn_compute.obj")

 

どこで重複がおきているか調べようとしたのですが、e-AI出力のファイルでは1か所でしか宣言されておらず、当然私が記述した部分のプログラムでも宣言はしておりません。

念のため上記の1か所で宣言されている部分の名称を変更しましたが、変更後の名称で同じエラーが発生します。

恐らくe-AI出力ファイル内での参照関係によって重複宣言が行われていると推察しているのですが、本現象の解決方法をご教授いただけないでしょうか。

 

回答に際して情報等不足ございましたらご指摘ください。

よろしくお願いいたします。

 

【環境】

・windows10

・e2studio

・GCC for Renesas RX ツールチェーン

・Renesas Sterter Kit for RX72T

【該当ファイル】

//File Name    :dnn_compute.c

#include "layer_shapes.h"
#include "layer_graph.h"
#include "weights.h"

TPrecision* dnn_compute(TPrecision* Reshape_0)
{
convolution(Reshape_0,add_0_pad,add_0_weights,add_0_biases,add_0,layer_shapes.add_0_shape);
relu(add_0,layer_shapes.add_0_activ_shape);

pooling(add_0,MaxPool_0_pad,MaxPool_0,layer_shapes.MaxPool_0_shape);
convolution(MaxPool_0,add_1_0_pad,add_1_0_weights,add_1_0_biases,add_1_0,layer_shapes.add_1_0_shape);
relu(add_1_0,layer_shapes.add_1_0_activ_shape);
pooling(add_1_0,Reshape_1_0_pad,Reshape_1_0,layer_shapes.Reshape_1_0_shape);

innerproduct(Reshape_1_0,add_2_0_weights,add_2_0_biases,add_2_0,layer_shapes.add_2_0_shape);
relu(add_2_0,layer_shapes.add_2_0_activ_shape);

innerproduct(add_2_0,MatMul_1_0_weights,MatMul_1_0_biases,MatMul_1_0,layer_shapes.MatMul_1_0_shape);
return(MatMul_1_0);
}

 

//File Name    : layer_shapes.h

#include "Typedef.h"
#ifndef LAYER_SHAPES_H_
#define LAYER_SHAPES_H_

TPrecision* dnn_compute(TPrecision*);

 

//↓これらのシンボルについて全て重複定義のエラーが出ます

TPrecision add_0_pad[680];
TPrecision add_0_m[960];
TPrecision MaxPool_0_pad_m[1920];
TPrecision MaxPool_0_m[480];
TPrecision add_1_0_pad_m[3040];
TPrecision add_1_0_m[960];
TPrecision Reshape_1_0_pad_m[2048];
TPrecision Reshape_1_0_m[512];
TPrecision add_2_0_m[1024];
TPrecision MatMul_1_0_m[10];


struct shapes{
TsInt add_0_shape_m[16];
TsInt add_0_activ_shape_m;
TsInt MaxPool_0_shape_m[15];
TsInt add_1_0_shape_m[16];
TsInt add_1_0_activ_shape_m;
TsInt Reshape_1_0_shape_m[15];
TsInt add_2_0_shape_m[4];
TsInt add_2_0_activ_shape_m;
TsInt MatMul_1_0_shape_m[4];
};

struct shapes layer_shapes ={
{1,4,1,30,32,4,5,5,1,30,2,2,2,2,1,1},
960,
{1,32,1,30,1,15,0,1,0,0,2,2,2,2,0},
{1,32,1,15,64,32,5,5,1,15,2,2,2,2,1,1},
960,
{1,64,1,15,1,8,0,1,0,1,2,2,2,2,0},
{1,512,512,1024},
1024,
{1,1024,1024,10}
};

#endif

  • panpanpandaさん、こんにちは。NoMaYと申します。

    GNURXではなくてCC-RXではありませんか? CC-RXなら、以下で調査出来ると思います。以下は、SHコンパイラ(というかリンカ)のFAQですが、CC-RXでも有効です。試してみてはどうでしょうか。

    FAQ 1010147 : ビルド時に次のエラーが表示されます。回避方法を教えてください。 L2300 (E) Duplicate symbol "シンボル" in "ファイル" "シンボル"は重複しています。
    ja.na4.teamsupport.com/knowledgeBase/17797255

    L2300エラーメッセージをウォーニングレベルに変更すると、当該シンボルを定義した全てのファイルに対してメッセージを表示しますので、修正対象のファイルを確認することができます。


    -change_message=warning=2300

  • #include "Typedef.h"
    #ifndef LAYER_SHAPES_H_
    #define LAYER_SHAPES_H_
    
    TPrecision* dnn_compute(TPrecision*);
    
     
    
    //↓これらのシンボルについて全て重複定義のエラーが出ます
    
    TPrecision add_0_pad[680];
    TPrecision add_0_m[960];
    TPrecision MaxPool_0_pad_m[1920];
    TPrecision MaxPool_0_m[480];
    TPrecision add_1_0_pad_m[3040];
    TPrecision add_1_0_m[960];
    TPrecision Reshape_1_0_pad_m[2048];
    TPrecision Reshape_1_0_m[512];
    TPrecision add_2_0_m[1024];
    TPrecision MatMul_1_0_m[10];
    
    

    ヘッダファイルで C 言語の「仮定義」をされたいのだと思いますが C++ でコンパイルされてませんか。

    C++ でこのヘッダをインクルードすると C 言語の仮定義ではなく通常の「定義」となるので複数ファイルからインクルードしてた場合多重定義となります。

  • In reply to NoMaY:

    NoMaY様アドバイス頂きありがとうございます。

    無知で申し訳ありません。
    GNURXというのはGCC for Renesas RXのことでしょうか。
    残念ながらこちらをしようしております。
    色々試して解決方法が見つからなければCC-RXに変更し、頂いた方法を試してみようと思います。
    ありがとうございます。
  • In reply to fujita nozomu:

    fujita nozomu様

    貴重なお話頂きありがとうございます。
    現状CかC++か理解することなくコンパイルを行っておりました。
    色々と設定を見てみたのですが、どこも「C/C++」と両者が共通かのような表記になっておりました。
    素人質問で恐縮なのですが、「C」のみでコンパイルするにはどのようにすればよいでしょうか。
    FAQ等見ましたが見つけることができず、申し訳ないのですがご教授いただけると有難いです。
    よろしくお願いいたします。
  • In reply to panpanpanda:

    panpanpandaさん、こんにちは。NoMaYです。

    > (E0562300:Duplicate symbol "_add_0_pad" in ".\src\Translator\dnn_compute.obj")

    > GNURXというのはGCC for Renesas RXのことでしょうか。
    > 残念ながらこちらをしようしております。
    > 色々試して解決方法が見つからなければCC-RXに変更し、頂いた方法を試してみようと思います。

    e2 studioでのプロジェクト作成時に使用コンパイラの選択を間違えてしまっていると思いますよ。E0562300というエラーはCC-RXのものですし、.objという拡張子もCC-RXのものですよ。

    それで、念の為、e2 studioのプロジェクトのプロパティのコンパイラ設定の画面コピーを見せて頂けないでしょうか?

  • In reply to NoMaY:

    NoMaY様

    お返事いただきありがとうございます。

    該当の画面はこちらで間違いないでしょうか。

    こちらには確かにNoMaY様おっしゃる通り「ccrx」と記載がございます。最初の選択で間違ったのかもしれません。

     

    最初にNoMaY様よりご提示いただいたエラーレベルを変更する作業はこちらの画面から可能でしょうか。

    重ねての質問で恐縮ですが、よろしくお願いいたします。

  • panpanpandaさん、こんにちは。NoMaYです。

    > ご提示いただいたエラーレベルを変更する作業はこちらの画面から可能でしょうか。

    画面コピー有難う御座いました。やはりCC-RXのプロジェクトでしたね。このままCC-RXで作業されるということでしょうか。それであれば、以下の画面コピーの箇所で変更することが出来ます。

    e2 studioのプロジェクトのプロパティのコンパイラ設定(というかリンカ設定)の画面コピー

     

  • In reply to NoMaY:

    NoMaY様

    エラーレベルの変更方法ご提示いただきありがとうございました。
    変更後、main.cで重複定義していることがわかりましたので、mainでのインクルードを削除して対応しました。
    初歩的な内容でお恥ずかしいです。

    また、上記解決後も別のエラーメッセージが出現しました。
    タイトルと別内容となってしまい大変恐縮なのですが、こちらについてももし可能であればご意見いただけないでしょうか。

    重複定義解決後以下のようなエラーが出ました。
    F0563100:Section address overflow out of range : "C"
    こちらメモリサイズ不足のエラーかと思い、FAQを調べると、メモリの割り当てを変更する解決方法が載っておりました。
    ただ、調べましても今一つ具体的な方法が分からず、もし可能でしたら変更方法をご教授いただけないでしょうか。

    また、mapファイルを確認すると以下のようになっておりました。
    このような場合、メモリの割り当てのみで解決は可能なのでしょうか。
    それとも大本のプログラム記述を削減する必要があるでしょうか。

    タイトルと異なる質問となり大変恐縮なのですが、ご教授いただければ非常にありがたいです。

    どうかよろしくお願いいたします。

    mapファイルを確認すると以下のようになっておりました。
    *** Error information ***

    F0563100:Section address overflow out of range : "C"

    *** Mapping List ***

    SECTION START END SIZE ALIGN
    SU
    00000004 00001003 1000 4
    SI
    00001004 00001403 400 4
    B_1
    00001404 000014af ac 1
    R_1
    000014b0 0000151e 6f 1
    B_2
    00001520 0000152f 10 2
    R_2
    00001530 00001535 6 2
    B
    00001538 0000d1e7 bcb0 4
    R
    0000d1e8 0000d56f 388 4
    $ADDR_C_120040
    00120040 00120043 4 1
    $ADDR_C_120048
    00120048 0012004b 4 1
    $ADDR_C_120050
    00120050 0012006f 20 1
    $ADDR_C_12007C
    0012007c 0012007f 4 1
    C_1
    fff00000 fff0030b 30c 1
    C_2
    fff0030c fff00513 208 2
    C
    fff00514 **OVER** 240450 4
    C$DSEC
    **OVER** **OVER** 24 4
    C$BSEC
    **OVER** **OVER** 18 4
    C$VECT
    **OVER** **OVER** 400 4
    D
    **OVER** **OVER** 388 4
    D_1
    **OVER** **OVER** 6f 1
    D_2
    **OVER** **OVER** 6 2
    W
    **OVER** **OVER** 0 1
    W_1
    **OVER** **OVER** 0 1
    W_2
    **OVER** **OVER** 0 1
    L
    **OVER** **OVER** e1 4
    P
    **OVER** **OVER** 5688 1
    EXCEPTVECT
    ffffff80 fffffffb 7c 4
    RESETVECT
    fffffffc ffffffff 4 4
  • panpanpandaさん、こんにちは。NoMaYです。

    > C_1
    > fff00000 fff0030b 30c 1
    > C_2
    > fff0030c fff00513 208 2
    > C
    > fff00514 **OVER** 240450 4

    どうも、32bit幅const変数を格納する領域が 0x240450 = 2360400 ≒ 2.3M バイト必要なようです。RX72Tは最大1MB ROMとなっていましたので、外付けROMが必要かと思われます。(外付けROMで充分な性能が出るかどうか別問題として。) 敢えて、内蔵フラッシュROM領域の先頭番地を 0xffc00000 に変更するような設定をすればリンクは出来るようになると思われますが、評価期限過ぎの無償評価版CC-RXではサイズ制限を越えてしまってリンクは出来ないです。(たしかconstも含んだと思います。)

    現状では何にせよRX72Tの内蔵フラッシュROMには収まりませんが、CC-RXとGNURXでは内蔵フラッシュROM領域の先頭番地を敢えて変更するような設定のやり方が異なります。まだ、当面、CC-RXで作業を進められますか?もしくは、無償評価版CC-RXのサイズ制限を鑑みて、この段階で、当初の目論み通りGNURXを使うように方向転換されますか?

  • In reply to NoMaY:

    NoMaY様

    再度詳しくご提案いただき誠にありがとうございます。
    現状ではROMに収まらないことを承知いたしました。

    今回の検証の目的が「内蔵ROMに収まるか」「実行速度はどの程度か」であったため、
    使用領域の大きいconstを削減して再度トライしてみようと思います。
    今回のファイルではCNNを利用しており、e-AIチェッカーではFullconect時に2.1MBになっていた為、
    この部分を削減してみます。(半分以下にしつつ精度を維持するのは骨が折れそうですが)

    CC-RXで当面進めてみようと考えておりますが、サイズ制限の影響が心配です。
    ROMやRAMの容量はハード依存かと思うのですが、CC-RXの容量制限とは具体的に何を指すのでしょうか。

    重ねての質問で恐縮ですが、よろしくお願いいたします。
  • In reply to panpanpanda:

    panpanpandaさん、こんにちは。NoMaYです。

    > CC-RXで当面進めてみようと考えておりますが、サイズ制限の影響が心配です。
    > ROMやRAMの容量はハード依存かと思うのですが、CC-RXの容量制限とは具体的に何を指すのでしょうか。

    すみません、「CC-RXの容量制限とは具体的に何を指すのでしょうか」なのですが、私のリプライの以下の文面のことでしょうか?私のリプライ?のどこを指しているか分かりませんでしたので、、、

    敢えて、内蔵フラッシュROM領域の先頭番地を 0xffc00000 に変更するような設定をすればリンクは出来るようになると思われますが、


    [追記]

    もしかして、私のリプライの以下の「サイズ制限」のことでしょうか?

    評価期限過ぎの無償評価版CC-RXではサイズ制限を越えてしまってリンクは出来ないです。(たしかconstも含んだと思います。)


  • In reply to NoMaY:

    NoMaY様

    言葉足らずで申し訳ありません。
    「追記」の部分のつもりで質問しておりました。
    ですが、改めて文面を見直すと、サイズ制限はあくまでリンクについてのものなのですね。

    そうなると「リンク」自体の意味についてご教授いただきたいのですが、
    ハード側の容量が足らないにも関わらず「リンク」ができるとはどのような状態なのでしょうか。
    (外部ハードを使用することを前提にビルドのみ行えるということでしょうか)

    その場合、サイズ制限によって「リンク」ができなるなるとはどのような状態なのでしょうか。
    (サイズ制限により外部ハードを使用するコンパイルが実施できなくなるということでしょうか)

    初歩的な質問で大変恐縮ですが、ご教授いただけると大変ありがたいです。

    以上よろしくお願いいたします。
  • In reply to panpanpanda:

    panpanpandaさん、こんにちは。NoMaYです。

    私が書いた「サイズ制限」というのは無償評価版CC-RXの以下の制限のことです。この制限は御存知なかったでしょうか?61日目以降にリンクサイズが128Kバイトを超えるプログラムをリンクしようとしますと、リンカが「評価版のサイズ制限を越えていますよ(ただし英文ですが)」といったエラーを表示するようになることです。

    評価期限過ぎの無償評価版CC-RXではサイズ制限を越えてしまってリンクは出来ないです。(たしかconstも含んだと思います。)


    評価版ソフトウェアツール ダウンロードページ
    www.renesas.com/jp/ja/products/software-tools/evaluation-software-tools.html

    統合開発環境 e² studio

    試用期限
    e² studioは期限はありませんが、コンパイラに関しては、 下記RL78用、RXコンパイラパッケージ(統合開発環境なし) をご覧ください。

    仕様・性能
    [RXファミリ]
        リンクサイズを128Kバイト以内に制限しています。 professional版の機能は使用できません。」(注:試用期限を過ぎた後の話しです。)


    コンパイラ/アセンブラパッケージ

    RXファミリ用 C/C++コンパイラパッケージ
    (統合開発環境なし)

    試用期限
    60日
    初めて評価版ソフトウェアツールをインストールした後、最初にビルドを行った日から60日 。

    仕様・性能
    試用期限内は製品版と同じ。
    試用期限を過ぎるとリンクサイズが128Kバイト以内に制限されprofessional版の機能が使用できなくなります 。

  • In reply to NoMaY:

    NoMaY様

    詳しくご教授いただきありがとうございます。
    試用期限がすぎるとハード側のROM容量(=RT72Tだと1MB)に関わらず、書き込めるサイズ(=リンクサイズ)が128KBに制限されるということですね。
    試用期限がまだ1か月半残っているので、一先ずはこの環境で進めてみようと思います。


    重ねてで大変恐縮なのですが、またROM領域の理解についてまた疑問点が出てきましたのでご教授いただけないでしょうか。

    NoMaY様にROM領域エラーのご助言をいただき、const変数領域を削減するためCNNのFC部分を減らしてネットワークを修正しました。(前:512→1024→10 後:512→128→10)
    上記の結果、e-AIのchecker_log_output上ではTOTALのROMサイズが2.8MBから486KBに削減ができました。

    しかし、このファイルを用いて実際にビルドを行うとまた「F0563100:Section address overflow out of range : "C"」のエラーが出現しました。
    mapファイルを確認すると、以下のようになっており前回のファイルよりも使用量が増加しているように見えます。
    今回
    C
    fff00514  **OVER**   2b6df8   4
    前回
    C
    fff00514  **OVER**   240450  4


    恐らく私がどこかで理解を間違えていると思うのですが、どこの理解が至っていないのでしょうか。
    現状の理解は、
    「エラーの原因はconst変数が多くROM領域が足りないこと」→
    「const変数を減らすにはCNNのネットワークを削減すればよい」→
    「const変数の量=e-AIのchecker_log_output上のTOTAL ROMサイズ」→
    「上記がハード容量(=1MB)より小さければ今回のエラーは起こらない」
    です。

    また上記の理解ですので、
    「ROM領域の使用はネットワークの削減で大きく下がっているはず」→
    「ROM領域の使用状況=ビルド後のmapファイルで確認可能」→
    「map上でROMの使用領域が増えたことになっている」
    がなぜ起こるのか混乱している状態です。

    お忙しいところ何度も質問してしまい申し訳ありません。

    ご教授いただけると幸いです。

    よろしくお願いいたします。
  • In reply to panpanpanda:

    panpanpandaさん、こんにちは。NoMaYです。

    これは奇妙ですね。宜しければmapファイルをzipファイルに固めて添付して頂くことは出来ますか?(mapファイル内をざっとみて企業秘密に関わる部分(恐らくファイル名とかフォルダ名とか)があれば削除しておいて下さい。)

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page