C++ 如何在没有-fopenmp标志的情况下启用OpenMP?

C++ 如何在没有-fopenmp标志的情况下启用OpenMP?,c++,g++,openmp,intel,icc,C++,G++,Openmp,Intel,Icc,在一些在线评委平台上,代码的编译和运行方式如下: g++ -O3 -std=c++17 a.cpp ./a.out 我想使用OpenMp并行化我的代码,那么是否可以在不使用-fopenmp标志的情况下启用OpenMp #include <iostream> using namespace std; int main() { #pragma omp parallel for for (int i = 0; i < 100; i++) { std::c

在一些在线评委平台上,代码的编译和运行方式如下:

g++ -O3 -std=c++17 a.cpp
./a.out
我想使用OpenMp并行化我的代码,那么是否可以在不使用-fopenmp标志的情况下启用OpenMp

#include <iostream>

using namespace std;

int main() {
#pragma omp parallel for
    for (int i = 0; i < 100; i++) {
        std::cout << i << std::endl;
    }
}
更新:上面的代码是一个糟糕的例子,下面是另一个可以通过并行化加速的程序:

#include <iostream>
#include <cmath>
#include <chrono>

int main() {
    auto start = std::chrono::steady_clock::now();;
    double sum = 0;
    int n = 2e9;
    //std::cin >> n;
#pragma omp parallel for reduction(+:sum)
    for (int i = 0; i < n; i++) {
        sum += sqrt(i);
    }
    auto end = std::chrono::steady_clock::now();
    std::cout << sum << std::endl;
    std::cout << n << std::endl;
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << std::endl;
}
#包括
#包括
#包括
int main(){
自动启动=标准::时钟::稳定时钟::现在();;
双和=0;
int n=2e9;
//标准:cin>>n;
#pragma omp并行化简(+:求和)
对于(int i=0;istd::cout为什么要并行化代码?在线判断问题应该按顺序解决。问题的挑战是降低成本。在线判断不应该允许这种原因简单地违背竞争编程的目的

此外,如果您认为在N=100时,并行算法的运行速度会比顺序算法快,那么您显然对并行化开销一无所知。并行化算法带来了巨大的同步成本,这将导致性能下降


像这样的流I/O不能并行化;它必须在源代码中运行才能产生相同的输出。和
cout::operator。你认为你为什么需要它?谢谢你的评论,我已经更新了这个问题。你希望听到什么,除了:你不能?忘记OpenMP,使用并行算法,它是STL的一部分,从C++17.than开始谢谢你的建议!
谢谢你的回答!这回答了你的问题吗?同样/更重要的是,使用
'\n'
而不是
std::endl
。在每一行强制实际刷新(写系统调用)对性能和完全缓冲输出(在写入文件或管道时,stdout就是这种情况)是致命的。整个程序的大部分成本将是系统调用,因此(不包括动态链接器启动开销)更糟100倍。为该功能选择名称
std::endl
(换行和刷新)是一个非常糟糕的设计决定。是的,我首先应该考虑时间复杂度,但是我很好奇是否有一种方法可以用并行化来优化蛮力解决方案。@彼得科德斯是的,如果你想,请继续编辑我的答案并添加这个。谢谢。
#include <iostream>
#include <cmath>
#include <chrono>

int main() {
    auto start = std::chrono::steady_clock::now();;
    double sum = 0;
    int n = 2e9;
    //std::cin >> n;
#pragma omp parallel for reduction(+:sum)
    for (int i = 0; i < n; i++) {
        sum += sqrt(i);
    }
    auto end = std::chrono::steady_clock::now();
    std::cout << sum << std::endl;
    std::cout << n << std::endl;
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << std::endl;
}
std::ios_base::sync_with_stdio(false);
for (int i = 0; i < 100; i++) {
    std::cout << i << '\n';
}