【问题标题】:Avoid thread creation overhead in open MP避免 openMP 中的线程创建开销
【发布时间】:2014-08-17 19:56:14
【问题描述】:

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

空函数() {

对于(...)

{

#pragma OMP parallel for private(....)

对于(...)

{

/// 做一些并行工作

} //内部for循环结束

//其他任务

} /// 外部for循环结束

} //函数结束

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

【问题讨论】:

  • 大多数 OpenMP 实现不会不断地创建和销毁线程,它们会启动线程池并根据需要使用它。空闲线程空闲,它们不会被销毁。您的实施可能有所不同;如果您担心,您可以将外循环包装在并行区域中,并且只并行化内循环。除了线程开销之外,还有很多很多原因可以解释并行代码的运行速度比串行代码慢。您没有提供足够的信息来正确诊断问题。

标签: multithreading openmp


【解决方案1】:

您可以使用单独的指令#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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2012-11-19
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多