2015-08-12 2 views
0

Я новичок в OpenMP. Я пытаюсь использовать OpenMP в моем коде на C++. Код слишком сложен, поэтому я упрощаю вопрос следующим образом:Использование OpenMP в классе C++

class CTet 
{ 
    ... 
    void cal_Mn(...); 
} 

int i, num_tet_phys; 
vector<CTet> tet_phys; 

num_tet_phys = ...; 
tet_phys.resize(num_tet_phys); 

#pragma omp parallel private(i) 
for (i = 0; i < num_tet_phys; i++) 
    tet_phys[i].cal_Mn(...); 

Я надеюсь, что цикл может работать параллельно, но это, кажется, что все потоки запустить весь цикл самостоятельно. Расчет повторяется каждым потоком. В чем проблема в моем коде? Как это исправить? Спасибо!

июня

+0

Вы компилировались с флагом '-fopenmp'? – Richard

ответ

1

Попробуйте

#pragma omp parallel for private(i) 
for (i = 0; i < num_tet_phys; i++) 
    tet_phys[i].cal_Mn(...); 

Обратите внимание на использование parallel for.

и скомпилировать с флагом -fopenmp.

#pragma omp parallel создает группу нитей, каждая из которых выполняет следующий оператор (в вашем случае - весь цикл цикла). После утверждения потоки соединяются обратно в один.

#pragma omp parallel for создает группу потоков, которые разделяют работу цикла for между ними.

+1

Также, вероятно, стоит отметить, что '#pragma omp parallel for' является коротким для' #pragma omp parallel', за которым следует '#pragma omp for'. – NoseKnowsAll

Смежные вопросы