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です。> 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を使うように方向転換されますか?
panpanpandaさん、こんにちは。NoMaYです。> CC-RXで当面進めてみようと考えておりますが、サイズ制限の影響が心配です。> ROMやRAMの容量はハード依存かと思うのですが、CC-RXの容量制限とは具体的に何を指すのでしょうか。すみません、「CC-RXの容量制限とは具体的に何を指すのでしょうか」なのですが、私のリプライの以下の文面のことでしょうか?私のリプライ?のどこを指しているか分かりませんでしたので、、、「敢えて、内蔵フラッシュROM領域の先頭番地を 0xffc00000 に変更するような設定をすればリンクは出来るようになると思われますが、」[追記]もしかして、私のリプライの以下の「サイズ制限」のことでしょうか?「評価期限過ぎの無償評価版CC-RXではサイズ制限を越えてしまってリンクは出来ないです。(たしかconstも含んだと思います。)」
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版の機能が使用できなくなります 。」
panpanpandaさん、こんにちは。NoMaYです。これは奇妙ですね。宜しければmapファイルをzipファイルに固めて添付して頂くことは出来ますか?(mapファイル内をざっとみて企業秘密に関わる部分(恐らくファイル名とかフォルダ名とか)があれば削除しておいて下さい。)
map.zip
NoMaY様
ご提案いただきありがとうございます。
mapファイル添付させていただきます。
ご確認お願いいたします。
panpanpandaさん、こんにちは。NoMaYです。mapファイルを有難う御座いました。見て思ったのですが、src/oldの下に何か修正前ソースをバックアップされているようですが、e2 studio(というかEclipse)ではそのやり方はNGです。そのようなことをしますと、src/oldの下に新規ソースが追加されたのだと判断されてしまい、自動的にsrc/oldの下のソースがプロジェクトに追加されてしまいます。(ただ、そういうことを自動的にやってくれるところがe2 studio(というかEclipse)の有難いところではありますが。) もし私の推測の通りにsrc/oldの下のソースがバックアップのソースでしたら、それを削除してみて頂けますか? mapファイ内には以下のように出力されていて、バックアップのソースだと思うのですが。
*** Options ***-subcommand=LinkerTutorial.tmp-noprelink-input=".\src/Translator\dnn_compute.obj"-input=".\src/Translator\network.obj"-input=".\src\ascii.obj"-input=".\src\main.obj"-input=".\src/old\dnn_compute.obj"-input=".\src/old\network.obj"。。。以後省略。。。
*** Error information ***W0562300:Duplicate symbol "_innerproduct" in ".\src\Translator\network.obj"W0562300:Duplicate symbol "_innerproduct" in ".\src\old\network.obj"W0562300:Duplicate symbol "_pooling" in ".\src\Translator\network.obj"W0562300:Duplicate symbol "_pooling" in ".\src\old\network.obj"W0562300:Duplicate symbol "_layer_shapes" in ".\src\Translator\dnn_compute.obj"W0562300:Duplicate symbol "_layer_shapes" in ".\src\old\dnn_compute.obj"W0562300:Duplicate symbol "_padding" in ".\src\Translator\network.obj"W0562300:Duplicate symbol "_padding" in ".\src\old\network.obj"W0562300:Duplicate symbol "_average_pooling" in ".\src\Translator\network.obj"W0562300:Duplicate symbol "_average_pooling" in ".\src\old\network.obj"W0562300:Duplicate symbol "_convolution" in ".\src\Translator\network.obj"W0562300:Duplicate symbol "_convolution" in ".\src\old\network.obj"W0562300:Duplicate symbol "_relu" in ".\src\Translator\network.obj"W0562300:Duplicate symbol "_relu" in ".\src\old\network.obj"W0562300:Duplicate symbol "_max_pooling" in ".\src\Translator\network.obj"W0562300:Duplicate symbol "_max_pooling" in ".\src\old\network.obj"F0563100:Section address overflow out of range : "C"
それでもまだ今回のエラーが解消されないようであれば、すみませんが、以下のオプションを付けてビルドして、再度、mapファイルをzipファイルに固めて添付して頂けますか。e2 studioのプロジェクトのプロパティのコンパイラ設定(というかリンカ設定)の画面コピー
NoMay様
大変丁寧にご教授いただきありがとうございます。無事ビルドが通り、マイコンに書き込むことができました。(別ファイルまで確認してくれるのですね。なんて親切なんでしょう。今後は気を付けようと思います)
さらに追加の質問で大変申し訳ありません。最後にもう一度ご教授いただけないでしょうか。現在書き込んだファイルを実行し、深層学習部分の実行速度を計測しています。処理にはブレークポイントのタイマーを使用しているのですが、計測結果がどこに出てくるのか調べても分かりませんでした。
現在添付ファイルのような状況なのですが、どのようにすれば計測結果を表示することができるのかご教授いただけないでしょうか。
こちらも初歩的な質問で大変お恥ずかしく、恐縮なのですが、よろしくお願いいたします。
//以下の「data_convert_list2format」「dnn_compute」の2つの処理時間を計測したいです
panpanpandaさん、こんにちは。NoMaYです。諸般の事情で私のPCでオンチップデバッグエミュレータが使えなくてFAQの引用になりますが、以下のFAQのやり方ではどうでしょうか。オンチップデバッガ機能概要のドキュメントによるとRenesas Starter Kit for RX72Tに同梱されているE2 Liteで出来るかと思います。FAQ 1011210 : 二点間の実行時間を測定する方法はありますか? (適用製品 e2 studio)ja.na4.teamsupport.com/knowledgeBase/17797680オンチップデバッガ機能概要www.renesas.com/jp/ja/search/keyword-search.html#genre=document&q=r20ut0616r20ut0616jj0926-ocd-debug.pdf