gpt4 book ai didi

c++ - c++中std::min(int)的效率

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:17 24 4
gpt4 key购买 nike

我的代码中有一个迭代 1 亿次的循环(需要模拟模型的 1 亿次复制)。对于 1 亿次迭代中的每一次,我通过索引名为 age 的整数变量从数组 (myarray) 中检索一个值。由于数组的长度,只对 age=0,...,99 索引 myarray[age] 有效。但是,age 的实际域是 0,...,inf

所以,我有以下功能

int tidx(const int& a) {
return std::min(a,99);
}

允许通过 myarray[tidx(age)] 进行索引。

我怎样才能更有效地做到这一点?

[性能输出低于]

构建说明我正在使用的编译器标志的源文件的示例:

Building file: ../SAR.cpp
Invoking: GCC C++ Compiler
g++ -O3 -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"SAR.d" -MT"SAR.d" -o"SAR.o" "../SAR.cpp"
Finished building: ../SAR.cpp

perf recordperf report:

Samples: 280  of event 'cycles', Event count (approx.): 179855989                                                                                   
24.78% pc2 libc-2.17.so [.] __GI_____strtod_l_internal
11.35% pc2 pc2 [.] samplePSA(int, double, int, NRRan&)
6.67% pc2 libc-2.17.so [.] str_to_mpn.isra.0
6.15% pc2 pc2 [.] simulate4_NEJMdisutilities(Policy&, bool)
5.68% pc2 pc2 [.] (anonymous namespace)::stateTransition(double const&, int const&, int&, double const&, bool const&, bool&, bo
5.25% pc2 pc2 [.] HistogramAges::add(double const&)
3.73% pc2 libstdc++.so.6.0.17 [.] std::istream::getline(char*, long, char)
3.02% pc2 libstdc++.so.6.0.17 [.] std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_
2.49% pc2 [kernel.kallsyms] [k] 0xffffffff81043e6a
2.29% pc2 libc-2.17.so [.] __strlen_sse2
2.00% pc2 libc-2.17.so [.] __mpn_lshift
1.72% pc2 libstdc++.so.6.0.17 [.] __cxxabiv1::__vmi_class_type_info::__do_dyncast(long, __cxxabiv1::__class_type_info::__sub_kind, __cxxabiv1::
1.71% pc2 libc-2.17.so [.] __memcpy_ssse3_back
1.67% pc2 libstdc++.so.6.0.17 [.] std::locale::~locale()
1.65% pc2 libc-2.17.so [.] __mpn_construct_double
1.38% pc2 libc-2.17.so [.] memchr
1.29% pc2 pc2 [.] (anonymous namespace)::readTransitionMatrix(double*, std::string)
1.27% pc2 libstdc++.so.6.0.17 [.] std::string::_M_mutate(unsigned long, unsigned long, unsigned long)
1.15% pc2 libc-2.17.so [.] round_and_return
1.02% pc2 libc-2.17.so [.] __mpn_mul
1.01% pc2 libstdc++.so.6.0.17 [.] std::istream::sentry::sentry(std::istream&, bool)
1.00% pc2 libc-2.17.so [.] __memcpy_sse2
0.85% pc2 libstdc++.so.6.0.17 [.] std::locale::locale(std::locale const&)
0.85% pc2 libstdc++.so.6.0.17 [.] std::string::_M_replace_safe(unsigned long, unsigned long, char const*, unsigned long)
0.83% pc2 libstdc++.so.6.0.17 [.] std::locale::locale()
0.73% pc2 libc-2.17.so [.] __mpn_mul_1

来自性能统计:

 Performance counter stats for './release/pc2':

62.449034 task-clock # 0.988 CPUs utilized
49 context-switches # 0.785 K/sec
3 cpu-migrations # 0.048 K/sec
861 page-faults # 0.014 M/sec
179,240,478 cycles # 2.870 GHz
58,909,298 stalled-cycles-frontend # 32.87% frontend cycles idle
<not supported> stalled-cycles-backend
320,437,960 instructions # 1.79 insns per cycle
# 0.18 stalled cycles per insn
70,932,710 branches # 1135.850 M/sec
697,468 branch-misses # 0.98% of all branches

0.063228446 seconds time elapsed

如有任何意见,我将不胜感激。我需要学习如何解释/阅读这些信息,所以任何可能帮助我入门的提示都将不胜感激。

最佳答案

要优化代码首先要弄清楚什么地方是瓶颈。要找到瓶颈,必须分析代码。否则,变化是大量时间将浪费在根本无关紧要的微优化/错误优化上。

我没有在你的最小工作代码示例(你没有提供)中使用分析器,但根据我的经验我可以告诉你这一点——你的 tidx() 函数不是一个瓶颈,在这种情况下你不应该关心 std::min() 的性能。瓶颈更有可能是内存访问和停滞的 CPU 周期。

对于初学者,如果可能(如果编译器没有为您完成)尝试展开您的循环。执行 25000000 次迭代可能比 100000000 次更有效,但在单个循环周期中执行更多操作。但在你这样做之前,你必须确保展开循环有帮助而不是伤害。这通常是通过分析来完成的,所以我们回到要优化代码的地步,首先必须弄清楚瓶颈在哪里。找到一个瓶颈……哦,等等,我在这里差点陷入无限循环。中止。

关于c++ - c++中std::min(int)的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16740879/

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