2012-06-25 297 views
3

我有一個在OpenMP中非常並行的函數,當它從簡單的控制檯可執行文件啓動時,它會飽和機器的每個核心,並且在處理器數量上線性快速返回結果。如何強制在QThread中使用多核與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類可以如何利用多核,而不被約束到一個CPU中的pthread_set_affinity_np聲明。

+0

也許pthread_setaffinity_np阻止使用其他核心。你爲什麼需要這個電話? –

+0

這是代碼的一部分,我不想因爲不明原因而修改代碼......它不是我的... – linello

回答

4

按照pthread_setaffinity_np(3)手冊頁:

通過pthread_create(3)創建一個新的線程繼承其創建者的CPU關聯掩碼的副本。

您正在限制特定的MyComputationThread實例僅在單個內核上運行,因此也限制了由OpenMP運行時產生的所有線程也在同一個內核上運行。您應該刪除pthread_setaffinity_np()的呼叫,或者在之前將呼叫移至updateStateWithAParallelAlgorithm()設置親和力的部分。

+0

是的!這是解決方案,我在MainWindow類和mythread類中刪除了臭名昭着的代碼部分,現在該算法已正確並行化! – linello