2012-06-25 2 views
3

У меня есть функция, которая очень распараллеливается в OpenMP, при запуске с простой исполняемой консоли она насыщает каждое ядро ​​машины и возвращает результат линейно быстрее в количестве процессоров.Как принудительно использовать многоядерность в QThread с функцией OpenMP

void updateStateWithAParallelAlgorithm() 
{ 
    #pragma omp parallel for 
    { 
    // do parallel things, update positions of particles in a physics simulation 
    } 
} 

Теперь эта функция также используется внутри QThread в моей программе Qt. Проблема в том, что я должен обновлять позиции экрана частиц каждый после вызова функции updateStateWithAParallelAlgorithm().

При запуске в моей основной программе Qt я не вижу улучшения в скорости алгоритма, и 8 ядер моего процессора не являются насыщенными.

Я бы предпочел, чтобы на графике использования ЦП я видел поведение максимальной паузы, но этого не происходит.

Теперь я даю вам больше информации.

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.

+0

Возможно, pthread_setaffinity_np предотвращает использование дополнительных ядер. Зачем вам этот звонок? –

+0

Это было частью кода, который я не хотел изменять по неясным причинам ... это не мое ... – linello

ответ

4

Согласно странице pthread_setaffinity_np(3) вручную:

новый поток, созданный pthread_create(3) наследует копию сродства CPU маску своего создателя.

Вы ограничиваете конкретный экземпляр MyComputationThread для запуска на одном ядре только и, таким образом, также ограничивающего все темы порождены OpenMP во время выполнения также работать на одном ядре. Вы должны либо удалить звонок до pthread_setaffinity_np(), либо перевести вызов на updateStateWithAParallelAlgorithm()до, который устанавливает сродство.

+0

Да! Это решение, я удалил эту позорную часть кода как в классе MainWindow, так и в мифическом классе, теперь алгоритм распараллелен правильно! – linello