c++ 将两个chrono::duration相除得到分数

xcitsw88  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(143)

为了计算可能的加速比(Amdahl),我需要与总的顺序运行时相比,代码中可并行部分的比例。我使用chrono.h库对执行进行计时,并以纳秒为单位获得了总的顺序运行时和可并行部分运行时。
现在我需要将这两个持续时间相除,以获得可能的可并行部分的百分比。
例如

  1. auto seqStartTime = std::chrono::steady_clock::now();
  2. // Some code, non parallelizable
  3. auto parStartTime = std::chrono::steady_clock::now();
  4. // Parallelizable sequential code
  5. auto parEndTime = std::chrono::steady_clock::now();
  6. auto timeTakenPar = std::chrono::duration_cast<std::chrono::nanoseconds>(parEndTime - parStartTime);
  7. // More sequential code possible
  8. auto seqEndTime = std::chrono::steady_clock::now();
  9. auto timeTakenSeq = std::chrono::duration_cast<std::chrono::nanoseconds>(seqEndTime - seqStartTime);
  10. // auto frac = timeTakenPar / timeTakenSeq (??)

知道怎么做吗
简单的除法并不能解决这个问题,因为据我所知,这只会返回转换后右侧持续时间适合左手持续时间的次数。在这种情况下显然是零,因为总运行时间在rhs上,可并行部分运行时间在lhs上。
我还尝试在除法之前使用.count(),但结果仍然是0。
任何帮助是高度赞赏!

mwngjboj

mwngjboj1#

<chrono>支持不同的数字表示,包括double,甚至支持像2.5ms这样的文字。不幸的是,没有nanoseconds<double>快捷方式,演员阵容更罗嗦。

  1. #include <chrono>
  2. #include <iostream>
  3. using namespace std::chrono;
  4. using namespace std::chrono_literals;
  5. int main() {
  6. auto parStartTime = std::chrono::steady_clock::now();
  7. auto parEndTime = parStartTime + 12ns; // Dummy value
  8. using dnanoseconds = std::chrono::duration<long double, std::nano>;
  9. auto dur = parEndTime - parStartTime;
  10. std::cout << "Int/int nanoseconds:" << dur / (24ns) << '\n';
  11. std::cout << "Int/double nanoseconds:" << dur / (24.0ns) << '\n';
  12. std::cout << "Double/double nanoseconds:"
  13. << std::chrono::duration_cast<dnanoseconds>(dur) / (24.0ns) << '\n';
  14. std::cout << "Double/int nanoseconds:"
  15. << std::chrono::duration_cast<dnanoseconds>(dur) / 24ns << '\n';
  16. }

产出:

  1. Int/int nanoseconds:0
  2. Int/double nanoseconds:0.5
  3. Double/double nanoseconds:0.5
  4. Double/int nanoseconds:0.5
展开查看全部
chhqkbe1

chhqkbe12#

您可以改为使用浮点持续时间。这会给予你两个好处:

  • 使用浮点运算进行除法
  • 摆脱std::chrono::duration_cast

您的代码将变为:

  1. auto seqStartTime = std::chrono::steady_clock::now();
  2. // Some code, non parallelizable
  3. auto parStartTime = std::chrono::steady_clock::now();
  4. // Parallelizable sequential code
  5. auto parEndTime = std::chrono::steady_clock::now();
  6. std::chrono::duration<long double, std::nano> timeTakenPar = parEndTime - parStartTime;
  7. // More sequential code possible
  8. auto seqEndTime = std::chrono::steady_clock::now();
  9. std::chrono::duration<long double, std::nano> timeTakenSeq = seqEndTime - seqStartTime;
  10. long double frac = timeTakenPar / timeTakenSeq;
展开查看全部

相关问题