問題タブ [memory-access]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - SoA への AoS アクセスを提供する
配列の構造 (SoA) またはポインターの構造 (SoP) 形式でメモリ内に配置されたデータがあり、構造の配列 (AoS) 形式で配置されているかのようにそのデータにアクセスする方法があります。下。
ただし、の使用についてはあまり満足していません。struct AoS_4_SoP
これstruct
はテンプレートを使用しているように見えますが、たとえばが内部にハードコーディングされているfoo
ため、実際には一般的ではありません。bar
2 つの質問/リクエスト:
1) 読み書きのパフォーマンスに関して、AoS アクセスは直接 SoA アクセスと同じくらい良好に提供されていますか?
2) より一般的なスキームは何でしょうか? (私はquamranaのコードをここで見ましたが、役に立ちませんでした。)
上記のmain()
使用例を次に示します。
上記のコードは、次の方法でコンパイルできます。
次の出力が得られます。
memory-management - メソッド呼び出しで、オブジェクト メンバーのアドレスはどのように計算されますか?
質問が少し一般的であることは知っていますが、すでに一般的な回答が必要です。だから私が理解しようとしているのは、オブジェクトのメンバー変数がメモリの観点からどのようにアクセスされるかということです。たとえば、そのオブジェクトでメソッドが呼び出されたときですか?
たとえば、私はこの単純なクラスを持っています。
初期化される前であっても、ランタイムはhooのメモリアドレスをどのように把握しますか? 以下のコードにも同じことが当てはまります。
ランタイムは、値を格納するためにここでフィールドのアドレスをどのように知るのでしょうか?
IMO、少なくともJavaの場合、これらの変数アドレスはクラスファイルのオフセットにマップされるため、このオフセットを渡されたオブジェクト参照に(仮想メソッドに)追加することで(仮想メモリ上の)正確な場所を把握できます。しかし、確かではありません...
何か案は?
c - 逆参照前に初期化されていないポインターに値を代入する
char ポインター (*pData など) が NULL に初期化されずに宣言されているコード スニペットを見つけました。
関数 SomeFuntionToAssignValue() を呼び出した後、pData を逆参照すると、いつでも「メモリ アクセス例外」エラーがスローされますか?
コンパイル中またはローカル テスト中 (ここでは、いつでも再ロードできるターゲットでテストが行われるため、通常はメモリ破損の可能性が減少します)、「メモリ アクセス例外」エラーは発生しませんでした。
しかし、ターゲットが少なくとも 1 週間リロードされなかったフィールド環境でのテスト中に、「メモリ アクセス例外」エラーがスローされました。
では、NOT を実行char *pData = NULL
すると「メモリ アクセス例外」エラーが発生する可能性はありますか?
x86 - 最新の x86/amd64 チップで L1、L2、L3 CPU キャッシュをオフにするにはどうすればよいですか?
x86/x86_64 アーキテクチャのすべての最新の高性能 CPU には、L1、L2、場合によっては L3 (非常にまれなケースでは L4) というデータ キャッシュの階層があり、メイン RAM から読み込んだデータはそれらのいくつかにキャッシュされます。
プログラマーは、一部またはすべてのキャッシュ レベルで一部のデータをキャッシュしないようにする場合があります (たとえば、16 GB の RAM を memset し、一部のデータをキャッシュに保持したい場合)。これは MOVNTDQA のようです ( https://stackoverflow.com/a/37092 http://lwn.net/Articles/255364/ )
しかし、キャッシュの一部またはすべてのレベルを完全に (ただし一時的に) オフにして、すべてのメモリをアクセス命令 (グローバルまたは一部のアプリケーション / RAM の領域) はメモリ階層を使用しますか? 例: L1 をオフにし、L1 と L2 をオフにしますか? または、すべてのメモリ アクセス タイプを「キャッシュされていない」UC (CR0 の CD+NW ビット??? SDM vol3a ページ423 424、425および「第 3 レベル キャッシュ無効化フラグ、IA32_MISC_ENABLE MSR のビット 6 (ベースのプロセッサでのみ使用可能) Intel NetBurst マイクロアーキテクチャ) — L1 および L2 キャッシュとは関係なく、L3 キャッシュを無効および有効にできます。")
このようなアクションは、AES キーの盗難、隠しキャッシュ チャネル、Meltdown/Spectre などのキャッシュ サイド チャネル攻撃/リークからデータを保護するのに役立つと思います。ただし、この無効化には膨大なパフォーマンス コストがかかります。
PS: 何年も前に技術ニュース Web サイトにそのようなプログラムが投稿されたことを覚えていますが、今は見つかりません。いくつかの魔法の値を MSR に書き込み、その後実行されるすべての Windows プログラムを非常に遅くするのは、単なる Windows exe でした。キャッシュは、再起動するか、「元に戻す」オプションでプログラムを開始するまでオフになっていました。
python - 最悪の場合のクイックソートについて実験中。うまくいきますが、最悪の場合、不明なエラーが発生しました。おもう
メモリアクセスに関するエラーです(定かではありません)。
n個の個別の要素(n> 0)のクイックソートについて実験しています。要素が数百万を超えていても、シャッフルされた配列に対しては正しく動作しますが、n >= 4000 の最悪の場合には動作しません。
何が問題で、どうすれば修正できますか?
これはパイソンコードです
これはC++コードです
シェルに「プロセスは終了コード -1073741571 で終了しました」と表示される
arrays - アラインされていない uint16 配列にポインタでアクセスすると「アラインメント例外」がスローされるのに、添え字を使用して配列にアクセスするとスローされないのはなぜですか?
次のコードを使用して質問を説明します。
そのコードでarray
は、メモリアクセス例外を発生させるために、メモリを非整列にする必要があります。
だから私の質問は、ポインターを介してアライメントされていない uint16 配列にアクセスするときに「アライメント例外」がスローされるのに、配列添字を使用して配列にアクセスするときにスローされないのはなぜですか?
これまでに見つけたリソースのどれも、 と の両方の行a = ptr->array[0];
がb = *u16ptr;
まったく同じアライメントされていないメモリにアクセスしている場合、これがなぜなのかを説明していません。
誰かが説明したり、正しい方向を示してくれませんか?
c - 2の違い - SIGSEGV (11) [Codewars]
Codewars で次の Kata を実行しようとしています。
目的は、指定された整数の配列から差が 2 の整数のすべてのペアを返すことです。
結果配列は値の昇順でソートする必要があります。
配列内に重複する整数がないと仮定します。入力配列内の整数の順序は重要ではありません。
これは私の解決策ですが、クラッシュしますSIGSEGV (11). Invalid memory access.
誰か助けてくれませんか?
intel - mem_load_uops_retired.l3_miss と offcore_response.demand_data_rd.l3_miss.local_dram イベントの違い
Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz
( Haswell
) プロセッサーを持っています。AFAIK, , は、 DRAM (つまり) のデータ読み取りアクセスmem_load_uops_retired.l3_miss
数をカウントします。は、その名前が示すように、DRAM を対象としたデータ読み取りの数をカウントします。したがって、これら 2 つのイベントは同等(または少なくともほぼ同じ) のように見えます。ただし、次のベンチマークに基づくと、前者のイベントは後者よりもはるかに頻度が低くなります。demand
non-prefetch
offcore_response.demand_data_rd.l3_miss.local_dram
demand
1) ループ内で 1000 要素のグローバル配列を初期化するC
:
2) Evince で PDF ドキュメントを開く:
3) Wireshark を 5 秒間実行します。
4) Inkscape で画像にぼかしフィルターを実行する:
4つのベンチマークすべてoffcore_response.demand_data_rd.l3_miss.local_dram
で、は のほぼ2 倍の頻度mem_load_uops_retired.l3_miss
です。これは合理的ですか?なんで?ベンチマークが複雑すぎて粗い場合は教えてください。
memory-management - lex/yacc 配列を使用してメモリにアクセスするにはどうすればよいですか?
yacc/lex を使用してコンパイラを作成しようとしていますが、Array[2] のような c++ のように、メモリに直接アクセスする方法が見つからないようです。
文字列を使用しているものをいくつか見つけましたが、他のタイプのデータに一般化しようとするのは困難です。
前もって感謝します。
segmentation-fault - プログラムは、メモリ アクセスが許可されているかどうかをどのように認識しますか?
ウィキペディアでは、「セグメンテーション違反」について次のように説明しています。
セグメンテーション フォールトは、プログラムがアクセスを許可されていないメモリ ロケーションにアクセスしようとした場合、または許可されていない方法でメモリ ロケーションにアクセスしようとした場合に発生します (たとえば、読み取り専用ロケーションに書き込もうとしたり、オペレーティング システムの一部を上書きします)。
では、プログラムがアクセスしようとしているメモリが実際にアクセスを許可されているかどうかをプログラムの実行者が実行時に知るメカニズムは何ですか?