問題タブ [setthreadaffinitymask]

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.

0 投票する
3 に答える
2706 参照

windows - SetThreadAffinityMask は無視されます....何かアイデアはありますか?

更新: 問題が見つかりました - 恥ずかしい/皮肉なことに、メインスレッドではなく、間違ったスレッドで SetThreadAffinity() を呼び出していました (プログラムの起動が面倒です...)

今はすべて機能しています。すべての助けに感謝します! 私の小さなデバッグセッションに参加するために、みんなに賛成票を投じました。

0 投票する
6 に答える
1620 参照

c++ - 現在のスレッドのスレッドアフィニティマスクの変更はどのような利点がありますか?

私はゲームエンジンを書いていますが、デバッグ用の現在のFPSを導出し、フレームレートを制限するための正確で正確な「デルタタイム」値を取得する方法が必要です(これは私たちのプロジェクトにとって重要です)。

少し調べてみると、これを行うための最良の方法の1つは、WinAPIのQueryPerformanceCounter関数を使用することです。フォワードカウンターの跳躍GetTicksCountを防ぐために使用する必要がありますが、それ自体はあまり正確ではありません。

ここでの問題QueryPerformanceCounterは、時間がワープバックした場合のように見える値を返す可能性があることです(つまり、呼び出しが過去の別の呼び出しよりも前の値を返す場合があります)。これは、特定のプロセッサコアで取得した値を別のプロセッサコアで取得した値と比較した場合にのみ発生します。これにより、この投稿を行う動機となった最終的な質問につながります。

  1. スレッドがすでに実行されている間にOSがスレッドを別のコアに「再割り当て」することはできますか、それともスレッドが特定のコアに割り当てられ、スレッドが終了するまでそれでしょうか。
  2. スレッドを再割り当てできない場合(少なくとも私にとっては非常に理にかなっています)、なぜ私が次のようなことを行うことができるのSetThreadAffinityMask(GetCurrentThread(),mask)ですか?Ogre3DはそのOgre::Timerクラス(Windows実装)でそれを行います、そして私はそれが時間を遡ることを避けるためであると仮定しています。しかし、それが真実であるためには、OSによってスレッドが1つのコアから別のコアに任意に移動される可能性を考慮する必要があります。これは、私にはかなり奇妙に思えます(理由はわかりません)。

今のところ知りたかったのはそれだけだったと思います。ありがとう。

0 投票する
5 に答える
32780 参照

java - Java スレッド アフィニティ

Javaプロセス内の個々のスレッドを特定のCPUコア(Linux上)にロックダウンする方法を知っている人はいますか? C でこれを実行しましたが、Java でこれを行う方法が見つかりません。私の直感では、これには JNI 呼び出しが必要ですが、ここにいる誰かが何らかの洞察を持っているか、以前にそれを行ったことがあるかもしれないことを望んでいました。

ありがとう!

0 投票する
1 に答える
2287 参照

linux - pthreads_setaffinity_np: 無効な引数?

私は自分の pthreads プログラムをある程度動作させることができました。基本的に、スレッド 1 が CPU 1 で実行され、スレッド 2 が CPU 2 で実行され、スレッド 3 が CPU 3 で実行され、スレッド 4 が CPU 4 で実行されるように、4 つのスレッドのアフィニティを手動で設定しようとしています。

コンパイル後、コードはいくつかのスレッドで機能しますが、他のスレッドでは機能しません (スレッド 1 は機能しないようです) が、同じコンパイル済みプログラムを数回実行すると、異なる結果が得られます。

例:
hao@Gorax:~/Desktop$ ./a.out
スレッド 3 は CPU 3 で実行されています
pthread_setaffinity_np: 無効な引数
スレッド スレッド 2 は CPU 2 で実行されています
hao@Gorax:~/Desktop$ ./a.out
スレッド 2は CPU 2 で実行されています
pthread_setaffinity_np: 無効な引数
pthread_setaffinity_np: 無効な引数
スレッド 3 は CPU 3 で実行されています
スレッド 3 は CPU 3 で実行されています
hao@Gorax:~/Desktop$ ./a.out
スレッド 2 は CPU 2 で実行されています
pthread_setaffinity_np: 無効です引数
スレッド 4 は CPU 4 で実行されています スレッド 4 は CPU
4 で実行されています
hao@Gorax:~/Desktop$ ./a.out
pthread_setaffinity_np: 無効な引数

私の質問は、「なぜこれが起こるのですか? また、メッセージが 2 回出力されることがあるのはなぜですか?」

コードは次のとおりです。

0 投票する
1 に答える
618 参照

c# - performanceCounter の NextValue 呼び出しがスレッド アフィニティ マスクを変更するのはなぜですか

私は C# プロジェクトを持っています。このプロジェクトでは、プロセッサの現在のワークロードにアクセスし、プロセッサのすべてのカーネルで特定のコードを実行する必要があります。私の問題は、プロセッサのワークロードにアクセスすると、スレッド アフィニティ マスクを正しく割り当てることができないように見えることです。問題を説明するコードがいくつかあります。

このコードを実行すると、次の出力が得られます。

そのため、cpuUsage.NextValue 呼び出しは何らかの形でスレッド アフィニティ マスクを変更し、マスクを 1 に変更することも不可能にします。Nextvalue 呼び出しが何らかの方法でスレッド アフィニティ マスクと対話する必要があることは理にかなっています、各カーネルからパフォーマンス カウントを集計しているが、スレッド アフィニティ マスクの今後の変更に影響する理由が理解できない場合。この問題の説明や回避策はありますか?

0 投票する
2 に答える
481 参照

c++ - SethreadAffinityMask() 正しい使い方?

私は 1500 のスレッドを持っています..12 のプロセッサで実行したいです SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors)). ここで、numprocessors=12 です。マスクの正しい使い方ですか?スケーラブルである必要があります。つまり、11 プロセッサのみで実行する場合は SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));、numprocessors=11 になります。

0 投票する
1 に答える
787 参照

c++ - Pthread_setaffinity_np無効な引数

開始ルーチン内の各スレッドのアフィニティを変更しようとしています。

これがコードです。以下のコードでは、「t」はpthread_create関数を介して渡される引数です。

スレッドアフィニティは変更されていません。どこが間違っているのですか?

0 投票する
1 に答える
2057 参照

c++ - Windows SetThreadAffinityMask は効果がありません

Windows API 呼び出し SetThreadAffinityMask を使用してスレッドを 1 つの NUMA ノードにロックする小さなテスト プログラムを作成しました。GetNumaNodeProcessorMask API 呼び出しでノードの CPU ビットマスクを取得し、そのビットマスクを GetCurrentThread によって返されたスレッド ハンドルと共に SetThreadAffinityMask に渡します。これが私のコードの大幅に簡略化されたバージョンです:

もちろん、コード内で API 呼び出しが 0 を返すかどうかを確認します。また、NUMA ノード マスクも出力しましたが、これはまさに期待どおりです。また、他の場所で提供されたアドバイスに従い、SetThreadAffinityMask への 2 回目の同一の呼び出しによって返されたマスクを出力しました。これはノード マスクと一致します。

ただし、DoWork 関数の実行時にリソース モニターを監視すると、表面上はバインドされているコアだけでなく、すべてのコアに作業が分割されます。SetThreadAffinityMask を使用しているときに見逃した可能性のあるトリップアップはありますか? 私は Windows 7 Professional 64 ビットを実行しており、DoWork 関数には OpenMP で並列化されたループが含まれており、3 つの非常に大きな配列の要素に対して操作を実行します (結合してもノードに収まります)。

編集: David Schwartz の回答を拡張するために、Windows では、OpenMP で生成されたスレッドは、それらを生成したスレッドのアフィニティを継承しません。問題は、SetThreadAffinityMask ではなく、それにあります。

0 投票する
1 に答える
892 参照

mysql - MySQLで使用されるコアの数を制限する

Linuxでは、MySQLが1つのコアを解放することを保証できますか?

(同じボックスで実行されているMySQLに負荷がかかっていると、応答しなくなる可能性のある小さなPythonサーバーがあります。)

0 投票する
1 に答える
1420 参照

c++ - Windows.hスレッドアフィニティ

以下のコードは、出力が期待どおりでないことを除いて、コンパイルおよび実行されます。プログラムにn個のスレッドを作成し(使用可能なマルチコアの数に応じて)、プログラムの最後にある簡単なルーチンを実行して出力するようにしたかったのです。

「テスト:」

1〜10の数字が続きます。代わりに私が得るのは、いくつかの数値を書き込む出力ですが、最大で2つを超えることはなく、関数threadmainは1つのスレッドで完全に実行されていないようですが、他のスレッドではテストを出力します:012。マルチスレッドが出力を壊してしまうことは知っていますが、画面のどこかに3,4,5,6,7,8,9の数字が表示されるはずですが、表示されません。