Algorithm 一个可以使CPU饱和的程序的简单想法

Algorithm 一个可以使CPU饱和的程序的简单想法,algorithm,benchmarking,Algorithm,Benchmarking,我正在寻找一个简单的想法,为一个程序,能够饱和的CPU计算。现在,我唯一的想法就是使用素数生成器,随着素数中位数的增加,生成素数生成器的难度呈指数增长。有没有其他类型的算法可以做到这一点? 只要是CPU操作,就不应该关心CPU正在执行的操作类型 std::原子标志\u退出 inta=1 intb=1 while(!flag\u exit) b=a+b } cout 只要是CPU操作,就不应该关心CPU正在执行的操作类型 std::原子标志\u退出 inta=1 intb=1 while(!fla

我正在寻找一个简单的想法,为一个程序,能够饱和的CPU计算。现在,我唯一的想法就是使用素数生成器,随着素数中位数的增加,生成素数生成器的难度呈指数增长。有没有其他类型的算法可以做到这一点?

  • 只要是CPU操作,就不应该关心CPU正在执行的操作类型

    std::原子标志\u退出
    inta=1
    intb=1
    while(!flag\u exit)

    b=a+b
    }

    cout
    • 只要是CPU操作,就不应该关心CPU正在执行的操作类型

      std::原子标志\u退出
      inta=1
      intb=1
      while(!flag\u exit)

      b=a+b
      }


      难道我不认为计算本身真的很重要吗?您可以在一个巨大的字符串上循环,并对其进行修改。不过,要真正消耗CPU,您应该生成大量线程,所有线程都要这样做,以插入所有处理单元。出于好奇,你为什么需要这个?你需要大量的电力/热量吗?还是只需要使用CPU时间?如果是后者,任何重复计数为1M到1000M的简单循环都是好的,这取决于您希望它运行的时间。你的循环有多友好有关系吗?(或英特尔以外的任何其他CPU微体系结构上的SMT)我认为计算本身并不重要,不是吗?您可以在一个巨大的字符串上循环,并对其进行修改。不过,要真正消耗CPU,您应该生成大量线程,所有线程都要这样做,以插入所有处理单元。出于好奇,你为什么需要这个?你需要大量的电力/热量吗?还是只需要使用CPU时间?如果是后者,任何重复计数为1M到1000M的简单循环都是好的,这取决于您希望它运行的时间。你的循环有多友好有关系吗?(或英特尔以外的CPU微体系结构上的任何其他类型的SMT)除非
      flag_exit
      std::atomic
      或其他什么东西(或
      volatile
      ,在这种情况下可以工作,但一般不作为原子类型的替代品),否则大多数编译器都会将其优化为
      如果(!flag_exit){while(true){}
      ,因为它们将加载一次,并将值保存在寄存器中。是的,这正是gcc6.2()所发生的情况,它当然与-O0一起工作(在这种情况下,您不需要
      cout
      ,或者如果您使用
      std::atomic flag\u exit
      :“中继超线程以跨线程分割不相关的指令”。这与HT的作用相反。它允许多个线程使用同一个内核,以便更好地完成工作。以牺牲单线程性能为代价提高总体吞吐量。正常的超标量无序执行是利用指令流中指令级并行性的。@PeterCordes,代表HT:My termino逻辑关闭:(第二件事,给定
      while(标志退出)<代码> >从不同的线程,仍然是代码>旗语出口< /代码>必须是代码> Value/Ac原子<代码>?是的,这是STD存在:原子的主要原因之一。C++中的非原子变量上的数据竞争是UB的事实允许编译器假设全局不被异步修改,并将负载从循环。你可以在我链接的第一个asm中看到它,但在我使用的第二个asm中没有。当然,如果它是从同一线程中的信号处理程序设置的,那么同样的事情也适用。除非
      标志\u exit
      std::atomic
      或其他东西(或者一个
      volatile
      ,在这种情况下可以工作,但通常不能作为原子类型的替代品),如果(!flag_exit){while(true){}}
      ,大多数编译器都会将其优化为
      ,因为它们只需加载一次,并将值保存在寄存器中。是的,这正是gcc6.2()的情况,它当然与-O0一起工作(在这种情况下,您不需要
      cout
      ,或者如果您使用
      std::atomic flag\u exit
      :“在超线程上中继以跨线程拆分不相关的指令”。这与HT的作用相反。它允许多个线程使用同一个内核,以便更好地完成工作。以牺牲单线程性能为代价提高总体吞吐量。正常的超标量无序执行是利用指令流中指令级并行性的。@PeterCordes,代表HT:My termino逻辑关闭:(第二件事,给定
      while(标志退出)<代码> >从不同的线程,仍然是代码>旗语出口< /代码>必须是代码> Value/Ac原子<代码>?是的,这是STD存在:原子的主要原因之一。C++中的非原子变量上的数据竞争是UB的事实允许编译器假设全局不被异步修改,并将负载从循环。你可以在我链接的第一个asm中看到它,但在我使用
      原子的第二个asm中看不到。当然,如果它是从同一线程中的信号处理程序设置的,同样的事情也适用。