下面的示例代码是我的工作代码的简化版本。在此代码中,写入共享变量仅在std::vector::push_back
调用的最后一行完成。
std::vector<struct FortyByteStruct> results;
#pragma omp parallel for num_threads(8)
for (int i = 0; i < 250; i++)
{
struct FortyByteStruct result = some_heavy_work(i);
#pragma omp critical
{
results.push_back(result);
}
}
我想知道这个push_back
操作是否会导致错误共享,让我有机会通过摆脱它来进一步优化。在深入研究这个问题之前,我决定先做一些基准测试。
使用chrono
,我分别测量了挂钟some_heavy_work()
和临界区的执行时间。后者的执行时间大约是前者的10^(-4)倍,所以我得出的结论是,无论是否涉及虚假共享,优化这部分几乎没有任何好处。
无论如何,我仍然很好奇虚假共享是否是这里的一个问题。我是否必须查看 的内部实现std::vector
?任何启示将不胜感激。(我在VS2015上)