在open MP中避免线程创建开销

时间:2014-08-17 19:56:15

标签: multithreading openmp

我使用open MP来并行化HEVC中的部分代码。代码的基本结构如下所示

虚空功能() {

有(...)

{

#pragma OMP并行私有(....)

for(...)

{

///做一些并行工作

} //内部循环结束

//其他任务

} ///外部for循环结束

} //功能结束

现在我修改了内部for循环,以便代码并行化,每个线程独立执行任务。我没有收到任何错误,但是使用多个线程的整体处理时间比使用单线程所需的时间长。我猜主要原因是对于外循环的每次迭代都存在内部循环的线程创建开销。有没有办法避免这个问题或任何方式我们只能创建一次线程。我无法并行化外部for循环,因为我已经在内部for循环中进行了修改,以使每个线程能够独立工作。请建议任何可能的解决方案

1 个答案:

答案 0 :(得分:0)

您可以使用单独的指令#pragma omp parallel#pragma omp for

#pragma omp parallel创建并行线程,而#pragma omp for在线程之间分配工作。对于外循环的连续部分,您可以使用#pragma omp single

以下是一个例子:

int n = 3, m = 10;
#pragma omp parallel
{
    for (int i = 0; i < n; i++){
        #pragma omp single
        {
            printf("Outer loop part 1, thread num = %d\n", 
                    omp_get_thread_num());
        }
        #pragma omp for
        for(int j = 0; j < m; j++) {
            int thread_num = omp_get_thread_num();
            printf("j = %d, Thread num = %d\n", j, thread_num);
        }
        #pragma omp single
        {
            printf("Outer loop part 2, thread num = %d\n", 
                    omp_get_thread_num());
        }
    }
}

但我不确定它会对你有所帮助。要诊断OpenMP性能问题,最好使用某些分析器,例如ScalascaVTune