3

我有一个在 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类如何利用多核,而不受pthread_set_affinity_np.

4

1 回答 1

4

根据pthread_setaffinity_np(3)手册页:

创建的新线程pthread_create(3)继承其创建者的 CPU 关联掩码的副本。

您将特定MyComputationThread实例限制为仅在单个内核上运行,因此也将 OpenMP 运行时产生的所有线程限制为也在同一内核上运行。您应该删除调用pthread_setaffinity_np()或将调用移至设置相关性的部分updateStateWithAParallelAlgorithm() 之前

于 2012-06-25T11:31:43.563 回答