【问题标题】:What can prevent multiprocessing from improving speed - OpenMP?什么可以阻止多处理提高速度 - OpenMP?
【发布时间】:2015-06-03 09:14:44
【问题描述】:

我正在扫描向量的每一个排列,我想多线程处理这个过程(每个线程都会扫描一些向量的所有排列)。 我设法提取了不会加速的代码(我知道它没有做任何有用的事情,但它重现了我的问题)。

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

    std::vector<std::string *> myVector;
    for(int i = 0 ; i < 8 ; ++i){
        myVector.push_back(new std::string("myString" + std::to_string(i)));
    }
    std::sort(myVector.begin(), myVector.end());

    omp_set_dynamic(0);
    omp_set_num_threads(8);
#pragma omp parallel for shared(myVector)
    for(int i = 0 ; i < 100 ; ++i){

        std::vector<std::string*> test(myVector);
        do{ //here is a permutation
        } while(std::next_permutation(test.begin(), test.end())); // tests all the permutations of this combination

    }
    return 0;
}

结果是:

1 thread : 15 seconds
2 threads : 8 seconds
4 threads : 15 seconds
8 threads : 18 seconds
16 threads : 20 seconds

我正在使用具有 8 个内核的 i7 处理器。我无法理解 8 个线程为什么会比 1 个线程慢...我认为创建新线程的成本并不高于经历 40320 个排列的成本。那么发生了什么?

【问题讨论】:

  • 发布真实代码,或对其进行分析。你在一个循环中什么都不做,设置线程组和并行运行循环有它的开销。另外,你编译优化了吗?你还做了一件非常非常奇怪的事情。为什么要在每个循环中复制指针?!
  • 我知道循环中没有任何内容,但我提供的时间测量是使用下面的代码计算的。每次迭代都有 40320 次排列,这一事实足以看出线程数之间的差异。 (是的,优化已开启,否则两个线程不会更快)
  • “是的,优化已开启,否则两个线程不会更快” - 这是一个错误的假设,那里没有逻辑链接。 “每次迭代都要经过 40320 个排列,这一事实足以看出线程数之间的差异。” - 证明给我看。我说 40320 次无事可做需要 0 次。
  • @luk32 虽然我同意你的推理,但如果我们看看时间安排,我们可以看到有相当多的工作正在完成。每次迭代应花费约 150 毫秒。尽管如此,Arcyno,如果您发布完成工作的代码,它将帮助其他试图重现确切问题的人。
  • @Arcyno 看here。注意 Kerrek SB 的评论。不要浪费时间分析调试/非优化代码。

标签: c++ multithreading performance openmp


【解决方案1】:

感谢大家的帮助,我终于找到了答案:

有两个问题:

  1. 快速性能分析显示大部分时间都花在std::lockit 上,这是用于在 Visual Studio 上进行调试的东西。为了防止这种情况发生,只需添加此命令行/D "_HAS_ITERATOR_DEBUGGING=0" /D "_SECURE_SCL=0"。这就是为什么添加更多线程会导致时间损失
  2. 开启优化有助于提高性能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多