多线程变化需要更长的时间

时间:2015-12-14 19:18:05

标签: c++ multithreading openmp

所以我有以下功能:

Timer time;
time.start();
do_thing(my_vector);
time.stop();
printf("%d", time.time);

我用这样的话来称呼它:

import <omp.h>
void do_thing(std::vector<some_class*> some_class_vector)
{
    size_t items_to_process = some_class_vector.size();
    #pragma omp parallel for num_threads(6)
    for (i = 0; i < items_to_process; i++)
    {
        some_class_vector[i]->compute();
    }
}

它告诉我平均需要80微秒才能运行。 我的处理器有8个内核,当我看到任务管理器时,我看到计算机在运行那段代码时占13%。 因为compute()不会改变调用它的some_class之外的任何东西,所以我决定将它并行化,所以现在代码看起来像

import <omp.h>
void do_thing(std::vector<some_class*> some_class_vector)
{
    size_t items_to_process = some_class_vector.size();
    #pragma omp parallel for num_threads(6)
    for (i = 0; i < items_to_process; i++)
    {
        some_class_vector[(10039*i) % items_to_process]->compute();
    }
}

我再次运行它,现在需要大约200微秒才能运行 然后在同事的建议下,我第三次这样做:

min-height

现在运行大约需要20微秒 到底发生了什么?

1 个答案:

答案 0 :(得分:4)

我的猜测是多核的数据争用。现在,您正在对正在计算的事物进行伪随机访问,因此所有内核都不再争用相同的缓存行。显然,intel VTune中有一些模式可以让您进行性能分析以捕获这些错误。以及来自MITUmass的一些有趣的研究论文和项目。