C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part149
https://mevius.5ch.net/test/read.cgi/tech/1581974381/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
テンプレここまで
探検
C++相談室 part150
■ このスレッドは過去ログ倉庫に格納されています
2020/03/24(火) 00:04:33.93ID:YFRNwZnv
663デフォルトの名無しさん
2020/05/04(月) 17:11:45.42ID:mcNTUyFW664デフォルトの名無しさん
2020/05/04(月) 17:12:19.55ID:heXhx7kW >>628
ちょっx86やx64でアトミックに読み書きできる(バスサイクルが他コアに割り込まれない)ことが保証されているのは
32 bitまででしかも32 bit境界に整列している場合のみのでは…
ちなdoubleは64 bit
ちょっx86やx64でアトミックに読み書きできる(バスサイクルが他コアに割り込まれない)ことが保証されているのは
32 bitまででしかも32 bit境界に整列している場合のみのでは…
ちなdoubleは64 bit
665デフォルトの名無しさん
2020/05/04(月) 17:30:50.31ID:b5BOjBYY666デフォルトの名無しさん
2020/05/04(月) 18:05:00.17ID:hwmiGMKy667デフォルトの名無しさん
2020/05/04(月) 18:43:33.39ID:wRQD0Fqh wandbox上だとatomic<double>はロックフリーらしい、多分x86-64環境なら同じ
https://wandbox.org/permlink/0LWMsNPNmSn6rpZ4
https://wandbox.org/permlink/0LWMsNPNmSn6rpZ4
668デフォルトの名無しさん
2020/05/04(月) 18:54:28.70ID:heXhx7kW >>666
>64bit境界であることは必須
ハア(゚Д゚)?
ていうことは
char *p = 〜;
*p = 'a';
は、pが8の倍数でなければ非アトミック??
short *q = 〜;
*q = 123;
もまた、qが8の倍数でなければ非アトミック???
なんと?!
>64bit境界であることは必須
ハア(゚Д゚)?
ていうことは
char *p = 〜;
*p = 'a';
は、pが8の倍数でなければ非アトミック??
short *q = 〜;
*q = 123;
もまた、qが8の倍数でなければ非アトミック???
なんと?!
669デフォルトの名無しさん
2020/05/04(月) 18:56:20.07ID:/R09lZ8N doubleの話をcharに拡大して何がしたいのか
670デフォルトの名無しさん
2020/05/04(月) 18:57:04.84ID:aRLx0l42 アスペは文脈が読めない
671デフォルトの名無しさん
2020/05/04(月) 19:00:17.65ID:aMJtnkBw shortだって64bit境界跨いでたら非アトミックだぞ
わざわざ作らなければそんなことにならないだろうけど
わざわざ作らなければそんなことにならないだろうけど
672デフォルトの名無しさん
2020/05/04(月) 19:06:17.15ID:heXhx7kW つかインテルアーキテクチャーのソフトウェアーデベロッパーズマニュアルによると
「8.1.1 Guaranteed Atomic Operations」
に書いてあったわサーセン;;;;
「8.1.1 Guaranteed Atomic Operations」
に書いてあったわサーセン;;;;
673デフォルトの名無しさん
2020/05/04(月) 19:09:35.51ID:heXhx7kW The Intel486 processor (and newer processors since) guarantees:
- Reading or writing a byte
- Reading or writing a word aligned on a 16-bit boundary
- Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees:
- Reading or writing a quadword aligned on a 64-bit boundary
- 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee:
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
とのことなので「The Pentium processor (and newer processors since) 」ならおk
- Reading or writing a byte
- Reading or writing a word aligned on a 16-bit boundary
- Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees:
- Reading or writing a quadword aligned on a 64-bit boundary
- 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee:
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
とのことなので「The Pentium processor (and newer processors since) 」ならおk
674デフォルトの名無しさん
2020/05/04(月) 19:15:43.74ID:heXhx7kW で、「The P6 family processors (and newer processors since) 」において
キャッシュラインを跨ぐとatomicが保証されない旨がその下に書かれているので、
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
は妄信はできん
やっぱalignedな場合しか信用できん
キャッシュラインを跨ぐとatomicが保証されない旨がその下に書かれているので、
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
は妄信はできん
やっぱalignedな場合しか信用できん
675デフォルトの名無しさん
2020/05/04(月) 19:18:59.34ID:/R09lZ8N まあ今時のプロセッサだとキャッシュライン単位でしかdramアクセスしないからそうなるのが自然なんだよね
676デフォルトの名無しさん
2020/05/04(月) 20:44:57.79ID:Aib9AjJN こういう非常時でも特に誰かがプログラムで社会貢献してるとは聞かないな
677デフォルトの名無しさん
2020/05/05(火) 05:46:34.77ID:EU5dGh0t アングル:コロナ感染経路、スマホ使った「接触追跡」の最前線
https://jp.reuters.com/article/health-coronavirus-tracing-idJPKCN21X0LE
つかビッグデータ取り扱い系分野は災害時に地味に活躍している印象
ホンダとか東日本大震災翌日からインターナビで収集した情報で被災地の道路寸断マップを
作って公開したんだったと思った(記憶モード
https://www.honda.co.jp/news/2011/4111109.html
https://jp.reuters.com/article/health-coronavirus-tracing-idJPKCN21X0LE
つかビッグデータ取り扱い系分野は災害時に地味に活躍している印象
ホンダとか東日本大震災翌日からインターナビで収集した情報で被災地の道路寸断マップを
作って公開したんだったと思った(記憶モード
https://www.honda.co.jp/news/2011/4111109.html
678デフォルトの名無しさん
2020/05/05(火) 07:41:06.24ID:NyxHUKM5 ビッグデータを公開してくれれば誰か作るんじゃね
679デフォルトの名無しさん
2020/05/05(火) 07:46:04.08ID:pSJxQCb1680デフォルトの名無しさん
2020/05/06(水) 11:06:32.37ID:lE4/XlkX >>611
その変の話は詳しくないので分からないのですが、この質問は、マルチコアやマルチCPUでの話ですか。
前から、その辺は、CriticalSection()などで排他処理すれば問題ないのではないかと思っていたのですが、その変どうなんでしょう?
それとも、自作OSなどで、 CriticalSection()のようなものを自作する場合の話でしょうか?
ちなみに、xor xchg などの話はよく理解できてません。
これらは、複数のCPUが1つのフラグを同時に読み書きした場合の問題なんでしょうか。
その変の話は詳しくないので分からないのですが、この質問は、マルチコアやマルチCPUでの話ですか。
前から、その辺は、CriticalSection()などで排他処理すれば問題ないのではないかと思っていたのですが、その変どうなんでしょう?
それとも、自作OSなどで、 CriticalSection()のようなものを自作する場合の話でしょうか?
ちなみに、xor xchg などの話はよく理解できてません。
これらは、複数のCPUが1つのフラグを同時に読み書きした場合の問題なんでしょうか。
681デフォルトの名無しさん
2020/05/06(水) 11:15:03.91ID:lE4/XlkX >>680
マルチCPUなどの場合は、キャッシュの同期(?)も関係してくるので、
そもそも何を持って「atomic」かどうかということが疑問になってきます。
キャッシュの内側で、CPUが、atomicにキャッシュに書きこんだつもりで
あっても、他の CPU のキャッシュに反映されない可能性があるので意味が
ないように思えます。
となれば、キャッシュ制御まで含めて考えないといけません。
キャッシュも、1次キャッシュ、2次キャッシュ、データ用キャッシュ、
コード用キャッシュ、パイプライン、などものすごく複雑になっているので、
果たしてそういうようなものを含めて「atomic」という言葉ですべてを語ることが
出来るのかどうかも疑問です。
マルチCPUなどの場合は、キャッシュの同期(?)も関係してくるので、
そもそも何を持って「atomic」かどうかということが疑問になってきます。
キャッシュの内側で、CPUが、atomicにキャッシュに書きこんだつもりで
あっても、他の CPU のキャッシュに反映されない可能性があるので意味が
ないように思えます。
となれば、キャッシュ制御まで含めて考えないといけません。
キャッシュも、1次キャッシュ、2次キャッシュ、データ用キャッシュ、
コード用キャッシュ、パイプライン、などものすごく複雑になっているので、
果たしてそういうようなものを含めて「atomic」という言葉ですべてを語ることが
出来るのかどうかも疑問です。
682デフォルトの名無しさん
2020/05/06(水) 11:18:02.52ID:q6Rk1GB6 自演かと思ったらレス繋いでるだけか
紛らわしい
紛らわしい
683はちみつ餃子 ◆8X2XSCHEME
2020/05/06(水) 11:26:57.76ID:exILxtx0684デフォルトの名無しさん
2020/05/06(水) 12:03:09.47ID:+O5RjP+P >>611の意味は
読み書きの途中で他のCPUやコア、スレッドが別の処理を行う事で一貫性が無くなる事は無いということ
例えばatomicでないと
64bitの一部を書き込んだところで
他のスレッドが値を読んでしまって
64bit全体としてあり得ない値になる
というような事が起こらない
というだけ
同期とか他の読み書きとの順番とか
そういう事はatomicは何も保証しない
読み書きの途中で他のCPUやコア、スレッドが別の処理を行う事で一貫性が無くなる事は無いということ
例えばatomicでないと
64bitの一部を書き込んだところで
他のスレッドが値を読んでしまって
64bit全体としてあり得ない値になる
というような事が起こらない
というだけ
同期とか他の読み書きとの順番とか
そういう事はatomicは何も保証しない
685はちみつ餃子 ◆8X2XSCHEME
2020/05/06(水) 12:24:44.67ID:exILxtx0 データベースとかで言う Atomicity と同じやね。
686デフォルトの名無しさん
2020/05/06(水) 14:18:32.19ID:lE4/XlkX687デフォルトの名無しさん
2020/05/06(水) 14:20:11.10ID:lE4/XlkX OSカーネルの実装以外では、命令自体の atomic 性に期待するのではなくて、
ちゃんと、OS が用意している API や system call を使って、CriticalSection
的なブロックを作って、その中で読み書きするのが基本ではないですかね。
ちゃんと、OS が用意している API や system call を使って、CriticalSection
的なブロックを作って、その中で読み書きするのが基本ではないですかね。
688デフォルトの名無しさん
2020/05/06(水) 14:25:21.35ID:E/8R3YZo689デフォルトの名無しさん
2020/05/06(水) 14:39:37.52ID:lE4/XlkX MotherBoard上にもキャッシュがありますし、マルチコアではなく、マルチCPUの
環境だと、いくらCPUがatomicに書いているつもりでも、バスでつながっている
他のCPUのキャッシュには反映されていない可能性もあるのではないでしょうか。
環境だと、いくらCPUがatomicに書いているつもりでも、バスでつながっている
他のCPUのキャッシュには反映されていない可能性もあるのではないでしょうか。
690デフォルトの名無しさん
2020/05/06(水) 14:47:57.71ID:E/8R3YZo691デフォルトの名無しさん
2020/05/06(水) 14:50:55.17ID:E/8R3YZo お前のバカなところはてめぇの無知を自覚せずに
atomicは不要というぶったぎり論を始めたところだ
もしいい年したおっさんなら芽がない
atomicは不要というぶったぎり論を始めたところだ
もしいい年したおっさんなら芽がない
693デフォルトの名無しさん
2020/05/06(水) 15:28:47.16ID:dxwAL6rC >>691
そんなに物知りなら、こんなところで聞かずにIntelマニュアルでも調べたら分かることじゃないか。
そんなに物知りなら、こんなところで聞かずにIntelマニュアルでも調べたら分かることじゃないか。
694デフォルトの名無しさん
2020/05/06(水) 15:32:15.22ID:dxwAL6rC はっきり言って、ここで double 値への書き込み atomic だなんて言ってる人の言うことはどこまで信用できるか分からん。
x86 CPU的には、xchg命令など一部の命令を除いてはそんなことは保障されてるかどうか定かではない。
x86 CPU的には、xchg命令など一部の命令を除いてはそんなことは保障されてるかどうか定かではない。
695デフォルトの名無しさん
2020/05/06(水) 15:40:04.68ID:g1nQsgpd696デフォルトの名無しさん
2020/05/06(水) 16:04:50.82ID:dxwAL6rC lock prefix は、mov 命令には付けられないがな。
697デフォルトの名無しさん
2020/05/06(水) 16:15:13.22ID:zSUZ9nVL データ競合と競合状態ごっちゃにしてない?
698デフォルトの名無しさん
2020/05/06(水) 16:36:19.56ID:DK2U3wBE アトミックはいわゆるout of thin airな値の発生を防ぐためのもの
それ以上でもそれ以下でもない
それ以上でもそれ以下でもない
699デフォルトの名無しさん
2020/05/06(水) 16:50:28.87ID:8YawtAIF std::atomic の意味付けとごっちゃになるから、「割り込み不可」「不可分」あたりと使い分けてほしいなぁ。
700デフォルトの名無しさん
2020/05/06(水) 17:03:54.41ID:dxwAL6rC もしかして、
double g_dbl[1024];
に対して、何かの値を足すような動作を、2つ以上のスレッドで
分担して行うことで高速化しようとしているのか?
そんなやり方は、マルチスレッドプログラミングでやっていいのだろうか。
普通は、要素番号 0〜511 までをスレッド1が、512〜1023 までをスレッド2
が計算して高速化する。
全く同じ場所に複数のスレッドが書きこむことは原則としてやらないはずだ。
double g_dbl[1024];
に対して、何かの値を足すような動作を、2つ以上のスレッドで
分担して行うことで高速化しようとしているのか?
そんなやり方は、マルチスレッドプログラミングでやっていいのだろうか。
普通は、要素番号 0〜511 までをスレッド1が、512〜1023 までをスレッド2
が計算して高速化する。
全く同じ場所に複数のスレッドが書きこむことは原則としてやらないはずだ。
701デフォルトの名無しさん
2020/05/06(水) 17:08:11.44ID:dxwAL6rC >>701
GPGPUを使ったレイトレーシングでも、画面上の別のピクセルをそれぞれのコアが
計算するのが原則で、1つのピクセルを複数のコアが分担して計算するには、それなりの
工夫がいる。
工夫というのは、途中までは別のワーキングエリアに書きこんでおいて、最後に
その結果を基本的にシングルコアで足し合わせて最終結果とするようなことだ。
これだと、例えば、途中の計算を double型で行うとしても、doubleへの書き込みが
atomicであることは特に必要ない。
GPGPUを使ったレイトレーシングでも、画面上の別のピクセルをそれぞれのコアが
計算するのが原則で、1つのピクセルを複数のコアが分担して計算するには、それなりの
工夫がいる。
工夫というのは、途中までは別のワーキングエリアに書きこんでおいて、最後に
その結果を基本的にシングルコアで足し合わせて最終結果とするようなことだ。
これだと、例えば、途中の計算を double型で行うとしても、doubleへの書き込みが
atomicであることは特に必要ない。
702デフォルトの名無しさん
2020/05/06(水) 17:11:26.13ID:E/8R3YZo703デフォルトの名無しさん
2020/05/06(水) 17:14:17.87ID:dxwAL6rC 気になったのは、「atomic」というコンピュータサイエンスで用いられている
言葉を >>611 のように実際のCPUで出来ているかどうか質問していること。
IntelのCPUマニュアルでは、atomicという言葉は使わずに、#LOCK PINアサート
が立つかどうかや、キャッシュコヒーレンシー、といった言葉で説明されている。
「atomic」という言葉は、キャッシュなどが「無いものとして分かり易く」
理解するには有効であるが、実際のCPUではキャッシュの一貫性や、PCIバス規格
と絡んだ詳細な説明が必要となる。
何を持って「atomic」というか、という問題が起きるからだ。
言葉を >>611 のように実際のCPUで出来ているかどうか質問していること。
IntelのCPUマニュアルでは、atomicという言葉は使わずに、#LOCK PINアサート
が立つかどうかや、キャッシュコヒーレンシー、といった言葉で説明されている。
「atomic」という言葉は、キャッシュなどが「無いものとして分かり易く」
理解するには有効であるが、実際のCPUではキャッシュの一貫性や、PCIバス規格
と絡んだ詳細な説明が必要となる。
何を持って「atomic」というか、という問題が起きるからだ。
704デフォルトの名無しさん
2020/05/06(水) 17:18:53.44ID:dxwAL6rC >>702
movも、実際のCPUでは必ずしもatomicとは限らない。
まず、alignment 境界を跨いででいるような場合や、
物理的に複数のCPUがマザーボード上にある場合のキャッシュの一貫性の問題が
あるから。
Intelの最適化マニュアルなどで、マルチコア並列化の例として上がってないような
方法は、勝手にやると破綻するかもしれない。
実機で実験してやるのは自由だが、他の人のCPUでは誤動作するのは覚悟した方がいい。
「アメリカ人は、書いてないものを勝手に使ったあなたが悪い」
という思想だぞ。
movも、実際のCPUでは必ずしもatomicとは限らない。
まず、alignment 境界を跨いででいるような場合や、
物理的に複数のCPUがマザーボード上にある場合のキャッシュの一貫性の問題が
あるから。
Intelの最適化マニュアルなどで、マルチコア並列化の例として上がってないような
方法は、勝手にやると破綻するかもしれない。
実機で実験してやるのは自由だが、他の人のCPUでは誤動作するのは覚悟した方がいい。
「アメリカ人は、書いてないものを勝手に使ったあなたが悪い」
という思想だぞ。
705デフォルトの名無しさん
2020/05/06(水) 17:31:25.73ID:E/8R3YZo >>704
マニュアルに安全な具体例として載ってないから疑ってるって話ね
ご自由にどうぞ
でもそれはあくまでお前の判断
メジャーコンパイラがintelのサポートうけてないとは思えないから
おれはコンパイラの出力眺めてみるけどね
マニュアルに安全な具体例として載ってないから疑ってるって話ね
ご自由にどうぞ
でもそれはあくまでお前の判断
メジャーコンパイラがintelのサポートうけてないとは思えないから
おれはコンパイラの出力眺めてみるけどね
706デフォルトの名無しさん
2020/05/06(水) 17:39:01.96ID:dxwAL6rC707デフォルトの名無しさん
2020/05/06(水) 17:49:26.97ID:+O5RjP+P708デフォルトの名無しさん
2020/05/06(水) 17:51:54.81ID:+O5RjP+P 色々な理由でやむを得ず使う上級者の技を
素人がまねしなくて良い
素人がまねしなくて良い
709デフォルトの名無しさん
2020/05/06(水) 17:57:11.74ID:E/8R3YZo >>706
ちなみにメジャーコンパイラが
std::atomic<double> & std::memory_order::relaxed
をどう展開するか知ってるんだよね?
これを疑ったらコンパイラを自作するしかないんでは?
ちなみにメジャーコンパイラが
std::atomic<double> & std::memory_order::relaxed
をどう展開するか知ってるんだよね?
これを疑ったらコンパイラを自作するしかないんでは?
710デフォルトの名無しさん
2020/05/06(水) 18:31:40.49ID:dxwAL6rC711デフォルトの名無しさん
2020/05/06(水) 18:56:13.77ID:E/8R3YZo712デフォルトの名無しさん
2020/05/06(水) 18:57:46.10ID:dxwAL6rC >>711
だったらそれでいいじゃない。
だったらそれでいいじゃない。
713デフォルトの名無しさん
2020/05/06(水) 19:17:44.45ID:E/8R3YZo714デフォルトの名無しさん
2020/05/06(水) 19:18:48.57ID:dlDgLyfe ちょっ(キャッシュの)一貫性とアトミック(なアクセス)は別概念なのでは…
後者はあくまで>>664の括弧内の意味
一貫性が保証されている単一キャッシュライン内のデータに対するアクセスでも
アトミックでないケースが理論上はありえる
後者はあくまで>>664の括弧内の意味
一貫性が保証されている単一キャッシュライン内のデータに対するアクセスでも
アトミックでないケースが理論上はありえる
715デフォルトの名無しさん
2020/05/06(水) 19:19:22.45ID:ZjhSP/3u なんで揉めてんだか訳わかんね
716デフォルトの名無しさん
2020/05/06(水) 19:21:46.08ID:dlDgLyfe つか同一キャッシュラインに乗っているからといって
配列アクセスは非アトミック、
配列アクセスは非アトミック、
717デフォルトの名無しさん
2020/05/06(水) 19:23:51.44ID:dlDgLyfe718デフォルトの名無しさん
2020/05/06(水) 19:44:30.16ID:6g3bWVkt C++でdoubleで同期取ろうとしてることすら意味不明なんだがキミたちは結局何がしたいんだい?
処理系依存するものはOSの同期を使えよ。
処理系依存するものはOSの同期を使えよ。
719デフォルトの名無しさん
2020/05/06(水) 19:47:35.61ID:S060FgXU720デフォルトの名無しさん
2020/05/06(水) 19:48:49.83ID:kak2WxQU 同期がめっちゃ遅いから困ってんだってよ
721デフォルトの名無しさん
2020/05/06(水) 19:55:48.41ID:6g3bWVkt 同期は遅くて当たり前だろ。
並列化したら速くなるとか同期コスト知らないIT音痴の妄想なんだから。
処理系依存していいならIntelのTSX試せよ。
並列化したら速くなるとか同期コスト知らないIT音痴の妄想なんだから。
処理系依存していいならIntelのTSX試せよ。
722デフォルトの名無しさん
2020/05/06(水) 19:58:00.21ID:DK2U3wBE 同期を速くするのは無理だぞ
高速化したければ同期を減らすんだぞ
高速化したければ同期を減らすんだぞ
723デフォルトの名無しさん
2020/05/06(水) 20:12:52.44ID:E/8R3YZo724843
2020/05/06(水) 21:51:51.19ID:U6CLxvSb Atomicの話と同期の話の区別も宜しくねw
725デフォルトの名無しさん
2020/05/06(水) 22:20:21.87ID:+O5RjP+P726デフォルトの名無しさん
2020/05/07(木) 00:01:22.08ID:hoUWiCnf 同期をとればatomicである必要はない
そういうことじゃないのか
そういうことじゃないのか
727デフォルトの名無しさん
2020/05/07(木) 00:24:54.15ID:N8w6+mz8 話をまとめるとこうなる。
・8byteの読み書き命令がatomicかどうかは処理系依存する話でC++の話ではない。スレチだが聞くならチップを指定して聞け。チップ仕様見れば答えは出る。議論の余地はない。
・8byteの読み書きを同期したい、atomicにしたい。OSの同期か適当な同期ライブラリ使え。悩む余地なし。
・atomicと同期は話は別だ →ありえないw ハードでatomic命令の実装に同期が必要だし、ソフトの同期処理の実装にCPUのatomic命令を使う。atomicの実装を知りたければVHDLスレにでも行け。
・馬鹿は同期を理解できない←30年前から言われてる名言。C++スレでdoubleがatomicかというアホ質問自体が証左。
・8byteの読み書き命令がatomicかどうかは処理系依存する話でC++の話ではない。スレチだが聞くならチップを指定して聞け。チップ仕様見れば答えは出る。議論の余地はない。
・8byteの読み書きを同期したい、atomicにしたい。OSの同期か適当な同期ライブラリ使え。悩む余地なし。
・atomicと同期は話は別だ →ありえないw ハードでatomic命令の実装に同期が必要だし、ソフトの同期処理の実装にCPUのatomic命令を使う。atomicの実装を知りたければVHDLスレにでも行け。
・馬鹿は同期を理解できない←30年前から言われてる名言。C++スレでdoubleがatomicかというアホ質問自体が証左。
728デフォルトの名無しさん
2020/05/07(木) 01:03:56.90ID:M+iqUPlL EOF
729デフォルトの名無しさん
2020/05/07(木) 01:11:02.02ID:0pZrsm5h >>719
なんだ、そこにそのまま書いてあるじゃない。
つまり、alignされているなら quadword は atomically に Read/Write できる。
キャッシュラインの中に納まっているなら align されてなくても OK、と。
8.1.1 Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that
the following basic memory operations will
always be carried out atomically:
・Reading or writing a byte
・Reading or writing a word aligned on a 16-bit boundary
・Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees that
the following additional memory operations will always be carried out
atomically:
・Reading or writing a quadword aligned on a 64-bit boundary 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee that the following additional memory operation will always be carried out atomically:
・Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line.
なんだ、そこにそのまま書いてあるじゃない。
つまり、alignされているなら quadword は atomically に Read/Write できる。
キャッシュラインの中に納まっているなら align されてなくても OK、と。
8.1.1 Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that
the following basic memory operations will
always be carried out atomically:
・Reading or writing a byte
・Reading or writing a word aligned on a 16-bit boundary
・Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees that
the following additional memory operations will always be carried out
atomically:
・Reading or writing a quadword aligned on a 64-bit boundary 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee that the following additional memory operation will always be carried out atomically:
・Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line.
730デフォルトの名無しさん
2020/05/07(木) 06:07:03.34ID:cLsDnrKi731デフォルトの名無しさん
2020/05/07(木) 06:35:21.80ID:N8w6+mz8 その486の話でいうと、当時、486は自己書き換えコードを駆逐した。Prefetchされたコードは非同期のまま実行されたからだ。Prefetchされたものはメモリではないと言い訳してもPGはそうは思ってないのだから高速なCPUだけ動かないコードがいっぱいあったわけだ。
結局、Intelが折れたのかPenから正しく同期されるようになった。TSXといいIntelも結構やらかしてるし、PICじゃ今でも同期エラッタてんこ盛り。MIPSの実装なんて言わずもがな。
結局、Intelが折れたのかPenから正しく同期されるようになった。TSXといいIntelも結構やらかしてるし、PICじゃ今でも同期エラッタてんこ盛り。MIPSの実装なんて言わずもがな。
732デフォルトの名無しさん
2020/05/07(木) 06:52:28.04ID:Xvq6sZ7Q 同期って用語の使い方に違和感があるなあ
734デフォルトの名無しさん
2020/05/07(木) 08:02:12.59ID:wkYaXeHy 8086時代は結構あった
古いコードのおもりをさせられた人は苦痛だったろうね
今よりはるかにパズルコードが多かったし
古いコードのおもりをさせられた人は苦痛だったろうね
今よりはるかにパズルコードが多かったし
735デフォルトの名無しさん
2020/05/07(木) 08:27:36.65ID:N8w6+mz8 >>730
atomic命令=排他制御(同期処理)された命令。同義。
doubleアクセスがatomicか知りたい=double値で同期したいと解釈するのは普通じゃないかな。
まぁatomicであろうとなかろうと、C/C++的にはOSの同期オブジェクト使えって結論になるわな。
マルチスレッドの再現性ないバグの99%は同期のおれおれ実装が原因だし。
atomic命令=排他制御(同期処理)された命令。同義。
doubleアクセスがatomicか知りたい=double値で同期したいと解釈するのは普通じゃないかな。
まぁatomicであろうとなかろうと、C/C++的にはOSの同期オブジェクト使えって結論になるわな。
マルチスレッドの再現性ないバグの99%は同期のおれおれ実装が原因だし。
736843
2020/05/07(木) 09:26:23.94ID:rgMcdocw アトミックと排他制御と同期処理って同じじゃねーぞ
doubleでアトミックと言うのは例えば
double d = 1.23;
…
d = 2.34;
ってやった時にdが1.23と2.34以外の値にならない事を言う
どっちの値になるかまでを保証するわけじゃない
doubleでアトミックと言うのは例えば
double d = 1.23;
…
d = 2.34;
ってやった時にdが1.23と2.34以外の値にならない事を言う
どっちの値になるかまでを保証するわけじゃない
737デフォルトの名無しさん
2020/05/07(木) 09:34:04.25ID:qJNaSSxu 何に基づいた主張なのかわからない
論拠も書くべき
論拠も書くべき
738デフォルトの名無しさん
2020/05/07(木) 09:50:51.36ID:N8w6+mz8739デフォルトの名無しさん
2020/05/07(木) 09:53:56.60ID:Uptrp4d8740843
2020/05/07(木) 10:01:49.95ID:EiluKhsY741デフォルトの名無しさん
2020/05/07(木) 10:21:20.74ID:N8w6+mz8 >>739
単発IDのくせにいなきり「お前」かよ。GWはほんと口の聞き方も知らないリアルクズ野郎ばかりだな。
おまえのような礼儀も知らず妄想しかできない低能クズに寛容なるおれ様が特別に教えてやろう。
違いますよ^^ 礼儀を知らない馬鹿は二度とおれにレスすんなw
単発IDのくせにいなきり「お前」かよ。GWはほんと口の聞き方も知らないリアルクズ野郎ばかりだな。
おまえのような礼儀も知らず妄想しかできない低能クズに寛容なるおれ様が特別に教えてやろう。
違いますよ^^ 礼儀を知らない馬鹿は二度とおれにレスすんなw
742デフォルトの名無しさん
2020/05/07(木) 10:32:16.12ID:PvsEcGe8 同期とアトミックと排他制御が同じとは
ヤバいのがいるなこのスレ
ソフトウェアの基礎を学んだ方が良い
ヤバいのがいるなこのスレ
ソフトウェアの基礎を学んだ方が良い
743デフォルトの名無しさん
2020/05/07(木) 10:36:17.88ID:0pZrsm5h 個人的に並列化処理といえば、例えば2coreの場合、
double buf[1024];
の内の、0-511 までを core1、512-1023 までを core2で処理するものだと思っていた。
atomicであるかどうかを気にしている人は、
buf[0] を core1とcore2で
[core1]
for(・・・) {
buf[0] += 1.0;
}
[core2]
for(・・・) {
buf[0] += 1.0;
}
みたいに同時に書きこみたいと思っているの????
でも、atomicというのは、書き込みのみ、または、読み込みのみ、のどちらかの
場合だと適用できるけど、↑のコードの場合、+= 演算子は、直前の値を読み取ってから、
1.0 を足して、同じ場所に書きこむ動作をするので、いくら、double値の書き込みが
atomicであっても、結果はめちゃくちゃになるよ。
double buf[1024];
の内の、0-511 までを core1、512-1023 までを core2で処理するものだと思っていた。
atomicであるかどうかを気にしている人は、
buf[0] を core1とcore2で
[core1]
for(・・・) {
buf[0] += 1.0;
}
[core2]
for(・・・) {
buf[0] += 1.0;
}
みたいに同時に書きこみたいと思っているの????
でも、atomicというのは、書き込みのみ、または、読み込みのみ、のどちらかの
場合だと適用できるけど、↑のコードの場合、+= 演算子は、直前の値を読み取ってから、
1.0 を足して、同じ場所に書きこむ動作をするので、いくら、double値の書き込みが
atomicであっても、結果はめちゃくちゃになるよ。
744デフォルトの名無しさん
2020/05/07(木) 10:45:35.17ID:Uptrp4d8 >>741
- std::atomicの使いどころを理解してない
- "OS"の同期プリミティブを使えと主張 (なぜOSと限定?)
この二つの条件を満たす別人が現れる確率は結構低いと思ったんでね
非礼の詫びとしてatomicの使いどころ知りたかったら教えてやるけどどう?
- std::atomicの使いどころを理解してない
- "OS"の同期プリミティブを使えと主張 (なぜOSと限定?)
この二つの条件を満たす別人が現れる確率は結構低いと思ったんでね
非礼の詫びとしてatomicの使いどころ知りたかったら教えてやるけどどう?
745デフォルトの名無しさん
2020/05/07(木) 10:50:13.38ID:Uptrp4d8746843
2020/05/07(木) 11:13:09.18ID:lQhGrp4h747デフォルトの名無しさん
2020/05/07(木) 11:20:48.41ID:Xvq6sZ7Q std::atomic<double>はoperator+=ないね
748デフォルトの名無しさん
2020/05/07(木) 12:09:28.57ID:0pZrsm5h749デフォルトの名無しさん
2020/05/07(木) 12:11:04.76ID:0pZrsm5h750843
2020/05/07(木) 12:17:56.15ID:FtlEpNqJ751デフォルトの名無しさん
2020/05/07(木) 12:53:58.73ID:N+2vUAWE752デフォルトの名無しさん
2020/05/07(木) 17:00:45.03ID:jqbAFx8V C++に限ったことじゃないかもしれないんですけど質問させてください
typedefで型に別名つけることについてです。今いじってるコードでたとえばvector<animal>にanimalsって型名をつけるようなのが山のようにあるんです
これすごくわかりにくいなと思います。例えばvector<animals>で宣言されてればその変数にどんな操作ができるのか一発ですが突然animalsで宣言されても何ができる型なのか初見では分かりません
別名をつけることがメリットになることってあるんでしょうか
typedefで型に別名つけることについてです。今いじってるコードでたとえばvector<animal>にanimalsって型名をつけるようなのが山のようにあるんです
これすごくわかりにくいなと思います。例えばvector<animals>で宣言されてればその変数にどんな操作ができるのか一発ですが突然animalsで宣言されても何ができる型なのか初見では分かりません
別名をつけることがメリットになることってあるんでしょうか
753デフォルトの名無しさん
2020/05/07(木) 17:14:48.12ID:8jv+kISL メリットは君が言ってる通り特定の言語に限った話では特定の回答は出て来ないし
言語を取り巻く環境(エディタや統合環境や諸々)でも答えは変わってくる
言語を取り巻く環境(エディタや統合環境や諸々)でも答えは変わってくる
>>752
using animals = std::vector<animal>;
わたしも、こういう typedef はしない方ですね、リッチなエディターを使っていないせいかもしれません
書いた人は別名を細かく付けた方がいいと考えているようですが、こういうのは記述の粒度の問題かもしれませんね
using animals = std::vector<animal>;
わたしも、こういう typedef はしない方ですね、リッチなエディターを使っていないせいかもしれません
書いた人は別名を細かく付けた方がいいと考えているようですが、こういうのは記述の粒度の問題かもしれませんね
755デフォルトの名無しさん
2020/05/07(木) 18:08:47.80ID:cLsDnrKi >>752
例えば後からvectorじゃなくてlistにしたいなーと思ったときに修正箇所が一箇所で済む
例えば後からvectorじゃなくてlistにしたいなーと思ったときに修正箇所が一箇所で済む
756デフォルトの名無しさん
2020/05/07(木) 18:14:03.65ID:V086WOzl テンプレートで使うからでは。
757デフォルトの名無しさん
2020/05/07(木) 18:29:01.78ID:0pZrsm5h >>752
書くのが簡単になり、見るのも分かり易くなることがある。
また、animal_s とちゃんと最後に複数形を現す「_s」を付けるという
自分なりの命名規則を付けておけば、vector<animal> のことである
こともすぐに分かる。
書くのが簡単になり、見るのも分かり易くなることがある。
また、animal_s とちゃんと最後に複数形を現す「_s」を付けるという
自分なりの命名規則を付けておけば、vector<animal> のことである
こともすぐに分かる。
758デフォルトの名無しさん
2020/05/07(木) 18:31:07.04ID:0pZrsm5h >>757
なお、型名は小文字ではなく、Animal か、CAnimal、TAnimal のようにするのが慣例。
vector<Animal> の場合、AnimalVector とすると、書くのも理解するのも楽になる。
templateのままをコード中に大量に書くとわずかな書き間違いで変な動作になりかねない。
なお、型名は小文字ではなく、Animal か、CAnimal、TAnimal のようにするのが慣例。
vector<Animal> の場合、AnimalVector とすると、書くのも理解するのも楽になる。
templateのままをコード中に大量に書くとわずかな書き間違いで変な動作になりかねない。
759デフォルトの名無しさん
2020/05/07(木) 18:36:04.65ID:0pZrsm5h >>758
templateは、C++の中でも最も複雑で、書き間違えたときのエラーが理解しにくい
とされる部分。
だから、vector<Animal>とコードのそこかしこに書きまくるのはお勧めしない。
それと、<や> は、キーボードの配置からして打ち込みにくいという事情もある。
指が届きにくい場所にあるというか。
また、vector<Animal
と> を書き損じたような場合、>を探してコンパイラが変な場所でエラーを出して
しまい、どこでエラーが始まったか探し出すのに苦労するようなこともある。
だから、このような「組み立てられた型」は、毎度毎度そのまま使うと痛い目に
遭う可能性があるので、animals と typedef した人は賢い。
templateは、C++の中でも最も複雑で、書き間違えたときのエラーが理解しにくい
とされる部分。
だから、vector<Animal>とコードのそこかしこに書きまくるのはお勧めしない。
それと、<や> は、キーボードの配置からして打ち込みにくいという事情もある。
指が届きにくい場所にあるというか。
また、vector<Animal
と> を書き損じたような場合、>を探してコンパイラが変な場所でエラーを出して
しまい、どこでエラーが始まったか探し出すのに苦労するようなこともある。
だから、このような「組み立てられた型」は、毎度毎度そのまま使うと痛い目に
遭う可能性があるので、animals と typedef した人は賢い。
760デフォルトの名無しさん
2020/05/07(木) 18:37:12.86ID:N8w6+mz8 >>744
レスするなと言ってるのにほんと人の話を聞いてないな。だから別人だって言ってるだろう。
std::atomicの使いどころってstd::atomicの話題に一度もレスしてないし、std::atomicの話を振られてもいない。
しかもOS限定とか妄想そのもの。
> OSの同期か適当な同期ライブラリ使え。悩む余地なし。
と最初に言ってる。逆にキミのその発言で、キミは今まで禄にコードを書いたことのない糞ガキの学生ということがよくわかったよ。
仮にOS提供の同期機構かstd::atomicかという選択であっても1nmもstd::atomicの選択余地はない。0%だ。
枯れてないライブラリは論外。同期バグはOr****やIntelでもやらかすし、枯れてるほうを使う。
何十年もカーネル開発者が注力し、コキ使われてきた実績のある同期コードを選ぶのがまともな社会人。
キミのような無責任な子供やテストしないOSSな人じゃないからね。OS提供がなくても同じ。
組み込み系ならチップメーカーが提供する同期ライブラリを使う。
レスするなと言ってるのにほんと人の話を聞いてないな。だから別人だって言ってるだろう。
std::atomicの使いどころってstd::atomicの話題に一度もレスしてないし、std::atomicの話を振られてもいない。
しかもOS限定とか妄想そのもの。
> OSの同期か適当な同期ライブラリ使え。悩む余地なし。
と最初に言ってる。逆にキミのその発言で、キミは今まで禄にコードを書いたことのない糞ガキの学生ということがよくわかったよ。
仮にOS提供の同期機構かstd::atomicかという選択であっても1nmもstd::atomicの選択余地はない。0%だ。
枯れてないライブラリは論外。同期バグはOr****やIntelでもやらかすし、枯れてるほうを使う。
何十年もカーネル開発者が注力し、コキ使われてきた実績のある同期コードを選ぶのがまともな社会人。
キミのような無責任な子供やテストしないOSSな人じゃないからね。OS提供がなくても同じ。
組み込み系ならチップメーカーが提供する同期ライブラリを使う。
761デフォルトの名無しさん
2020/05/07(木) 18:39:12.04ID:0pZrsm5h 命名規則は、animals よりも、
vector<animal> の時には、AnimalVector
list<animal>の時は、AnimalList
とするのがお勧め。
最後の s だけだと、見落とす可能性があることと、集合体であることだけは
分かっても、それが、どんな種類の集合体かまでは分からないため。
vector<animal> の時には、AnimalVector
list<animal>の時は、AnimalList
とするのがお勧め。
最後の s だけだと、見落とす可能性があることと、集合体であることだけは
分かっても、それが、どんな種類の集合体かまでは分からないため。
762デフォルトの名無しさん
2020/05/07(木) 18:42:48.91ID:0pZrsm5h もうひとつ、vector<animal> より、AnimalVector とした方がいい理由は、
正規表現検索する場合のため。
正規表現だと、< や > は何らかの meta 表現的な意味を持っている場合があるかも
知れないので、型名は単純な alphabet 列の方が何かと便利。
正規表現検索する場合のため。
正規表現だと、< や > は何らかの meta 表現的な意味を持っている場合があるかも
知れないので、型名は単純な alphabet 列の方が何かと便利。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 空自機レーダー照射、音声データ公開 中国 ★3 [蚤の市★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★] [蚤の市★]
- 津波警報の発表中にグーグル検索、AIが「すべて解除」と誤情報 [蚤の市★]
- 【YouTuber】バイク事故で入院のゆたぼん、振込で「お見舞金」募る [muffin★]
- 【テレビ】家入レオ 高校時代は親友なし 唯一の仲間が現在は超人気女優 「ずっとお互いに本を読んで」 [湛然★]
- 低所得層のマクドナルド離れが深刻に 広がる「ファストフード格差」の真相 米国 [少考さん★]
- 【実況】博衣こよりのえちえち朝活🧪
- 寒すぎてハゲたんやが
- 【悲報】婚活女子(38)「婚活パーティーに行ったら婚活男性の大部分が年収350万円身長165cm未満のコミュ障子供部屋おじさんで絶望してる… [257926174]
- ドドンドドンドンドン!世界一可愛いVtuberは誰だ!
- お前らって彼女がレイプされたら何て声かける?
- 朝からハイエースでカップラーメン食べてるドカタ
