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
相关产品推荐
相关产品推荐

