多线程变化需要更长的时间
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.
中有模式
所以我有以下功能:
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.
中有模式