gpt4 book ai didi

c++ - 为什么 OpenMP 在这种情况下很慢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:28 24 4
gpt4 key购买 nike

我试图理解为什么 OpenMP 以其在以下示例中的方式工作。

#include <omp.h>
#include <iostream>
#include <vector>
#include <stdlib.h>

void AddVectors (std::vector< double >& v1,
std::vector< double >& v2) {

size_t i;

#pragma omp parallel for private(i)
for (i = 0; i < v1.size(); i++) v1[i] += v2[i];

}


int main (int argc, char** argv) {

size_t N1 = atoi(argv[1]);

std::vector< double > v1(N1,1);
std::vector< double > v2(N1,2);

for (size_t i = 0; i < N1; i++) AddVectors(v1,v2);

return 0;

}

我首先在没有启用 OpenMP 的情况下编译了上面的代码(通过省略编译标志上的 -fopenmp)。 N1 = 10000 的执行时间为 0.1 秒。启用 OpenMP 会使执行时间超过 1 分钟。我在它完成之前就停止了它(厌倦了等待...)。

我正在编译如下代码:

g++ -std=c++0x -O3 -funroll-loops -march=core2 -fomit-frame-pointer -Wall -fno-strict-aliasing -o main.o -c main.cpp

g++ main.o -o main

并非所有这些标志在这里都是必需的,但我在我尝试并行化的项目中使用了它们,并且我在那里使用了这些标志。这就是为什么我决定把它们留在这里。此外,我添加了 -fopenmp 以在编译时启用 OpenMP。

有人知道怎么回事吗?谢谢!

最佳答案

我在 Visual Studio 2008 上尝试过相同的示例。我对您的代码示例进行了两次修改,使用 OpenMP 时它的运行速度比不使用 OpenMP 时快大约 3 倍。

无法在 GCC 上确认,问题可能出在调用函数 AddVectors 的主循环中,并且每次它都必须执行“fork”操作,这将花费一些可测量的时间。因此,如果您有 N1 = 10000,它必须产生 10000 个“fork”操作。

我附上了你自己的代码片段,只是为了让它在 Visual Studio 下工作而修改的,我在最后添加了一条打印语句,以避免编译器删除所有代码。

#include <omp.h>
#include <iostream>
#include <vector>
#include <stdlib.h>

void AddVectors (std::vector< double >& v1,
std::vector< double >& v2) {

#pragma omp parallel for
for (int i = 0; i < static_cast<int>(v1.size()); i++) v1[i] += v2[i];

}


int main (int argc, char** argv) {

size_t N1 = atoi(argv[1]);

std::vector< double > v1(N1,1);
std::vector< double > v2(N1,2);

for (size_t i = 0; i < N1; i++) AddVectors(v1,v2);


printf("%g\n",v1[0]);
return 0;

}

关于c++ - 为什么 OpenMP 在这种情况下很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397004/

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