Парализуйте с OpenMP с учетом топологии процессора - PullRequest
0 голосов
/ 13 января 2019

Я написал простой фрагмент кода, где рабочая нагрузка сильно отличается для каждого потока. Некоторым потокам нужно вычислить несколько сотен итераций, а другим потокам нужно сделать всего одну итерацию, чтобы получить желаемый результат:

for(int i=0; i<height; i++){
    for(int j=0; j<width; j++){
        complex<float> c((float)j/width-1.5,(float)i/height-0.5);
        complex<float> z(0, 0);

        int count =0;
        while(abs (z) < 2 && count < MAX_IT){
            z=z*z + c; 
            ++count; 
        }
        image[i][j]=count;
    }
}

С lscpu Я проверяю, сколько ядер, потоков на ядро ​​и Pros Socket доступно. Теперь я хочу парализовать этот фрагмент с помощью OpenMP, осведомленного о топологии процессора.

Существует возможность определять переменные окружения, такие как

OMP_PLACES='threads(12)
OMP_PLACES='cores(4)'
OMP_PLACES='sockets(2)'

А есть возможность привязки процессора, как

#pragma omp parallel proc_bind(master|close|spread)

Я не могу понять, как правильно их использовать (просто с пробой и ошибкой). У кого-нибудь здесь есть опыт?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...