gprof说,我的高计算应用程序在std::vector <...> operator [] (unsigned long)中花费了53%的时间,其中32%花在了一个频繁使用的向量上。更糟糕的是,我怀疑我的并行代码无法扩展到超过3-6个核心,这是由于相关的内存瓶颈。虽然我的应用程序确实花了很多时间访问和写入内存,但似乎我应该能够(或至少尝试)做得比52%更好。我是否应该尝试使用动态数组(大多数情况下大小保持不变)?这可能会帮助解决可能的瓶颈吗?
实际上,为了方便起见,我更喜欢的解决方案是解决瓶颈并保留向量不变。基于以上,是否有任何可能的罪魁祸首或解决方案(tcmalloc已被淘汰)?
发布于 2011-11-26 15:58:03
你检查过你的内存访问模式本身了吗?这可能是低效的-缓存不友好。
发布于 2011-11-26 15:52:09
你有没有尝试在数组访问时使用原始指针?
// regular place
for (int i = 0; i < arr.size(); ++i)
wcout << arr[i];
// In bottleneck
int *pArr = &arr.front();
for (int i = 0; i < arr.size(); ++i)
wcout << pArr[i];发布于 2011-11-26 16:06:16
我怀疑gprof阻止了函数的内联。尝试使用另一种分析方法。std::vector operator []不能成为瓶颈,因为它与原始数组访问没有太大区别。SGI的实现如下所示:
reference operator[](size_type __n) { return *(begin() + __n); }
iterator begin() { return _M_start; }https://stackoverflow.com/questions/8277050
复制相似问题