OpenMP线程通过多个并行区域

时间:2015-08-10 14:16:04

标签: c++ parallel-processing openmp

这个问题是关于特定情况的线程亲和力。假设我们有以下代码。

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?

1 个答案:

答案 0 :(得分:1)

的。该规范要求所谓的" threadprivate持久性"这使得运行时在后续并行区域中重用相同的线程,如here所述:在某些条件下,threadprivate数据可以在活动的并行区域中持续存在:

  

只有满足以下所有条件时,才能保证非初始线程的threadprivate变量中的数据值保持在两个连续的活动并行区域之间:

     

•两个并行区域都没有嵌套在另一个显式并行区域内。

     

•用于执行两个并行区域的线程数相同。

     

•在两个平行区域的入口处,封闭任务区域中dyn-var内部控制变量的值为false。

     

如果这些条件都成立,并且两个区域中都引用了threadprivate变量,则各自区域中具有相同线程编号的线程将引用该变量的相同副本。