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

アセンブリ言語(asm)プログラミングの質問。必ず、使用しているプロセッサや命令セット、およびアセンブラをタグ付けしてください。警告:.NETアセンブリの場合は、代わりにタグ[.net-assembly]を使用してください。Java ASMの場合は、代わりに[java-bytecode-asm]タグを使用してください。

12
GCCがa * a * a * a * a * aを(a * a * a)*(a * a * a)に最適化しないのはなぜですか?
科学的なアプリケーションで数値の最適化を行っています。私が気づいたことの1つは、GCCはにpow(a,2)コンパイルすることで呼び出しを最適化しますa*aが、呼び出しpow(a,6)は最適化されておらず、実際にはライブラリ関数を呼び出すpowため、パフォーマンスが大幅に低下します。(対照的に、インテルC ++コンパイラー(実行可能icc)は、のライブラリー呼び出しを排除しますpow(a,6)。) 私は好奇心だと、私は交換したときにということであるpow(a,6)とa*a*a*a*a*aGCC 4.5.1とオプション「を使用して-O3 -lm -funroll-loops -msse4」、それは5つの使用mulsd説明書を: movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 私が書いた場合(a*a*a)*(a*a*a)、それは生成されます movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm13, %xmm13 乗算命令の数を3に減らすと、icc同様の動作になります。 コンパイラがこの最適化トリックを認識しないのはなぜですか?

14
<は<=より速いですか?
であるif( a &lt; 901 )よりも速くif( a &lt;= 900 )。 この単純な例とまったく同じではありませんが、ループの複雑なコードではパフォーマンスにわずかな変更があります。これが真実である場合に備えて、これは生成されたマシンコードで何かをしなければならないと思います。

10
32ビットのループカウンターを64ビットで置き換えると、Intel CPUで_mm_popcnt_u64を使用すると、パフォーマンスが大幅にずれる
popcount大規模なデータ配列への最速の方法を探していました。私が遭遇した非常に奇妙な効果を:からループ変数を変更するunsignedにuint64_t私のPC上で50%で作られたパフォーマンスの低下を。 ベンチマーク #include &lt;iostream&gt; #include &lt;chrono&gt; #include &lt;x86intrin.h&gt; int main(int argc, char* argv[]) { using namespace std; if (argc != 2) { cerr &lt;&lt; "usage: array_size in MB" &lt;&lt; endl; return -1; } uint64_t size = atol(argv[1])&lt;&lt;20; uint64_t* buffer = new uint64_t[size/8]; char* charbuffer = reinterpret_cast&lt;char*&gt;(buffer); for (unsigned i=0; i&lt;size; …

11
Collat​​z予想を手書きのアセンブリよりも速くテストするためのC ++コード-なぜですか?
Project Euler Q14のこれら2つのソリューションは、アセンブリとC ++で作成しました。これらは、Collat​​z予想をテストするための同じ同一の力ずくのアプローチです。組み立てソリューションは、 nasm -felf64 p14.asm &amp;&amp; gcc p14.o -o p14 C ++は g++ p14.cpp -o p14 アセンブリ、 p14.asm section .data fmt db "%d", 10, 0 global main extern printf section .text main: mov rcx, 1000000 xor rdi, rdi ; max i xor rsi, rsi ; i l1: dec …


4
サイクルあたりの4つのFLOPの理論的な最大値を達成するにはどうすればよいですか?
最新のx86-64 Intel CPUで、サイクルあたり4つの浮動小数点演算(倍精度)の理論上のピークパフォーマンスをどのように達成できますか? 私が理解している限り、最新のIntel CPUのほとんどでSSE が完了addするmulまでに3サイクル、が完了するまでに5サイクルかかります(たとえば、Agner Fogの「Instruction Tables」を参照)。パイプライン化によりadd、アルゴリズムに少なくとも3つの独立した合計がある場合、1サイクルあたり1のスループットが得られます。これは、パックaddpdされたaddsdバージョンとスカラーバージョンおよびSSEレジスターに2を含めることができるため当てはまるためdouble、スループットはサイクルあたり2フロップと同じくらい高くなる可能性があります。 さらに、(これに関する適切なドキュメントを見たことはありませんが)addとmulは並行して実行でき、サイクルあたり4フロップの理論的な最大スループットを実現できます。 ただし、単純なC / C ++プログラムではそのパフォーマンスを再現できませんでした。私の最善の試みは約2.7フロップ/サイクルをもたらしました。ピークパフォーマンスを実証する単純なC / C ++またはアセンブラープログラムを提供できる人がいれば、高く評価されます。 私の試み: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #include &lt;sys/time.h&gt; double stoptime(void) { struct timeval t; gettimeofday(&amp;t,NULL); return (double) t.tv_sec + t.tv_usec/1000000.0; } double addmul(double add, double mul, int ops){ // Need to initialise differently …

30
アセンブリはCより速いですか?
アセンブラーを知っている理由の1つは、場合によっては、高水準言語(特にC)でコードを記述するよりもパフォーマンスの高いコードを記述するために使用できることです。ただし、これは完全に誤りではありませんが、実際にアセンブラを使用してよりパフォーマンスの高いコードを生成できるケースは非常にまれであり、アセンブリに関する専門知識と経験が必要であると何度も述べたと聞いています。 この質問は、アセンブラー命令がマシン固有で移植不可能であるという事実、またはアセンブラーの他の側面のいずれにも当てはまりません。もちろん、これ以外にもアセンブリを理解することには十分な理由がありますが、これは例やデータを求める特定の質問であり、アセンブラと高水準言語についての幅広い談話ではありません。 最新のコンパイラを使用して適切に記述されたCコードよりもアセンブリが高速になる場合の具体的な例を誰かが提供できますか?プロファイリングの証拠でその主張をサポートできますか?私はこれらのケースが存在することを確信していますが、いくつかの論争のポイントであると思われるので、これらのケースがどれほど難解であるかを正確に知りたいです。
475 c  performance  assembly 


4
隣接するintのJavaスイッチが、ケースを追加するとより速く実行されるように見えるのはなぜですか?
メインプログラムロジックの多くのポイントで呼び出されるホット関数で実行されるため、高度に最適化する必要があるいくつかのJavaコードに取り組んでいます。このコードの一部には、double変数10を任意の非負int exponentのsに乗じることによって乗算することが含まれます。(編集:なく最速、下記アップデート2参照)を一つの早道乗算値を取得するには、にあるswitchにexponent: double multiplyByPowerOfTen(final double d, final int exponent) { switch (exponent) { case 0: return d; case 1: return d*10; case 2: return d*100; // ... same pattern case 9: return d*1000000000; case 10: return d*10000000000L; // ... same pattern with long literals case 18: return d*1000000000000000000L; default: throw …

10
GCCを使用して読み取り可能なアセンブリを生成しますか?
CのソースファイルでGCCを使用して、ニーモニックバージョンのマシンコードをダンプし、コードのコンパイル先を確認する方法を考えていました。あなたはJavaでこれを行うことができますが、私はGCCで方法を見つけることができませんでした。 私はアセンブリでCメソッドを書き直そうとしていますが、GCCがそれをどのように行うかを確認すると、大きな助けになります。
256 c  gcc  assembly 

3
レトポリンとは何ですか?
カーネルまたはクロスプロセスメモリの開示(Spectre攻撃)を緩和するために、Linuxカーネル1は、いわゆるretpolineを介した間接呼び出しを実行するために-mindirect-branch=thunk-extern導入された新しいオプションでコンパイルされます。gcc これは、Googleの検索でごく最近の使用のみが検出されるため(通常はすべて2018年)、新しく発明された用語のようです。 retpolineとは何ですか?それは最近のカーネル情報開示攻撃をどのように防ぎますか? 1 Linux固有ではありませんが、他のOS での緩和策の一部として、類似または同一の構造が使用されているようです。

10
マルチコアアセンブリ言語はどのように見えますか?
昔々、たとえばx86アセンブラを作成するには、「EDXレジスタに値5をロードする」、「EDXレジスタをインクリメントする」などの指示があります。 4コア(またはそれ以上)を備えた最新のCPUでは、マシンコードレベルで4つの別個のCPUがあるように見えますか(つまり、4つの異なる「EDX」レジスタしかない)。もしそうなら、「EDXレジスタをインクリメントする」と言うとき、どのCPUのEDXレジスタがインクリメントされるかを決定するものは何ですか?現在、x86アセンブラに「CPUコンテキスト」または「スレッド」の概念はありますか? コア間の通信/同期はどのように機能しますか? オペレーティングシステムを作成している場合、ハードウェアを介して公開されているメカニズムによって、さまざまなコアでの実行をスケジュールできますか?特別な特権付きの指示ですか? マルチコアCPU用の最適化コンパイラ/バイトコードVMを作成している場合、すべてのコアで効率的に実行されるコードを生成するために、たとえばx86について特に何を知る必要がありますか? マルチコア機能をサポートするためにx86マシンコードにどのような変更が加えられましたか?
243 assembly  x86  cpu  multicore  smp 

12
「切り替え」は「if」より高速ですか?
switchステートメントは実際にはステートメントよりも高速ifですか? 以下のコードをVisual Studio 2010のx64 C ++コンパイラーで/Oxフラグを付けて実行しました。 #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;time.h&gt; #define MAX_COUNT (1 &lt;&lt; 29) size_t counter = 0; size_t testSwitch() { clock_t start = clock(); size_t i; for (i = 0; i &lt; MAX_COUNT; i++) { switch (counter % 4 + 1) { case 1: counter += …

3
オペレーティングシステムなしでプログラムを実行する方法
オペレーティングシステムを実行せずに、プログラムを単独でどのように実行しますか?コンピュータを起動時にロードして実行できるアセンブリプログラムを作成できますか?たとえば、フラッシュドライブからコンピュータを起動し、CPU上のプログラムを実行しますか?

16
Windows .exeを「逆コンパイル」することは可能ですか?または、少なくともアセンブリを表示しますか?
私の友人がFacebookからいくつかのマルウェアをダウンロードしましたが、自分自身に感染することなくそれが何をするのか知りたいです。.exeを実際に逆コンパイルできないことはわかっていますが、少なくともアセンブリで表示したり、デバッガをアタッチしたりできますか? .NET実行可能ファイルではなく、CLIヘッダーではないことを編集してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.