Multithreading 避免OpenMP中的线程创建开销
我正在使用OpenMP并行化HEVC中的一部分代码。代码的基本结构如下所示 无效函数() { 对于(…) { #pragma OMP并行专用(..) 对于(…) { ///做一些平行的工作 } //内循环结束 //其他任务 } ///外循环结束 } //功能结束Multithreading 避免OpenMP中的线程创建开销,multithreading,openmp,Multithreading,Openmp,我正在使用OpenMP并行化HEVC中的一部分代码。代码的基本结构如下所示 无效函数() { 对于(…) { #pragma OMP并行专用(..) 对于(…) { ///做一些平行的工作 } //内循环结束 //其他任务 } ///外循环结束 } //功能结束 现在我修改了内部for循环,这样代码就可以并行化,每个线程都可以独立执行任务。我没有收到任何错误,但是多线程的总体处理时间比单线程的处理时间要长。我想主要原因是,对于外部循环的每次迭代,内部循环都有线程创建开销。是否有任何方法可以避免这
现在我修改了内部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实现不会不断创建和销毁线程,而是启动一个线程池,并根据需要使用它。空闲线程空闲时,它们不会被销毁。您的实现可能不同;如果你担心的话,你可以将外环包裹在平行区域,而只将内环平行。除了线程开销之外,还有很多其他原因可以解释并行代码比串行代码运行得慢。您没有提供足够的信息来正确诊断问题。