タグ付けされた質問 「arm」

1
Android / ARMターゲットのDelphi XExコード生成に影響を与える方法は?
2017-05-17を更新。私はこの質問の元となった会社で働いていないため、Delphi XExにアクセスできません。私がそこにいる間、問題はFPC + GCC(Pascal + C)の混合に移行することで解決されました。NEON組み込み関数は、それが違いを生むいくつかのルーチンに使用します。(FPC + GCCは、標準ツール、特にValgrindの使用を可能にするため、強く推奨されます。)信頼できる例を使用して、Delphi XExから最適化されたARMコードを実際に生成できる方法を誰かが示すことができる場合、私は答えを受け入れます。 EmbarcaderoのDelphiコンパイラはLLVMバックエンドを使用して、Androidデバイス用のネイティブARMコードを生成します。Androidアプリケーションにコンパイルする必要があるPascalコードが大量にあり、Delphiでより効率的なコードを生成する方法を知りたいです。現在、私は自動SIMD最適化のような高度な機能についてさえ話していません。合理的なコードを生成することについてだけです。確かに、パラメーターをLLVM側に渡す方法、または何らかの方法で結果に影響を与える方法が必要ですか?通常、どのコンパイラにもコードのコンパイルと最適化に影響を与える多くのオプションがありますが、DelphiのARMターゲットは単に「最適化のオン/オフ」であり、それだけです。 LLVMは適度にタイトで実用的なコードを生成できるはずですが、Delphiはその機能を奇妙な方法で使用しているようです。Delphiはスタックを非常に多用したいと考えており、通常、プロセッサのレジスタr0〜r3を一時変数としてのみ使用します。おそらく最もクレイジーなのは、通常の32ビット整数を4つの1バイトのロード操作としてロードすることです。Delphiがより優れたARMコードを生成するようにするにはどうすればよいですか? 最初は、バイトごとの読み込みはビッグエンディアンからバイト順を交換するためのものだと思っていましたが、そうではありません。実際には、32ビットの数値を4つのシングルバイトの読み込みで読み込むだけです。*アライメントされていないワードサイズのメモリロードを行わずに、32ビット全体。(それを避けるべきかどうかは別のことであり、コンパイラのバグであることを示唆しています)* この簡単な関数を見てみましょう: function ReadInteger(APInteger : PInteger) : Integer; begin Result := APInteger^; end; 最適化がオンになっていても、アップデートパック1を適用したDelphi XE7とXE6は、その関数に対して次のARMアセンブリコードを生成します。 Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi: 00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>: 0: b580 push {r7, lr} 2: 466f mov r7, sp 4: b083 sub sp, #12 6: 9002 str …

5
ARMアーキテクチャとx86の違いは何ですか?[閉まっている]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 4年前休業。 この質問を改善する ARMがモバイルであることを期待している間、x86アーキテクチャはキーボードで動作するように特別に設計されていますか?2つの主な違いは何ですか?
192 x86  arm 

1
ARMチップにJavascriptという名前の命令(FJCVTZS)があるのはなぜですか?
FJCVTZSは、「浮動小数点Javascriptを符号付き固定小数点に変換し、ゼロに向かって丸める」です。Armv8.3-Aチップ以降でサポートされています。JavaScriptがベアメタルにそれほど近いとは思わないので、これは奇妙なことです。 命令の機能の説明はありますが、なぜ存在するのかはわかりません。 このスレッドは、「JSには整数型がないため、特定のユースケースでは、アルゴリズム上の理由がないために、この操作がわいせつに必要になることが多いため、単一の命令として存在します」と述べています。それはもっともらしいですが、もっと詳しく理解したいと思います。
148 javascript  assembly  arm 

3
armeabiコードよりもarmeabi-v7aコードを使用する理由
現在のプロジェクトでは、複数の.soファイルを使用しています。これらは、armeabiおよびarmeabi-v7aフォルダーにあります。残念ながら、.soファイルの1つは6MBで、ファイルサイズを小さくする必要があります。ファットなAPKファイルを作成する代わりに、armeabiファイルのみを使用してarmeabi-v7aフォルダーを削除します。 NDKドキュメントによると、armeabi-v7aコードは、追加のCPU命令を含むことができる拡張armeabiコードです。これはすべて私の専門知識を超えていますが、なぜarmeabi-v7aとarmeabiの両方のコードが必要なのか疑問に思います。両方を持っている正当な理由があるに違いありませんよね? 私のテストデバイスでは、これはすべて正常に動作するようです。これらにはARM v7 CPUがあります。現在すべてが機能していると想定しても安全ですか?


15
C配列に値が存在するかどうかをすばやく見つけるには?
サイズが256(できれば1024、ただし256が最小)の配列を反復処理し、値が配列の内容と一致するかどうかを確認する必要のある、タイムクリティカルなISRを備えた組み込みアプリケーションがあります。boolこの場合、A はtrueに設定されます。 マイクロコントローラーはNXP LPC4357、ARM Cortex M4コア、コンパイラーはGCCです。私はすでに最適化レベル2(3は遅い)を組み合わせ、フラッシュではなくRAMに関数を配置しています。また、ポインター演算とforループを使用します。これは、アップではなくダウンカウントを行います(かどうかのチェックi!=0は、かどうかのチェックよりも高速ですi<256)。結局のところ、私は12.5 µsの持続時間で終了していますが、これは実現可能にするために大幅に削減する必要があります。これは私が今使っている(疑似)コードです: uint32_t i; uint32_t *array_ptr = &theArray[0]; uint32_t compareVal = 0x1234ABCD; bool validFlag = false; for (i=256; i!=0; i--) { if (compareVal == *array_ptr++) { validFlag = true; break; } } これを行う最も速い方法は何でしょうか?インラインアセンブリの使用が許可されています。他の「あまりエレガントでない」トリックも許可されています。

8
LinuxホストマシンにRaspberry Piクロスコンパイラをインストールする方法
私のUbuntuマシンでRaspberry Piをクロスコンパイルできるようにしようとしています。 最初の試みでは、Ubuntuリポジトリにあるarm-linux-gnueabiコンパイラを使用していました。私はこれを手に入れました。すべての依存関係を構築し、cmakeプロジェクトでクロスコンパイラを使用することができました。 しかし、私はhfバージョンを使用する必要があると思うので、arm-linux-gnueabihfに切り替えました。その後、これはarmv6であるため、Raspberry Piでは機能しないことに気付きました。 少しグーグルで調べた後、GitHubのビルド済みツールチェーンを見つけました。 ツールチェーンをダウンロードしましたが、「インストール」方法がよくわかりません。ファイルをホームディレクトリに抽出しました。ディレクトリ構造は次のようになります。 /gcc-linearo-arm-linux-gnueabihf-raspbian /arm-linux-gnueabihf /bin (contains g++, gcc, etc) /lib (contains libstdc++ library) /bin (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...) /lib (gcc lib stuff) ディレクトリをINNER binフォルダーに変更すると、ターミナルからテストプログラムを問題なくコンパイルできます。 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/ arm-linux-gnueabihf/bin$ g++ test.cpp -o test 次に、ツールのプレフィックスバージョンが含まれるOUTER binフォルダーでテストプログラムをコンパイルしようとしました。 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ arm-linux-gnueabihf-g++ test.cpp -o test ただし、今すぐ(内部のbinディレクトリの外側から)コンパイラーを使用しようとすると、ツールチェーンに付属しているlibstdc ++共有ライブラリーを見つけることができません。 arm-linux-gnueabihf-gcc: error while loading shared libraries: libstdc++.so.6: …


4
ELFファイルとbinファイルの違いは何ですか?
コンパイラーによって生成される最終的なイメージには、binファイルと拡張ローダー形式のELfファイルの両方が含まれます。これら2つの違いは何ですか(特にELFファイルのユーティリティ)。
97 arm  elf 

2
arm64とaarch64の違い
私は2つの「ロック解除された」デバイス、iPad mini3とGalaxyEdge 6を持っており、どちらも端末と​​最小限のUNIXコマンドのセットを備えています。両方のデバイスにarm64プロセッサがあると思いましたが、実行すると uname -a 両方のデバイスで、次のようになりました。 iPad mini 3の場合: xxxxs-iPad:/var/mobile root# uname -a Darwin xxxx-iPad 14.0.0 Darwin Kernel Version 14.0.0: Wed Jun 24 00:50:15 PDT 2015; root:xnu-2784.30.7-30/RELEASE_ARM64_S5L8960X iPad4, **arm64**, J85mAP サムスンギャラクシーs6エッジの場合: u0_a203@zerolte:/ $ uname -a Linux localhost 3.10.61-4497415 #1 SMP PREEMPT Thu Apr 9 15:06:40 KST 2015 **aarch64** GNU/Linux 私が間違っていなければ、どちらの場合も最後の情報であるJ85mAPとGNU …
86 android  ios  gcc  arm  arm64 

1
マシンコードの正確なコピーは、元の関数よりも50%遅く実行されます
組み込みシステムのRAMとフラッシュメモリからの実行を少し試しました。迅速なプロトタイピングとテストのために、私は現在Arduino Due(SAM3X8E ARM Cortex-M3)を使用しています。私が見る限り、Arduinoランタイムとブートローダーはここでは何の違いもないはずです。 ここに問題があります:ARM Thumb Assemblyで記述された関数(calc)があります。calcは数値を計算して返します。(> 1s runtime for the given input)次に、その関数のアセンブルされたマシンコードを手動で抽出し、それを生のバイトとして別の関数に入れました。両方の機能がフラッシュメモリに存在することが確認されています(アドレス0x80149および0x8017D、隣り合っています)。これは、逆アセンブルとランタイムチェックの両方で確認されています。 void setup() { Serial.begin(115200); timeFnc(calc); timeFnc(calc2); } void timeFnc(int (*functionPtr)(void)) { unsigned long time1 = micros(); int res = (*functionPtr)(); unsigned long time2 = micros(); Serial.print("Address: "); Serial.print((unsigned int)functionPtr); Serial.print(" Res: "); Serial.print(res); Serial.print(": "); Serial.print(time2-time1); Serial.println("us"); …

2
Cortex-A72で-O3ではなく-O0を使用した単純なタイトループのサイクルでこの高い変動が発生する原因は何ですか?
コードの一部に対して非常に一貫性のあるランタイムを取得するためにいくつかの実験を行っています。私が現在計時しているコードは、かなり恣意的なCPUバウンドのワークロードです。 int cpu_workload_external_O3(){ int x = 0; for(int ind = 0; ind < 12349560; ind++){ x = ((x ^ 0x123) + x * 3) % 123456; } return x; } 割り込みを無効にし、上記の関数の10回の試行を実行するカーネルモジュールを作成しました。各試行のタイミングは、前後のクロックサイクルカウンターの差をとることによって計っています。その他の注意事項: マシンはARM Cortex-A72であり、それぞれ4コアの4ソケット(それぞれに独自のL1キャッシュがある) クロック周波数スケーリングはオフです ハイパースレッディングはサポートされていません マシンは、一部の最低限のシステムプロセスを除いて、実質的に何も実行していません 言い換えると、システム変動のほとんど/すべての原因が説明されていると私は信じています。特に、割り込みを無効にしてカーネルモジュールとして実行した場合spin_lock_irqsave()、コードは実行間でほぼ同じパフォーマンスを達成するはずです(たぶん小さなパフォーマンスヒット)最初の実行では、いくつかの命令が最初にキャッシュにプルされますが、それだけです)。 実際、ベンチマークされたコードがでコンパイルされた場合、-O3平均で〜135,845,192のうち最大で200サイクルの範囲があり、ほとんどの試行でまったく同じ時間がかかりました。ただし、を使用してコンパイルする-O0と、範囲は262,710,916のうち158,386サイクルまで増加します。範囲とは、最長実行時間と最短実行時間の差を意味します。さらに、-O0コードでは、どの試行が最も遅い/最も速いかについて一貫性があまりありません-直感的には、ある場合には、最も速いものが最初であり、最も遅いものが直後のものでした! それで、-O0コードの変動性のこの高い上限を引き起こしている可能性があるものは何ですか?アセンブリを見ると、-O3コードはすべて(?)をレジスタに格納しているようですが、-O0コードにはたくさんの参照spがあるため、メモリにアクセスしているようです。しかし、それでも、すべてがL1キャッシュに取り込まれ、かなり確定的なアクセス時間でそこに座っていることが期待されます。 コード ベンチマーク対象のコードは上記のスニペットにあります。組み立ては下にあります。とgcc 7.4.0以外はフラグなしでコンパイルされました。-O0-O3 -O0 0000000000000000 <cpu_workload_external_O0>: 0: d10043ff sub sp, sp, …

1
このC ++ AtomicInt実装は正しいですか?
前提:私はARM組み込み(ほとんどベアメタル)環境で作業していますが、C ++ 11(も)さえ使用できないので、「標準のC ++のみを使用するstd::atomic<int>」などの回答は避けてください:できません。std::atomic<int> このAtomicIntのARM 実装は正しいですか?(ARMアーキテクチャがARMv7-Aであると想定) 同期の問題が発生していますか?それはvolatile必要/便利? // File: atomic_int.h #ifndef ATOMIC_INT_H_ #define ATOMIC_INT_H_ #include <stdint.h> class AtomicInt { public: AtomicInt(int32_t init = 0) : atom(init) { } ~AtomicInt() {} int32_t add(int32_t value); // Implement 'add' method in platform-specific file int32_t sub(int32_t value) { return add(-value); } int32_t inc(void) { …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.