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

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

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

auto seqStartTime = std::chrono::steady_clock::now();

   // Some code, non parallelizable

auto parStartTime = std::chrono::steady_clock::now();
   // Parallelizable sequential code
auto parEndTime = std::chrono::steady_clock::now();

auto timeTakenPar = std::chrono::duration_cast<std::chrono::nanoseconds>(parEndTime - parStartTime);

   // More sequential code possible

auto seqEndTime = std::chrono::steady_clock::now();
auto timeTakenSeq = std::chrono::duration_cast<std::chrono::nanoseconds>(seqEndTime - seqStartTime);

// auto frac = timeTakenPar / timeTakenSeq (??)

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

mwngjboj

mwngjboj1#

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

#include <chrono>
#include <iostream>

using namespace std::chrono;
using namespace std::chrono_literals;

int main() {
    auto parStartTime = std::chrono::steady_clock::now();
    auto parEndTime = parStartTime + 12ns;  // Dummy value

    using dnanoseconds = std::chrono::duration<long double, std::nano>;
    auto dur = parEndTime - parStartTime;

    std::cout << "Int/int nanoseconds:" << dur / (24ns) << '\n';
    std::cout << "Int/double nanoseconds:" << dur / (24.0ns) << '\n';
    std::cout << "Double/double nanoseconds:"
              << std::chrono::duration_cast<dnanoseconds>(dur) / (24.0ns) << '\n';
    std::cout << "Double/int nanoseconds:"
              << std::chrono::duration_cast<dnanoseconds>(dur) / 24ns << '\n';
}

产出:

Int/int nanoseconds:0
Int/double nanoseconds:0.5
Double/double nanoseconds:0.5
Double/int nanoseconds:0.5
chhqkbe1

chhqkbe12#

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

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

您的代码将变为:

auto seqStartTime = std::chrono::steady_clock::now();
// Some code, non parallelizable

auto parStartTime = std::chrono::steady_clock::now();
// Parallelizable sequential code
auto parEndTime = std::chrono::steady_clock::now();
std::chrono::duration<long double, std::nano> timeTakenPar = parEndTime - parStartTime;

// More sequential code possible

auto seqEndTime = std::chrono::steady_clock::now();
std::chrono::duration<long double, std::nano> timeTakenSeq = seqEndTime - seqStartTime;

long double frac = timeTakenPar / timeTakenSeq;

相关问题