OpenMP で非常に並列化された関数があります。単純なコンソール実行可能ファイルから起動すると、マシンのすべてのコアが飽和し、プロセッサの数が直線的に速くなり、結果が返されます。
void updateStateWithAParallelAlgorithm()
{
#pragma omp parallel for
{
// do parallel things, update positions of particles in a physics simulation
}
}
現在、この関数は Qt プログラムの QThread 内でも使用されています。updateStateWithAParallelAlgorithm()
問題は、関数の呼び出しのたびにパーティクルの画面位置を更新する必要があることです。
Qt のメイン プログラム内で起動すると、アルゴリズムの速度は向上せず、プロセッサの 8 コアは飽和していません。
CPU 使用率のグラフにピーク一時停止の動作が表示されるはずだと思いますが、これは起こりません。
今、私はあなたにもっと多くの情報を与えています。
class MyComputationThread : public QThread
{
Q_OBJECT
// some methods
// some variables
void doComputation()
{
this->setPriority(QThread::HighestPriority);
#ifdef Q_WS_X11
int s;
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(1, &cpuset);
s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
if (s != 0) {
perror("pthread_getaffinity_np");
}
#endif
updateStateWithAParallelAlgorithm();
}
}
MyComputationThread
のステートメントのように 1 つの CPU のみに制約されることなく、私のスレッド クラスがマルチコアをどのように利用できるかを理解したいと思いますpthread_set_affinity_np
。