タグ付けされた質問 「x86-64」

x86-64はIntel x86アーキテクチャの64ビット拡張です

10
x86-64システムに48ビットの仮想アドレス空間しかないのはなぜですか?
本で私は以下を読みました: 32ビットプロセッサには2 ^ 32の可能なアドレスがありますが、現在の64ビットプロセッサには48ビットのアドレス空間があります 私の予想では、64ビットプロセッサの場合、アドレススペースも2 ^ 64になるはずです。 だから私はこの制限の理由は何だろうと思っていましたか?


2
「担当者」とは いいえ;」x86アセンブリの意味ですか?「一時停止」の指示と同じですか?
どういうrep; nop意味ですか? pause指導と同じですか? rep nop(セミコロンなし)と同じですか? 簡単なnop指示との違いは何ですか? AMDプロセッサとIntelプロセッサでは動作が異なりますか? (ボーナス)これらの指示の公式文書はどこにありますか? この質問の動機 別の質問のコメントでいくつか議論した後rep; nop;、x86(またはx86-64)アセンブリで何を意味するのかわからないことに気付きました。また、ウェブ上で適切な説明を見つけることができませんでした。 これrepは、「次の命令cx回数を繰り返す」ことを意味するプレフィックスであることを私は知っています(または、少なくとも、古い16ビットx86アセンブリではそうでした)。これによると、ウィキペディアでの集計表、それが思わrepだけで使用することができmovs、stos、cmps、lods、scas(多分、この制限は、新しいプロセッサ上で削除されました)。したがって、rep nop(セミコロンなしで)nop操作cx時間を繰り返すと思います。 しかし、さらに調べてみると、さらに混乱しました。これは、と思われるrep; nopとpause まったく同じオペコードにマップし、pauseちょうどより少し異なる振る舞いを持ってnop。2005年からのいくつかの古いメールは異なることを言っていました: 「力を入れすぎないように」 「2バイトのエンコーディングだけで「nop」と同等です。」 「それはIntelの魔法です。それは「いや、でも他のHT兄弟を走らせて」のようなものです。」 「Intelでは一時停止し、Athlonでは高速パディングです」 これらの異なる意見で、私は正しい意味を理解することができませんでした。 これは、Linuxカーネル(i386とx86_64の両方)でこのコメントとともに使用されています。同じコメントで、BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */でも使用されています。

4
メモリアライメント:alignof / alignasの使い方は?
現在、共有メモリを使用しています。 わからないalignofとalignas。 cppreferenceが不明確です:alignof「alignment」を返しますが、「alignment」とは何ですか?次のブロックを整列させるために追加するバイト数?パッド入りサイズ?スタックオーバーフロー/ブログエントリも不明確です。 誰かが明確に説明できますalignofとalignas?

2
IBMサンプルコード、非再入可能関数がシステムで機能しない
プログラミングの再入学を勉強していました。IBMのこのサイト(本当に良いサイト)。以下にコピーしたコードを見つけました。これは、ウェブサイトに登場する最初のコードです。 コードは、「危険なコンテキスト」で絶えず変化する2つの値を出力することにより、テキストプログラムの非線形開発(非同期)で変数への共有アクセスに関する問題を示します。 #include <signal.h> #include <stdio.h> struct two_int { int a, b; } data; void signal_handler(int signum){ printf ("%d, %d\n", data.a, data.b); alarm (1); } int main (void){ static struct two_int zeros = { 0, 0 }, ones = { 1, 1 }; signal (SIGALRM, signal_handler); data = zeros; alarm …
11 c  gcc  signals  x86-64  data-race 

1
コンパイラが呼び出し先に保存されたレジスタの使用をここで主張するのはなぜですか?
次のCコードを考えてみます。 void foo(void); long bar(long x) { foo(); return x; } -O3またはのいずれかを使用してGCC 9.3でコンパイルすると-Os、次のようになります。 bar: push r12 mov r12, rdi call foo mov rax, r12 pop r12 ret clangからの出力は、呼び出し先保存レジスタとしてではrbxなく選択することを除いて同じですr12。 しかし、私はこのように見えるアセンブリを見たいと思っています/期待しています: bar: push rdi call foo pop rax ret 英語では、これが私の目に見えるものです。 呼び出し先が保存したレジスタの古い値をスタックにプッシュします x呼び出し先が保存したレジスタに移動します コール foo 移動しx、戻り値レジスタに呼び出し先保存レジスタから スタックをポップして、呼び出し先が保存したレジスタの古い値を復元します 呼び出し先に保存されたレジスターをいじる必要がないのはなぜですか?代わりにこれを行わないのはなぜですか?それはより短く、よりシンプルで、おそらくより高速に見えます: xスタックにプッシュ コール foo xスタックから戻り値レジスタにポップ 私の組み立ては間違っていますか?余分なレジスタをいじるよりも効率が悪いのでしょうか?これらの両方に対する答えが「いいえ」である場合、GCCまたはclangのいずれかがこのようにしないのはなぜですか? …
10 c  gcc  assembly  clang  x86-64 

1
C11 Atomic Acquire / Releaseおよびx86_64ロード/ストアの一貫性の欠如?
C11標準のセクション5.1.2.4、特にリリース/取得のセマンティクスに苦労しています。私は、https://preshing.com/20120913/acquire-and-release-semantics/(他のものの中でも)が次のように述べていることに注意します。 ...リリースセマンティクスは、プログラムの順序でそれに先行する読み取りまたは書き込み操作による書き込みリリースのメモリの並べ替えを防ぎます。 したがって、次の場合: typedef struct test_struct { _Atomic(bool) ready ; int v1 ; int v2 ; } test_struct_t ; extern void test_init(test_struct_t* ts, int v1, int v2) { ts->v1 = v1 ; ts->v2 = v2 ; atomic_store_explicit(&ts->ready, false, memory_order_release) ; } extern int test_thread_1(test_struct_t* ts, int v2) { int v1 …

2
L2 HWプリフェッチャーは本当に役に立ちますか?
私はWhisky Lake i7-8565Uで、512 KiBのデータ(L2キャッシュサイズの2倍)をコピーするためのパフォーマンスカウンターと時間を分析しており、L2 HWプリフェッチャーの作業に関して誤解に直面しています。 でインテル・マニュアル第4巻MSR MSRがある0x1A4ビット0(無効にする1)L2 HWプリフェッチャをcontrolloingするためのものであるの。 次のベンチマークを検討してください。 memcopy.h: void *avx_memcpy_forward_lsls(void *restrict, const void *restrict, size_t); memcopy.S: avx_memcpy_forward_lsls: shr rdx, 0x3 xor rcx, rcx avx_memcpy_forward_loop_lsls: vmovdqa ymm0, [rsi + 8*rcx] vmovdqa [rdi + rcx*8], ymm0 vmovdqa ymm1, [rsi + 8*rcx + 0x20] vmovdqa [rdi + rcx*8 + 0x20], ymm1 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.