什么可以阻止多处理提高速度 - OpenMP?

时间:2015-06-03 09:14:44

标签: c++ multithreading performance openmp

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

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个线程的成本..所以发生了什么?

1 个答案:

答案 0 :(得分:0)

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

有两个问题:

  1. 快速的性能分析表明,大多数时间花费在std::lockit上,这是用于在visual studio上进行调试的东西..以防止只添加此命令行/D "_HAS_ITERATOR_DEBUGGING=0" /D "_SECURE_SCL=0"。这就是为什么添加更多线程会导致时间浪费的原因
  2. 切换优化有助于提高性能