エラー、バグ、質問 - ページ 2506

 
Vict:
ジャスティファイ

レジスタの単位はバイトではなくビットです。そのため、この行は残りのコードで間違って使用されています。

#define  CACHE_LINE_SIZE 64
 
Francuz:

レジスタの単位はバイトではなくビットです。そのため、この行は残りのコードで間違って使用されています。

いや、なんか変なこと言ってますね。証明するつもりはない。プロセッサのドキュメントを見てください、ここを読んでくださいhttps://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

x86ではキャッシュラインは64バイト

レジスターは必要ない、全く話にならない。

Aligning to cache line and knowing the cache line size
Aligning to cache line and knowing the cache line size
  • 2011.09.02
  • MetallicPriestMetallicPriest 12.1k2929 gold badges135135 silver badges259259 bronze badges
  • stackoverflow.com
To prevent false sharing, I want to align each element of an array to a cache line. So first I need to know the size of a cache line, so I assign each element that amount of bytes. Secondly I want the start of the array to be aligned to a cache line. I am using Linux and 8-core x86 platform...
 
Vict:

いや、なんか変なこと言ってますね。証明するつもりはない。プロセッサのドキュメントをご覧ください、こちらをお読みくださいhttps://stackoverflow.com/questions/7281699/aligning-to-cache-line-and-knowing-the-cache-line-size/7284876

レジスターは必要ない、全く話にならない。

うーん...そうか(咳払い)とにかく、キャッシュはモデルによって違うんです。ソフトからその大きさを知る術はない。だから、それを目安にするのは愚かなことなのです。しかし、どのプロセッサも2種類のレジスタを持っており、熟練したプログラマが注目するのはレジスタの大きさである。また、このレジスタ指向も、プログラムとプロセッサの間にコンパイラとオペレーティングシステムが位置するため、必ずしも成功するわけではありません。

また、このラインはレジスターを使用せず、不正に計算されています。

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
 
Francuz:

うーん...なるほど。とにかく、キャッシュはプロセッサーによって異なるのです。しかも、そのサイズをソフトから知る術はない。だから、それに誘導されるのは愚かなことなのです。しかし、どのプロセッサも2種類のレジスタを持っており、熟練したプログラマが注目するのはレジスタの大きさである。また、コンパイラやオペレーティングシステムは、プログラムとプロセッサの間に位置するため、レジスタサイズ・ターゲティングでも必ずしも救われるとは限りません。

繰り返しになりますが、物事は進化しており、マルチスレッドにますます重点が置かれるようになってきています。

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

その上、このラインは計算方法が間違っていて、レジスターを考慮していない。
そうかもしれませんが、今のところ私を納得させることはできません。
std::hardware_destructive_interference_size, std::hardware_constructive_interference_size - cppreference.com
  • en.cppreference.com
These constants provide a portable way to access the L1 data cache line size.
 
Vict:

マルチスレッドにますます重きが置かれるようになり、進化しているのです。

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

そうかもしれませんが、今のところ私を納得させることはできません。

教えてくれない、教えてくれる。仕様書をよくお読みください。


トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

そうかもしれませんが、今のところ私を納得させることはできません。

どのようなシフトを希望されたのかよくわかりませんが、わかりやすく言うと、絶対番地は計算上まったく役に立ちません。メモリの基準点が構造体のアドレスであることを忘れていませんか?そして、構造体メモリブロック内の配列のオフセットを取得したかったのではないでしょうか?そして、構造体のアドレスと配列のヌル要素の差分が取得されるわけです。

 
Artyom Trishkin:

バー上のバッファに値がない場合、明示的にバッファに書き込む必要があります。つまり、計算された値がバッファに出力されるべきものであればバッファに書き出し、そうでなければ空の値を書き込むのです。

アルテムさん、ありがとうございます。

 
Francuz:

どのようなオフセットが欲しかったのかよくわかりませんが、絶対アドレスは計算上まったく役に立たないというバグは簡単に理解できます。 メモリの基準点が構造体アドレスであることを忘れていませんか?また、構造体メモリブロック内の配列のオフセットを取得したい場合もあるのではないでしょうか?そしてそれは、構造体のアドレスと配列の0番地の要素の違いです。

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
                                3        1                    2                  4

順番に行動する。

1 - 現在のデータ構造で最初のar[]要素のアドレスを取得します。

2. キャッシュラインの先頭からのオフセットを調べる。

3. そこからキャッシュラインの終わりまで何バイトか調べる。

4.キャッシュラインの終わりまで、このスペースに何バイト収まるかを調べる。


パソコンで実行したのでしょうか?スピードに差はありますか?それとも私だけでしょうか?

 
Vict:

2. キャッシュラインの開始位置からのオフセットを求める。

どうしてそれでオフセットが分かると思うんだ?

 
この減速の原因は何でしょうか?

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber, 2019.07.09 11:13

   Data data[];
   
   ArrayResize(data, 32768);

6倍速の減速が起きている!

 
fxsaber:
このブレーキは何のためにあるのですか?
動的配列は より多くのチェックがあります、Renatはかつて書きました、私はポストを見つけることができません、ちょうどインデックスアクセスについて話して、なぜそれがプラスよりも大幅に遅くなります。