我在test.cpp中有以下C++代码:

int myfun(){
double time1, time2;
time1 = omp_get_wtime();

#pragma omp parallel for
for(int group_id = 0; group_id < 1; ++group_id){ }

time2 = omp_get_wtime();
printf("computation took %.3f ms\n", (time2-time1)*1000);
return 0;
}

我将其编译为共享库
g++ -c -fPIC -fopenmp -std=c++11 -Wall -march=native -O3 -o test.o test.cpp

其次是
g++ -shared -fopenmp -o mylib.so test.o

当我运行函数myfun()时(如果很重要,我会从python程序中调用它),得到以下输出:
computation took 5.992 ms

如果我注释掉#pragma指令,我当然会得到
computation took 0.000 ms

现在,我了解到使用openmp时会有一些开销,但这似乎是不合理的。我在这里想念什么?

最佳答案

这是正常的。多线程编程会带来额外的开销,例如创建线程,同步等。但是正确应用多线程编程会取得成功。选择顺序或多线程实现取决于它们的有效性。
在我的示例中,线程是在第一个调用中创建的,然后被使用。但这取决于实现:

int main()
{
    myfun();
    myfun();
    myfun();
    myfun();
    return 0;
}

输出:
computation took 2.510 ms
computation took 0.082 ms
computation took 0.046 ms
computation took 0.043 ms

10-06 04:10