所以我有以下功能:
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微秒 到底发生了什么?
答案 0 :(得分:4)
我的猜测是多核的数据争用。现在,您正在对正在计算的事物进行伪随机访问,因此所有内核都不再争用相同的缓存行。显然,intel VTune中有一些模式可以让您进行性能分析以捕获这些错误。以及来自MIT和Umass的一些有趣的研究论文和项目。