OpenMP一次只执行一个线程

时间:2016-05-26 22:15:34

标签: c++ multithreading stl openmp

这是我的代码:

std::cout << omp_get_thread_num() << std::endl;

其中values_是在double上模板化的std :: vector,DIM类似于1024。

我用&#39; g ++ -std = c ++ 14 -fopenmp -g&#39;

编译它

即使我有多个线程,但当我不使用OpenMP时,我得到的性能几乎没有差别。

确实,这句话:

$DebugPreference = “Continue”
write-debug (Get-AzureRmStorageAccountKey -ResourceGroupName "USWest" -AccountName "mystorageaccountname")

表明线程一次只执行一次......

输出是干净的,类似于11111 ...,22222 ......,00000 ......,33333 ...而htop只显示一个100%的核心,整个执行过程中同一个核心

我已尝试过几台配有多个发行版的机器,它们无处不在。

1 个答案:

答案 0 :(得分:1)

您可能希望像这样重写代码,以防止I / O的巨大开销(也或多或少地序列化程序执行):

template <unsigned int DIM>
MyVector<DIM> MyVector<DIM>::operator+(MyVector& other) {
    MyVector ans = MyVector<DIM>();
    #pragma omp parallel
    {
        #pragma omp critical(console_io)
        {
            // The following are actually two function calls and a critical
            // region is needed in order to ensure I/O atomicity
            std::cout << omp_get_thread_num() << std::endl;
        }
        #pragma omp for schedule(static)
        for (unsigned int i = 0; i < DIM; ++i)
        {
            ans.values_[i] = values_[i] + other.values_[i];
        }
    }
    return ans;
}

确保DIM足够大,以便OpenMP的开销与正在完成的工作相比较小,并且同时足够小以使向量适合CPU的最后一级缓存。一旦后者不再是这种情况,你的循环就会受内存限制,添加新线程不会导致更快的计算。