This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

アセンブラ言語で速くなるでしょうか

お世話になります。

大量の四則演算をする必要が出てきて処理時間が足りるか不安になってきました。

アセンブラ言語は速いと言われますが、マイコンが演算器を持っている場合はC言語で書いても同じなのでしょうか。

使っているのはRL78です。

初歩的な質問で本当に申し訳ありません。教えていただけたら幸いです。

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

  • > 大量の四則演算をする必要が出てきて処理時間が足りるか不安になってきました。

    計算量について具体的な見積もりがないのであれば不安になったところで仕方ありません。

    > アセンブラ言語は速いと言われますが、マイコンが演算器を持っている場合はC言語で書いても同じなのでしょうか。

    乗除・積和演算器を直にアクセスされるのであればアセンブラで組んだところで大したメリットはないと思います。コンパイラの機能で乗除・積和演算器を使用されるのであれば改善の余地は出てきますが、どの程度パフォーマンスが稼げるかは未知数です。先ずは現在可能な方法で処理時間に不足があるかを確認した後、必要に応じて対策を考えるべきでしょう。
  • チョコです。
    演算回路を内蔵している場合でも,アセンブラの方が演算回路の制御で余分なことをしなければ,速くなると考えられます。
    但し,アセンブラでは作成者により効率が大きく変化するので,あまり大きな期待はしない方がいいかもしれません。
  • 菅原と申します。

    30年ぐらい前であればハードウェアも高かったし、Cコンパイラも効率が悪かったのでアセンブラを選択することはありでした。現在だとCコンパイラの性能は非常に高いので、普通に最適化を有効にすれば大丈夫です。
    処理速度が足りないということであれば、クロックを上げるとか、能力の高いマイコンを検討するほうが現実的だと思いますよ。
  • ルネサスの超エキスパートがコンパイラーを作っているのでC言語でもアセンブラでもあまり差が無いと感じることが多くあります。検証や発展を無視してよほどの裏技を使わないとスピード重視の最適化にくらべてさほど速くできないと思います。また、ルネサスのコンパイラーは優秀との見解も良く聞きます。C言語の方がかえって良いのではと思います。

    チョット話がずれますが、ターゲットリンク(Simulink/Stateflowモデルからの自動コード生成ツール)の評価で手作業が実行時間は圧倒的に勝ったもののフラッシュおよびRAMサイズで負けた事があります。検証や変更などを意識してコーディングしますが、さすがにガックリきます。超天才でも先発完投20勝&三冠王なんてのはあり得ないので、凡人の私はお客様のご要求をSimulink/Stateflowに入れ込むところに集中してアセンブラどころかC言語コーディングも止めてSimulink/Stateflow+ターゲットリンク+ルネサスコンパイラにしようと思うこの頃です。

  • チョコです。

    追加で,コメントします。

    RL78のレジスタ・バンクをうまいこと使い(データアクセス用のポインタで使用するレジスタを通常の処理用と独立させる),データの構造をよく考えれば,アセンブラでの高速化は可能性がありますが,どの程度速くなるかは分かりません。

    なお,RL78にはS1~S3コアの3種類があり,S1コア(RL78/G10)には,そのようなハードは内蔵されていないので問題外です。RL78/G13のようなS2コアのデバイスがハードウェアを制御用のレジスタを介して制御するものです。RL78/G14以降のS3コアは入出力がレジスタ渡しの命令でのサポートになっています。使用予定のデバイスで異なることがあります。

    まずは,Cで評価してから対応を考えるのがいいでしょうね。

  • お世話になります。はるのうららです。

    たくさんのアドバイスありがとうございます。
    コアはS3コアを使っています。

    今の状況から推察すると処理時間が足りなくなるのはほぼ確実だと考えています。
    いいマイコンにするのも一案ですが、それであっても出来ることを全部試したかどうかを説明する必要が出てきます。(上司はハードの限界に挑んでいた世代です)
    もう一つは自分の勉強になるのではと思ってもいます。今回の対応も含んではいますが、アセンブラ言語を勉強しておくと今後の業務で役に立つのか、もしくは本当に必要になるまでは気にしない方が現実的なのかが知りたいと思っています。

    あやふやな質問で本当に申し訳ありません。
    もう少しご意見をいただけると幸いです。

    よろしくお願いいたします。
  • チョコです。
    アセンブラは基本的に,ハードウェアをいかに効率的に使用するかが重要です。
    つまり,ハードウェアを理解することが,いろんな方法を考察するのに必要です。
    (私も,ハードの限界に挑んでいた世代の生き残りです。)
  • > コアはS3コアを使っています。

    S3コアでは 16bit×16bit=32bit の演算等はそれ用の命令があり、CC-RL 等では組み込み関数でもサポートされるため、コンパイラの吐くコードに対してアセンブラで実行効率で勝るコードを書くのは難易度が高いです。

    > 今の状況から推察すると処理時間が足りなくなるのはほぼ確実だと考えています。

    初心者フォーラムで質問をされてる方が確実だと言っても説得力のあるものではないので、ある程度具体的な話をされないと意味はないと思います。現時点では情報がないため処理時間の問題が存在するかは判断不能です。

    > 出来ることを全部試したかどうかを説明する必要が出てきます。

    限られた期間内で作業を行うのがフツーと思います。検討は可能ですが、「出来ることを全部試す」はありえない話では? 先ずは問題が存在するかを確認することが第一にやるべき事と思います。

    > 自分の勉強になるのではと思ってもいます。

    勉強になることは確実ですが、存在するか判らない問題の解決への助けになるかは別の話なので分けて考えるべきでしょう。現時点で最も先に解決すべき問題を検討すべきです。
  • はるのうらら さん、こんにちは。NoMaYです。

    ひとくちに、アセンブラ言語でプログラムが書けるようになるといっても、さまざまなレベルがあると思います。(英語、独語、仏語、露語、中国語、とかもそうですよね。)

    (A) マニュアルを一切見ずに、数万行のアセンブラプログラムを書いて、更に、自力で機械語へ変換出来てしまう。嘘か真か分かりませんが、アセンブラ全盛時代にはそんな人がいた、という話も見掛けたような気がします。

    。。。途中のランクを省略(というか実際にランク分けの内容まで考えていませんが)。。。

    (E) マニュアルを見なくてもコンパイラが生成したコードが何となく分かる(最適化が掛かっていても)。また、コンパイラが生成したアセンブラソースをベースにしてマニュアルを見ながら多少の追加/変更/削除が出来る(多少時間が掛かっても)。

    脱線しますが、私はEランクですね。ただ、「多少の追加/変更/削除」という部分で、パズルを解くような追加/変更/削除を行うことが出来るというのが、ランクの枠外の私の特技かな、とも思っていますが、、、(C言語のマクロでもパズル的なものを考えたりしますし、、、)

    話を戻しますと、Eランクでも充分に昇進/昇給の助けに成るのではないかと思う反面、もう今だと、Aランクであること自体が昇進/昇給の助けになることは無いだろうなとも思うのです。

    あと、自分の経験で言うと(プログラムの性能向上はわりと私の得意な業務だったりします)、それなりの規模のプログラムでは、けっこう無駄な処理/効率の悪い処理、というのがあったりしますので、それを見つけて、削除する/処理を見直す、とかしてました。(C言語レベルで。)

    自分ではやったことがなかった(と思う)のですが、アルゴリズムの変更(例えばバブルソートをバイナリソートにする)とか、数学的な性質を利用した演算量の削減(乗除算回数が少なくなるようにうまくカッコで括るとか多項式の直交性から値が0になることが分かっている部分は計算しない)とか、そういうのも有効かな、と思います。

    アセンブラ化したのは、(数十行レベルの)割り込み処理の高速化とか、(フラッシュメモリのブロックサイズの事情で)270バイトのコードを256バイトに収める(パズル脳をフル回転させて1週間とか掛けて([追記]←これはもともとアセンブラプログラムだったものを更にというものでしたのでテーマが少し違いますかね))とか、そういうところだったですね(と思う)。

  • はるのうららさんがノンエグゼンプトなら、"全部"を上司に聞いてみてはいかがでしょうか?
    ビル・アトキンソンがハードウエアを勉強していたらQuickDrawは存在していないし、松永真理さんが理科女子でコンピュータに詳しかったらiモードも無かったと思います。こだわりが過ぎると新しい視点に気が付かずに世間から遅れを取ることもあります。情報端末や家電などの開発エンジニアでやっていくならアセンブラやCさえも知らなくて良いと思います。その代わりに情報端末や家電などの勉強に力を割くべきです。まぁ、角が立つので十分に考えて判断してください。