Как установить количество ядер ЦП, участвующих в расчете (C ++ и OpenMP) - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь вычислить Pi в Qt5, используя C ++ и OpenMP (с акцентом на предложение сокращения данных). В этой программе я предоставляю точность вычислений и количество задействованных ядер ЦП.

Пока у меня есть следующий код:

    int num_steps= ui->numberStepsLineEdit->text().toInt();
    double x=0.0;
    double sum = 0.0;
    #pragma omp parallel private(i,x)
    {
        #pragma omp for reduction(+:sum) schedule(static)
        for (int i=0; i<num_steps; i++)
        {
             x=(i+0.5)/(double)num_steps;
             sum = sum + 4.0/(1.0+x*x);
        }
     }
     double pi=sum/(double)num_steps;
     QString result= QString::number(pi, 'g', 10);
     ui->piLabel->setText(result);

Проблема в том, что мне нужно указать количество ядер ЦП, участвующих в расчете, и я искал в Интернете примеры безуспешно.

Как установить количество ядер процессора, участвующих в расчете? (Я не хочу устанавливать количество потоков).

Заранее большое спасибо.

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Способ, которым вы можете эмулировать то, что вы запрашиваете, состоит в том, чтобы установить желаемое количество ядер в виде количества потоков в коде OpenMP с помощью предложения num_threads () или вызова API omp_set_num_threads (). Затем используйте переменные среды OMP_PROC_BIND и OMP_PLACES, чтобы управлять отображением потоков на желаемое количество ядер.

Так, например, если вы хотите использовать только четыре ядра системы, вы должны сделать это:

#pragma omp parallel num_threads(4)
{
    // your parallel code 
}

$> OMP_PLACES=cores(4) OMP_PROC_BIND=compact ./a.out
0 голосов
/ 15 мая 2019

С OpenMP вы устанавливаете количество потоков, а ОС привязывает их к ядрам.См. Также: Отображение потоков OpenMP на физические ядра

...