Multithreading 避免OpenMP中的线程创建开销

Multithreading 避免OpenMP中的线程创建开销,multithreading,openmp,Multithreading,Openmp,我正在使用OpenMP并行化HEVC中的一部分代码。代码的基本结构如下所示 无效函数() { 对于(…) { #pragma OMP并行专用(..) 对于(…) { ///做一些平行的工作 } //内循环结束 //其他任务 } ///外循环结束 } //功能结束 现在我修改了内部for循环,这样代码就可以并行化,每个线程都可以独立执行任务。我没有收到任何错误,但是多线程的总体处理时间比单线程的处理时间要长。我想主要原因是,对于外部循环的每次迭代,内部循环都有线程创建开销。是否有任何方法可以避免这

我正在使用OpenMP并行化HEVC中的一部分代码。代码的基本结构如下所示

无效函数() {

对于(…)

{

#pragma OMP并行专用(..)

对于(…)

{

///做一些平行的工作

} //内循环结束

//其他任务

} ///外循环结束

} //功能结束


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

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

#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());
        }
    }
}
int n=3,m=10;
#pragma-omp并行
{
对于(int i=0;i

但我不确定这对你是否有帮助。要诊断OpenMP性能问题,最好使用一些探查器,如或

大多数OpenMP实现不会不断创建和销毁线程,而是启动一个线程池,并根据需要使用它。空闲线程空闲时,它们不会被销毁。您的实现可能不同;如果你担心的话,你可以将外环包裹在平行区域,而只将内环平行。除了线程开销之外,还有很多其他原因可以解释并行代码比串行代码运行得慢。您没有提供足够的信息来正确诊断问题。