C语言 我如何通过编程使单个核心的温度尽可能高?

6qftjkof  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(103)

我可能出于各种原因希望尽可能提高CPU温度:

  • 测试冷却设置。
  • 提高风扇转速,而不干扰BIOS设置。
  • 测试温度调节对运行在同一芯片上的其他进程的影响。

我知道现代CPU有许多功能单元和各种各样的技巧来尽可能多地占用它们,所以,我知道这个答案对于特定的CPU微体系结构可能有一些变体。
但是,我可以运行什么代码,这将做最尖峰的CPU温度?
内联汇编是好的。但是,如果能用C或C++来回答就好了。
我确实写了这个函数,希望它能让几个不同的函数单元被无意义的计算所占用:

void busy_busy_busy()
{
   using uint_t = ::std::uint64_t;
   const auto maxuint = ::std::numeric_limits<uint_t>::max();
   ::std::random_device random_device;
   ::std::mt19937_64 generator(random_device());
   ::std::uniform_int_distribution<uint_t> ints(0, maxuint >> 1);
   ::std::uniform_real_distribution<long double> doubles(0, 1);
   long double starting = doubles(generator);
   long double const one_third = 1.0l / 3.0l;
   while (starting != one_third) {
      auto tmp = starting;
      tmp *= doubles(generator);
      starting *= ints(generator);
      starting += tmp;
      starting /= maxuint >> 2;
   }
}

现成的基准测试通常不是为此而设计的。它们旨在测试有目的地合成的负载或模拟真实世界使用的负载的执行速度。它们会增加CPU温度,但我追求的是非常专门设计的代码,以增加CPU温度与合成负载,这可能永远不会发生在这些基准测试。
我个人有一台AMD锐龙93950X.

t3psigkw

t3psigkw1#

这是一个不太好的答案,我可能不会接受它,但它是对我的原始程序的更新,基于一些有用的几乎是答案的评论,我认为它更适合这项任务:

void busy_busy_busy()
{
   using uint_t = ::std::uintmax_t;
   const auto maxuint = ::std::numeric_limits<uint_t>::max();
   constexpr auto vecsize = 128 / sizeof(double);
   using vec_t = ::std::array<double, vecsize>;
   constexpr double double_iota = ::std::numeric_limits<double>::epsilon();

   ::std::random_device random_device;
   ::std::mt19937_64 generator(random_device());
   ::std::uniform_int_distribution<uint_t> ints(0, maxuint >> 1);
   ::std::uniform_real_distribution<double> doubles(1, 1 + (1 - double_iota));
   auto random_vec = [&generator, &doubles]() {
      vec_t randvec;
      for (auto &i: randvec) {
         i = doubles(generator);
      }
      return randvec;
   };
   auto dot_product = [](vec_t const &a, vec_t const &b) {
      vec_t::value_type sum = 0;
      for (int i = 0; i < a.size(); ++i) {
         sum += a[i] * b[i];
      }
      return sum;
   };
   vec_t starting = random_vec();
   vec_t::value_type last_dot = 0;
   vec_t::value_type const one_third = 1.0l / 3.0l;
   while (last_dot != one_third) {
      auto tmp = dot_product(starting, random_vec());
      for (auto &i: starting) {
         i *= tmp;
      }
      last_dot = tmp;
   }
}

最近的gcc将对此进行适当的矢量化:https://compiler-explorer.com/z/96se4MxPa

相关问题