Я написал простой фрагмент кода, где рабочая нагрузка сильно отличается для каждого потока. Некоторым потокам нужно вычислить несколько сотен итераций, а другим потокам нужно сделать всего одну итерацию, чтобы получить желаемый результат:
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)
Я не могу понять, как правильно их использовать (просто с пробой и ошибкой). У кого-нибудь здесь есть опыт?
Спасибо