gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:56:10 24 4
gpt4 key购买 nike

所以我有以下功能:

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 中有模式这将允许您进行性能分析以捕获此类错误。连同来自 MIT 的一些有趣的研究论文和项目和 Umass .

关于c++ - 多线程变化需要更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com