使用 Visual Studio 2013 降低 OpenMP 的性能
Posted
技术标签:
【中文标题】使用 Visual Studio 2013 降低 OpenMP 的性能【英文标题】:Performance decrease in OpenMP with Visual Studio 2013 【发布时间】:2015-07-15 16:57:54 【问题描述】:我用 VisualStudio 2013 编写了一个 openmp 的基本示例,该示例是曲线下面积的计算。这是安全实现
int integral(int a, int b, int n_intervalos, int(*function)(int))
int long_interv = (b - a) / n_intervalos;
int suma = 0;
for (int i = a; i < b; i+=long_interv)
int h = function(i);
suma += h * long_interv;
return suma;
当我去测试这段代码时,我使用这个数据集
int intg = integral(0, 120, 120, funcion);
我想使用 OpenMP 来提高性能然后我做了以下功能
void integralParalelo(int a, int b, int n_intervalos, int(*function)(int), int *area)
int max_threads = omp_get_max_threads();
int thread_id = omp_get_thread_num();
int sub_intervalo = n_intervalos / max_threads;
int long_interv = (a + b) / n_intervalos;
int ini = thread_id * long_interv * sub_intervalo;
int fin = sub_intervalo * long_interv + ini;
int suma = integral(ini, fin, sub_intervalo, function);
#pragma omp critical
(*area) = (*area) + suma;
我就是这样调用这个函数的
#pragma omp parallel num_threads(4)
integralParalelo(0, 120, 120, funcion, &area);
但在测试中并行解决方案比安全解决方案要慢
secuencial:0 毫秒 并行:25 毫秒!!!!为什么会这样?
我使用的是 Visual Studio Ultimate 2013,我的电脑是 AMD A10-5745M
【问题讨论】:
很难超过“0毫秒”;) jajaja,这是真的,但我预计 0 毫秒 【参考方案1】:这里可能发生了两件事。
首先,您将 OpenMP 视为不必要的 MPI。在您的情况下,您真正应该做的就是并行化您的 for 循环并记住为您的 suma
变量执行归约。您自己调用 OpenMP 例程并拆分域的方式在我看来更像是 MPI 代码。
其次,您正在处理的数据集太小。您真正需要做的是在串行代码中花费 60 多秒时对此进行测试,然后将时间与使用 4 个处理器的 OpenMP 运行进行比较。请记住,创建线程团队需要时间,如果每个线程只做很少的工作,那么您的大部分时间将花在启动上。
因为你在 for 循环中做的实际工作很少,我怀疑你不会在 4 个内核上获得超过 2-3 倍的性能。
我建议这样做:
int integralParallel(int a, int b, int n_intervalos, int(*function)(int))
int long_interv = (b - a) / n_intervalos;
int suma = 0;
#pragma omp parallel for default(shared) reduction(+:suma)
for (int i = a; i < b; i+=long_interv)
int h = function(i);
suma += h * long_interv;
return suma;
并像调用序列号一样调用它。如果您愿意,请指定 num_threads(4)
,但只要 OpenMP 支持您的 4 个内核,就没有必要这样做。
【讨论】:
当我增加数据集时,并行程序胜过 secuencial,但我有另一个例子(mergesort 问题),在 Visual Studio 中我做什么并不重要,secuencial 比并行好,但是当我在 linux 中用 eclipse 而不是 windows 用 Visual Studio 运行程序,并行胜过有人告诉我的 secuencial,这是因为 Visual Studio 不使用真机的内核,但我在任何网站都找不到这种解释。 Mergesort 是一种非常不同的算法,由于其递归性质,它不太适合 OpenMP。您可以使用 OpenMP 任务执行此操作,但它的性能不会是最佳的。同样,正如我在回答中所说,如果每个线程只做很少的工作,那么您永远不会获得出色的性能,因为与实际计算相比,线程初始化/控制花费了太多时间。 好吧,如果每个线程都没有足够的工作,我无法注意到差异,但是,当我使用 Linux 而不是 Windows 时,我可以注意到差异,使用相同的数据集差异这个操作系统之间的性能是巨大的。以上是关于使用 Visual Studio 2013 降低 OpenMP 的性能的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Visual Studio 2013或Visual Studio 2017设置TFS 2013
使用Visual Studio2013打开Visual Studio2015项目
从 Visual Studio 2013 转换到 Visual Studio 2015 的问题
Visual Studio Express 2013 或 Visual Studio Pro 2010
使用平台工具集 v120 (Visual Studio 2013) 在 Visual Studio 2015 中创建 C++/CLI 项目