gpt4 book ai didi

c++ - 使用 Visual Studio 2013 的 OpenMP 性能下降

转载 作者:行者123 更新时间:2023-11-30 03:51:09 28 4
gpt4 key购买 nike

我用 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);
}

但并行解决方案在测试时间上比后续解决方案慢

  • 时间:0 毫秒
  • 并行:25 毫秒!!!!

为什么会这样?

我使用的是 Visual Studio Ultimate 2013,我的电脑是 AMD A10-5745M

最佳答案

这里可能发生了两件事。

首先是您将 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 个内核,就没有必要。

关于c++ - 使用 Visual Studio 2013 的 OpenMP 性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31436558/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com