You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenMP并行初始化代码未有效提升执行时间的问题求助

OpenMP并行初始化代码未有效提升执行时间的问题求助

我最近在做OpenMP并行化的相关测试,遇到了一个挺困惑的问题,先给大家看看我的测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <limits.h>

#define NUM_VERTICES 1024

int distance[NUM_VERTICES];
int shortestPathTree[NUM_VERTICES];
int predecessor[NUM_VERTICES];

int main(void) 
{
    int i;

    double start_time = omp_get_wtime();

    #pragma omp parallel for num_threads(3)
    for (i = 0; i < NUM_VERTICES; ++i) {
        distance[i] = INT_MAX;
        shortestPathTree[i] = 0;
        predecessor[i] = -1;
    }

    double end_time = omp_get_wtime();
    double iteration_time = end_time - start_time;

    printf("Execution time: %f seconds\n", iteration_time);

    return 0; 
}

这是我目前写的最贴合需求的版本,除此之外我还试过各种调整:比如改用sections指令、测试不同的调度策略,甚至还加过打印语句(现在已经注释掉了)来观察每个线程的运行行为。不过我发现一个奇怪的现象:当线程2启动后,它会一直处理从30开始的迭代,完全不给其他线程打印的机会,就好像它拿到资源之后就不肯释放了一样。

我已经在这个问题上卡了三天了,各种方法都试过,但就是没找到原因。更让我头疼的是,接下来我要实现Dijkstra算法,查资料说这个算法的最优线程数是5个,看起来我的机器是支持并行化的,但在当前这个数组初始化的任务上就是表现不稳定。

下面是我测试不同线程数得到的执行时间结果:

  • 单线程与2线程:均为0.000142秒
  • 单线程与3线程:均为0.000129秒
  • 单线程与4线程:均为0.000120秒

能看出来一开始线程数增加的时候,执行时间确实会下降,但到某个点之后再增加线程就没什么优化效果了,甚至还会反向上升:

  • 单线程与5线程:均为0.000115秒
  • 单线程与6线程:均为0.000121秒

所以我的机器明明能并行化,但在这个初始化步骤上,单线程反而表现最好,这到底是哪里出问题了?

备注:内容来源于stack exchange,提问作者user28302579

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:40:29