这个问题是关于特定情况的线程亲和力。假设我们有以下代码。
int main(){
omp_set_num_threads(NTHREADS);
somestruct *array = (somestruct*)malloc(sizeof(somestruct) * NTHREADS);
#pragma omp parallel default(none) shared(array)
{
// each thread initializes their corresponding struct data
int tid = omp_get_thread_num();
initialize_struct(array, tid);
// ...
}
// some sequential computation
// ....
// ....
// parallel region again
#pragma omp parallel default(none) shared(array)
{
int tid = omp_get_thread_num();
// each thread does some computation on their corresponding struct
do_computation(array, tid);
}
return 0;
}
如上例所示,是否会在多个并行区域之间保留线程亲和性?换句话说,如果在映射到CPU0的core0的第一个并行区域tid0中,是否保证tid0将映射到第二个并行区域的CPU0的同一core0?
答案 0 :(得分:1)
是的。该规范要求所谓的" threadprivate持久性"这使得运行时在后续并行区域中重用相同的线程,如here所述:在某些条件下,threadprivate数据可以在活动的并行区域中持续存在:
只有满足以下所有条件时,才能保证非初始线程的threadprivate变量中的数据值保持在两个连续的活动并行区域之间:
•两个并行区域都没有嵌套在另一个显式并行区域内。
•用于执行两个并行区域的线程数相同。
•在两个平行区域的入口处,封闭任务区域中dyn-var内部控制变量的值为false。
如果这些条件都成立,并且两个区域中都引用了threadprivate变量,则各自区域中具有相同线程编号的线程将引用该变量的相同副本。