問題タブ [compare-and-swap]
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.
cuda - CUDAで条件付きの複数の変数にatomicCASを使用する方法
最近、プログラミングで単純な概念に遭遇しましたが、それを cuda に実装しようとすると行き詰まりました。何千もの要素があり、それらの間で最も近いペアを見つけたいとします。私atomicMIN
はグローバルメモリで使用します(縮小したくないと仮定します)ので、各スレッドによって計算された距離がグローバル変数に格納されている距離よりも小さい場合、atomicCAS はそれをより小さい値に置き換えます。たとえば、私はグローバル変数を持っていますfloat gbl_min_dist
これを行うには、次のコードを使用します。
ここで、互いに接近していて、が古い最小距離をそれらの 2 つのポイントによって計算された距離に正常に置き換えた2 つのポイントのインデックスを保存したいとします。atomicMIN
つまり、グローバル変数で距離が正常にスワップされた場合にのみ、現在距離が小さい2つのポイントのインデックスのみを保存したいということです
したがって、ここで、スレッドが を実行するときに、atomicMIN
比較対象のスレッドによって提案された値が でスワップされるgbl_min_dist
場合、p1、p2 もスレッドからの値とスワップする必要があります。がスワップされていない場合、gbl_min_dist
ポイントを保存したくありません。これにより、間違ったポイントが得られますが、最小距離は正しくなります。
atomicCAS
スワップが行われたかどうかを確認する戻り値はありますか?
内でこれを実装する方法についてのアイデアはありatomicMIN
ますか?
前もって感謝します
atomic - CAS (アトミック) 操作が同期または揮発性操作よりも速いのはなぜですか
私が理解していることから、同期されたキーワードはローカルスレッドキャッシュをメインメモリと同期します。volatile キーワードは、基本的にアクセスのたびに常にメイン メモリから変数を読み取ります。もちろん、メイン メモリへのアクセスはローカル スレッド キャッシュよりもはるかにコストがかかるため、これらの操作にはコストがかかります。ただし、CAS 操作は低レベルのハードウェア操作を使用しますが、それでもメイン メモリにアクセスする必要があります。では、CAS 操作はどのように高速化されるのでしょうか?
java - BST 内の参照をアトミックに更新するための Java compareAndSet
二分木で、親の左の子を新しいノードにアトミックに置き換えようとしています。以下のメソッドでpnode.left
は、 は を指してnode
おり、 に変更しようとしていreplaceNode
ます。
In line1
はchildPtr
In line2を指している
In line3は In line3 を指しており、 to から toへアトミックに変更されています。pnode.left
oldChildPtr
pnode.left
childPtr
pnode.left
replaceNode
でもpnode.left
変わらない。これがJavaでの仕組みであることを理解しています。pnode.left
しかし、このコードをアトミックに に置き換えるにはどうすればよいでしょうかreplaceNode
。
mips - 32 ビット mips cmpxchg(cas) は 8 バイトをサポートしていますか?
みんな。ABAの問題を回避するために、ダブルワードを使用して32ビットミップでプログラムを書いています。しかし、32 ビット mips は Linux カーネル ソース コードで 8 バイトをサポートしていないようです。もしそうなら、8 バイト拡張子を知っている人はいますか? ABA の問題を回避する他の方法はありますか?
multithreading - C++11 std::compare_exchange_strong は、null ポインターと比較するとコンパイルされません
並列 avl ツリーに取り組んでいて、問題が発生しました。この問題を引き起こす関数は次のとおりです。
parent->left
タイプがあり、現在の値が null の場合にatomic<Node*>
そのポインターを設定したい。node
コンパイラはエラーを訴えます
これが有効なコードではないのはなぜですか?