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

Multi-threading variation takes much longer

所以我有以下功能:

void do_thing(std::vector<some_class*> some_class_vector)
{
    size_t items_to_process = some_class_vector.size();
    for (i = 0; i < items_to_process; i++)
    {
        some_class_vector[i]->compute();
    }
}

我这样称呼它:

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

它告诉我 运行 平均需要大约 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[i]->compute();
    }
}

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

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();
    }
}

现在 运行.
大约需要 20 微秒 这到底是怎么回事?

我的猜测是多核数据争用。现在你正在对你正在计算的东西进行伪随机访问,因此所有的核心都不再争用同一个缓存行。显然 intel VTune that will allow you to do performance analysis to catch these kind of errors. Along with some papers interesting research papers and projects from MIT and Umass.

中有模式