アナログ電子回路技術者同士の交流のためのアナログ・デバイセズ提供の掲示板サイトです。
日々の回路設計活動での課題や疑問とそれらの解決、あるいはご意見やご提案などの投稿を是非お寄せください!
  トップページに戻る
 現在の総記事数
 Translation
スタッフ
 

閲覧数の多い投稿

* ランキング情報は約24時間おきに更新されます。
ポイント数が高い投稿

* ランキング情報は約24時間おきに更新されます。

アナログ電子回路コミュニティサービス終了のお知らせ

平素はアナログ電子回路コミュニティをご愛顧いただき誠にありがとうございます。

この度、アナログ電子回路コミュニティは2018年3月末日をもってサービスを終了することとなりました。それに伴いまして、本サービスへの新規会員登録は2月末日をもって締切りといたします。約10年という大変長い間、たくさんの皆様にコミュニティをご利用いただきましたこと、深く感謝申し上げます。

なお、コミュニティに掲載しているコンテンツは編集の上、アナログ・デバイセズ社のウェブサイトに随時掲載していく予定です。詳細は追って会員の皆様にお知らせいたします。

今後ともEDN Japanをご愛顧くださいますようお願い申し上げます。


アナログ電子回路コミュニティ運営事務局
* LTC製品に関するご注意
申し訳ございませんが、現時点ではリニアテクノロジー社製品についてのお問い合わせは、リニアテクノロジー社の 技術サポートページ からお問い合わせください。

スレッド一覧に戻る

gyao
タイトル
ツールVisualDSP++で不要NOPが挿入される問題
ポイント []
pt.
アクセス3288
カテゴリーDSP
キーワード VC-VA   アドレッシング   P4   R0   okR7   Powered by Yahoo
投稿日時13/01/31 13:50
BlackfinDSPを使用した開発を行っております。
ツールVisualDSP++のアセンブラ(リンカーの方?)に
[Preg+offset]によるアドレッシングのload,store命令時に
不要なNOP命令が挿入されます。
命令自身は正しくマシンコードに変換されていますが、
その直後に不要なNOP命令が挿入されます。
逆アセンブルのリストを見ることにより、この問題に気付きました。

また、その症状は.ALIGNに関係しています。
本来.ALIGNは直後の命令、変数の配置位置にのみ影響を与えますが、
.ALIGN mがあるとリスト的に次の.ALIGNが現れるまでmの値が影響します。
(m/2-1)ヶのNOP命令が挿入されます。m=2ならNOPの挿入は起きません。
影響といっても本来のALIGN機能ではなく想定外の働きの範疇のようです。

この問題は、メーカーさんも把握しておられるのでしょうか?
あるいは何か私が勘違いをしているところがあるのでしょうか?

//-----------------------------------------------------------------
//[Preg+offset]によるアドレッシング時に不要なNOP命令が挿入される例

.SECTION data1;
.ALIGN 4 ;

.BYTE4 VA[1] ;
.BYTE4 VB[255] ;
.BYTE4 VC[1] ;

.SECTION program;
.GLOBAL _main ;
_main:

ERR_SMPL:
.ALIGN 8 ;
P4.L = Lo(VA) ;
P4.H = Hi(VA) ;
R0 = [ P4 + 0x400 ] ;//シンボル計算でなく直接数値ならok
R7=0;
R0 = [ P4 + VB-VA ] ;//16bit命令に収まる範囲のオフセットならok
R7=1;
R0 =B[ P4 + VC-VA ] ;//byteアクセスならok
R7=2;

R0 =W[ P4 + VC-VA ] ;//2byteアクセスでは3*NOP挿入
R7=3;
R0 = [ P4 + VC-VA ] ;//4byteアクセスでも3*NOP挿入
R7=4;

//.ALIGNと症状の関連を調べる
.ALIGN 2 ;
R7=5;
R0 = [ P4 + VC-VA ] ;//"ALIGN 2"出現の後はokになる
R7=6;

.ALIGN 4 ;
R7=7;
R0 = [ P4 + VC-VA ] ;//"ALIGN 4"出現の後は1*NOP挿入になる
R7=8;

.ALIGN 16 ;
R7=9;
R0 = [ P4 + VC-VA ] ;//"ALIGN 16"出現の後は7*NOPになる
R7=10;


ERR_SMPL.END:

コメントする     


gyao 回答番号 4
タイトル
やはり、そうですか。
ポイント
pt.
アクセス2982
投稿日時13/07/01 14:12
BigBandBeatさん回答有難うございます。

やはり問題がありアップデートで告知するという事ですね。
回避方法も分かっていましたので重大問題という位置付けではなかったのですが、逆に重大問題を引き起こさないがために気付かず、本来の性能から劣化した状態をこのBLACK_FIN_DSPの性能と認識しているようなケースがあればメーカーさんもユーザーさんも、そして回りまわって私も不幸だろうと思い、ただ、英語が苦手なので、この日本語コミュニティで心ある方のお助けを期待して投稿した次第です。かなりの期間が過ぎ、もう諦めかけていたところに、BigBandBeatさんのお助けが入り、感謝しています。

.alignの実用的な範囲の最大値は8byte命令の先頭の整列で.alignは8でしょう。その場合、問題の命令の後に3*nopが挿入されます。

問題の命令とは、シンボルでのオフセットアドレシングによるsave,load命令です。ただ、アクセスがBYTEの場合は全て4byte命令で問題は起きません。2BYTE,4BYTEアクセスのときはオフッセトの値が小さければ2byte命令、大きければ4byte命令になり、リンカー段階で結果4byte命令になる場合に問題がおきます。このアドレッシングを多用していれば、その命令毎に3*nopが発生することになり、ちょっと無視できない性能劣化になります。
問題発生する可能性のある命令を多用していなければ、この問題が起きていても、少し不要にプログラムサイズが増え、実効処理速度が遅くなるということだけなので気付かないケースが多いでしょう。

プログラム領域で.align4以上を記述するなら、その直後に.align2を書いとけば問題は発生しません。.align4で4byte境界にポインタが進んでおり、そこは2byte境界でもあるわけですから.align2が現れても本来の機能に対しては何の影響も与えません。

今までこのような問題が表沙汰にならなかったのはアセンブラで命令記述するユーザーが少ないということでしょうね。
重ね重ねBigBandBeatさんには感謝いたします。

BigBandBeat 回答番号 3
タイトル
気になったので問い合わせてみました。
ポイント
pt.
アクセス2925
投稿日時13/07/01 10:41
気になったので、問い合わせてみたところ、以下のような回答を得ました。
ご参考まで。。。

These NOPs should not be inserted. The assembler encodes the instructions in question as two-byte opcodes with a small offset field. The linker has the ability to expand such instructions into four-byte opcodes with a bigger offset field if it finds that the actual offset value does not fit into the two-byte opcode. Unfortunately in these cases it also inserts N/2-1 NOPs if alignment N is in force.

A workaround is to insert .ALIGN 2 directives directly before affected instructions. (Preceding align directives will still take effect.)

Thank you very much for bringing this issue to our attention. We will aim to address it in an update.


gyao 回答番号 2
タイトル
単なる遅延ではなく、実際にNOPコードが生成されています。
ポイント
pt.
アクセス3502
投稿日時13/02/01 20:31
Epochéさん回答ありがとうございます。
今回のターゲットはBF512ですので、パイプラインハザードなどによる遅延の資料としてはEE-197を見ております。しかし、それは遅延が発生するだけで、マシンコードレベルでNOP命令(0x0000)を挿入しなければ動作がおかしくなるのではありませんし、ツールが勝手にNOPを挿入することはないと思います。

また、例として挙げているリストの命令で遅延が発生するものは、ありません。是非、質問に挙げているリストをツールでビルドして、逆アセンブラのウィンドウでどのようにマシンコードが生成されているかを見てください。ちなみにリストのR7=nという命令はソースと逆アセンブラリストの行対応を分かりやすくするために入れています。
.ALIGN 0x100 などとすると、それ以後、問題のLOAD/STORE命令が複数あれば、その全ての後に127ヶものNOP命令が挿入されています。

VisualDSP++はV5.0 Update10でターゲットはBF512です。

Epoché 回答番号 1
タイトル
Store Buffer Load Collision?
ポイント
pt.
アクセス3132
投稿日時13/02/01 16:15
例えば、
http://www.analog.com/static/imported-files/application_notes/EE-171.pdf
の13ページなどはご参考になります?

スレッド一覧に戻る



コメント投稿

* コメントの投稿にはログイン(ユーザー登録)が必要です。


タイトル

* 50文字以内
『初心者でも大丈夫!』
(記事の内容が初心者向けの場合はここにチェックをしてください。)
本文

* あと6000文字

ファイル1
ファイル2
ファイル3

* 5MBまでのGIF, JPEG, PDF ファイルが投稿できます。

* 入力に時間がかかると、セキュリティのためにログイン情報が破棄されて書き込みが処理されないことがあります。投稿内容確認ボタンを押す前に、一旦文章をクリップボードにコピー(本文入力欄をクリック後Ctrlキー+A、Ctrlキー+Cと連続で押す)して、再貼り付けできるようにしておいて下さい。

ゲスト 様
投稿する場合はログインして下さい。 初めての方はこちらからご登録ください。

お知らせ
ユーザーランキング

* ランキング情報は約24時間おきに更新されます。


  個人情報保護方針会社情報お問い合わせ

copyright(c) 2010 - 2017 ITmedia Inc.