作者:Eli M.(Delphi MVP) 

RAD Studio由Delphi和C ++ Builder组成。在Delphi方面,Object Pascal编译器是单行编译器,并且编译器本身不是并行编译器,但是当并行编译多个项目时,它能够在5分钟内在AMD Ryzen 9 5950x上编译10亿行Object Pascal代码。 16核电脑。我想看看C ++是否有可能实现类似的目标。这篇文章是我们现代硬件系列文章的一部分,在本文中,我们探讨了2021年初撰写本文时,使用某些最快的CPU可以实现的巨大生产率提高。十亿行代码到底有多少?看一看。

C ++ Builder中的并行编译

C ++ Builder有许多不同的编译器,包括用于许多平台的经典Borland编译器和基于Clang的现代编译器。此外,Embarcadero赞助了开放源代码Dev-C ++,后者捆绑了TDM-GCC 9.2.0编译器。GCC 9.2.0附带了MAKE,该MAKE支持通过-j(Jobs)命令行开关处理并行编译。C ++ Builder有一个名为TwineCompile的加载项,它可以将并行编译引入C ++ Builder。C ++ Builder和Dev-C ++都是使用Delphi 10.4.1开发构建的。

到目前为止,在我的调查中,TwineCompile似乎提供了比MAKE Jobs更多的功能,因为TwineCompile支持后台编译和其他一些提高生产力的功能。由IDE(Dev-C ++)决定是否支持其他功能,例如后台编译,但目前Dev-C ++不支持,而C ++ Builder通过TwineCompile支持。Dev-C ++是用于Windows开发的出色的本机C ++ IDE,然后C ++ Builder凭借其可视化设计器,强大的VCL RTL内置功能和增强的并行编译功能将生产率提高到最高。此外,它们基于不同的C ++编译器,因此这不完全是直接的比较,它们确实可以相互补充。

具有TwineCompile的3990X的第三方基准测试(不是本博客文章中的项目):

  • 机器规格:AMD®Ryzen®Threadripper 3990X(2.9 GHz,64核,128线程)
  • 配置:IDE编译。
  • 结果:不使用TwineCompile使用TwineCompile
  • 3:35:02 小时:分:秒 0:05:44 小时:分:秒

Dev-C ++中的并行编译

在开始执行此任务时,Dev-C ++不支持-j MAKE标志,因此这是第一个要完成的任务。我现在可以更新Dev-C ++并发布带有并行编译-j作为选项的新v6.3版本。默认情况下,它对于发行版也处于启用状态,因此应大大减少使用Dev-C ++的每个人的编译时间。必须进行更新,因为必须将需要添加的命令行标记添加到MAKE中,而不是添加到编译器命令行中。这花费了几天的时间来实现并获得新的v6.3版本。与该版本捆绑在一起的是过去两个月中的所有错误修复,以及第二个新功能,可以选择自定义嵌入式控制台应用程序。以下是Dev-C ++ v6.3的发行说明:

版本6.3 – 2021年1月30日

  • 补充:默认情况下,并行编译通过MAKE Jobs为发布版本启用。
  • 新增:3个用于设置自定义Shell命令行选项卡的按钮。
  • 更新:代码完成和深色主题的菜单。
  • 更新:CTRL-TAB编辑器选项卡选择包装。
  • 修复:清除文件删除问题。
  • 修正:状态栏不显示所有文本。
  • 修复:调试/ CPU窗口十六进制列问题。
  • 修正:关闭编辑器并排视图中的选项卡。

一旦有了可以并行编译10亿行C ++的Dev-C ++ IDE,我就需要具有64核和128线程的实际AMD Threadripper 3990X。Threadripper在PassMark上的每个CPU得分比5950X少,但由于它具有更多内核,因此总体得分更高。下面的屏幕截图来自PassMark,显示了两个CPU的比较。如您所见,5950x的单核基准测试为3491,而3990x的单核基准测试为2553。但是3990x的总体多核基准测试为80752,而5950x的多核基准测试为46045。

注意:视频没有提到此博客文章中使用的较大的64核3990X Threadripper。

ReliableSite.net具有基于云的AMD Threadripper 3990X 256GB RAM计算机,可满足该项目的需求。他们提供了两种不同的Windows设置:Windows Standard 2016和Windows Standard2019。我选择了Windows 2016,他们尝试使用该OS安装计算机,但由于Microsoft许可方式最有可能出现许可问题,因此对于任何发行版均无法Windows Standard 2016中的CPU和内核。无论如何,他们将其切换到Windows Standard 2019,并且能够很好地安装。

至此,我们已经在带有C ++ Builder和TwineCompile以及Dev-C ++ v6.3的Threadripper Windows 2019机器上启动并运行,该机器内置了新的并行编译支持。一切都经过测试,运行良好。与5950x相比,C ++ Builder能够比以前的版本更快地编译100万行C ++,比5950x快4倍,而Delphi能够对10亿行的Object Pascal项目进行编译,速度也快2.5倍。我们将把这两个比较留给另一篇文章。

有一个问题我与现代硬件的帖子使用工具来衡量CPU的使用率是任务管理器,豪华的MITEC。任务管理器DeLuxe提供的有关Windows系统的信息量令人惊讶。TMX具有黑暗(非常2021年)和明亮模式。MiTeC可以提供TMX,该公司还提供多种Delphi组件,使您可以访问许多与TMX中相同的信息。通过MiTeC系统信息组件套件,您可以在TMX中使用大多数信息。

当我第一次在Threadripper 3990x 64核心计算机上加载Task Manager DeLuxe时,它无法显示单个CPU图形并抛出错误。我拥有任务管理器DeLuxe的商业许可证,因此我向MiTeC的Michal发送了一封电子邮件,他能够很快解决此问题。他发布了新版本的任务管理器DeLuxe,现在可以在64核计算机上加载并运行良好。

下一个任务是实际创建10亿行代码的C ++项目,以便我们对其进行编译。我从这个用于Dev-C ++的Scimark2项目开始,并开发了一个Delphi应用程序来快速生成所需的代码行数。最后,我希望能够真正运行由十亿行C ++创建的应用程序。Delphi应用程序将获取LU.c和LU.h文件,并将最后一个函数LU_factor()复制创建设计行数所需的次数。该函数本身有69行,为避免名称冲突,每个生成的函数都有一个文件号和一个迭代器号。

我尝试了多种方法将C ++项目文件切成更多的文件和更少的行,或者更多的行和更少的文件。在Delphi项目中,我在250个不同的项目中进行了400万条生产线。对于C ++项目,一种方法是使用32,000个文件,每个文件31,250行。我通过一些测试得出了这个数字,因为似乎Dev-C ++在较小的文件,对更多的内核使用更多文件的情况下表现更好,并且大量较小的文件更紧密地模拟了真实项目。第二种方法是使用10,666个文件,每个文件93,750行。第三种方法是使用1000个文件和每个文件1000000行的C ++。文件列表在生成后被添加到Dev-C ++项目文件中,这意味着Dev-C ++必须将该文件列表加载到其项目列表中。

我在这里发现的一个瓶颈是Dev-C ++具有代码完成和符号完成功能。这些功能在打开项目时解析项目中的文件,足以说明它们尚未并行化。Dev-C ++最终会加载,但要花一些时间才能处理32,000个文件(甚至10,666个文件)。一旦弄清楚了这一点,便可以禁用代码完成和符号完成功能,从而可以快速加载10亿行C ++代码项目。Dev-C ++在编辑具有100万行的文件时似乎没有任何问题,并且感觉非常敏捷。

我遇到的第二个问题是Delphi的System.CPUCount过程报告的是32个线程,而不是128个线程。编写System.CPUCount过程时,32个内核可能就足够了,但是现在我们已经远远超过了。对于具有16个内核和32个线程的5950X,该过程可以很好地执行,但是对于3990X,这是不正确的。我向Embarcadero Quality门户报告了此问题,但与此同时,第三方NumCPULib4Pascal库应报告正确的值。我为Dev-C ++可执行文件构建了自定义版本,并在128个线程中进行了硬编码。

现在,我们几乎已经准备好进行10亿行代码的编译!我们拥有适当的硬件,IDE和编译器,以及项目(适当的切片方式)。在整个过程中,我一直在编译10亿行C ++项目的不同版本,以找出上述问题并加以纠正。

让我们从十亿行的项目开始,该项目分为32,000个文件,每个文件31,250行。该项目进行编译。它使用了所有内核,但是当将32,000个文件链接到可执行文件时,它停滞了。命令行上可以传递32,000个文件到链接器是有限制的。Windows命令行的最大长度为32768字节,这是Windows API中的USHORT。具有10,666个文件和每个文件93,750行的第二个项目也可以编译,但由于相同的原因而失败。

具有1000个文件和每个文件1,000,000行的第三个项目也可以编译,但速度较慢。在编译过程中,它不会使用全部128个内核。从MAKE中选择-j64,-j128和-j(自动)后,虽然确实执行64 g ++进程,但实际上只有大约34个内核中的约34个启动了。在此过程中,它使用81GB的RAM,因此计算机具有256GB的RAM是一件好事。一旦所有文件编译完毕,它确实可以通过命令行执行,但是在尝试将所有目标文件组合到可执行文件时,链接器本身由于错误而崩溃。到目前为止,在StackOverflow上找到的各种要传递的命令行参数的建议尚未解决。

g++.exe scimark2.o FFT.o LU.o MonteCarlo.o SOR.o SparseCompRow.o Stopwatch.o Random.o kernel.o array.o LU0.o LU1.o LU2.o LU3.o LU4.o LU5.o LU6.o LU7.o LU8.o LU9.o LU10.o LU11.o LU12.o LU13.o LU14.o LU15.o LU16.o LU17.o LU18.o LU19.o LU20.o LU21.o LU22.o LU23.o LU24.o LU25.o LU26.o LU27.o LU28.o LU29.o LU30.o LU31.o LU32.o LU33.o LU34.o LU35.o LU36.o LU37.o LU38.o LU39.o LU40.o LU41.o LU42.o LU43.o LU44.o LU45.o LU46.o LU47.o LU48.o LU49.o LU50.o LU51.o LU52.o LU53.o LU54.o LU55.o LU56.o LU57.o LU58.o LU59.o LU60.o LU61.o LU62.o LU63.o LU64.o LU65.o LU66.o LU67.o LU68.o LU69.o LU70.o LU71.o LU72.o LU73.o LU74.o LU75.o LU76.o LU77.o LU78.o LU79.o LU80.o LU81.o LU82.o LU83.o LU84.o LU85.o LU86.o LU87.o LU88.o LU89.o LU90.o LU91.o LU92.o LU93.o LU94.o LU95.o LU96.o LU97.o LU98.o LU99.o LU100.o LU101.o LU102.o LU103.o LU104.o LU105.o LU106.o LU107.o LU108.o LU109.o LU110.o LU111.o LU112.o LU113.o LU114.o LU115.o LU116.o LU117.o LU118.o LU119.o LU120.o LU121.o LU122.o LU123.o LU124.o LU125.o LU126.o LU127.o LU128.o LU129.o LU130.o LU131.o LU132.o LU133.o LU134.o LU135.o LU136.o LU137.o LU138.o LU139.o LU140.o LU141.o LU142.o LU143.o LU144.o LU145.o LU146.o LU147.o LU148.o LU149.o LU150.o LU151.o LU152.o LU153.o LU154.o LU155.o LU156.o LU157.o LU158.o LU159.o LU160.o LU161.o LU162.o LU163.o LU164.o LU165.o LU166.o LU167.o LU168.o LU169.o LU170.o LU171.o LU172.o LU173.o LU174.o LU175.o LU176.o LU177.o LU178.o LU179.o LU180.o LU181.o LU182.o LU183.o LU184.o LU185.o LU186.o LU187.o LU188.o LU189.o LU190.o LU191.o LU192.o LU193.o LU194.o LU195.o LU196.o LU197.o LU198.o LU199.o LU200.o LU201.o LU202.o LU203.o LU204.o LU205.o LU206.o LU207.o LU208.o LU209.o LU210.o LU211.o LU212.o LU213.o LU214.o LU215.o LU216.o LU217.o LU218.o LU219.o LU220.o LU221.o LU222.o LU223.o LU224.o LU225.o LU226.o LU227.o LU228.o LU229.o LU230.o LU231.o LU232.o LU233.o LU234.o LU235.o LU236.o LU237.o LU238.o LU239.o LU240.o LU241.o LU242.o LU243.o LU244.o LU245.o LU246.o LU247.o LU248.o LU249.o LU250.o LU251.o LU252.o LU253.o LU254.o LU255.o LU256.o LU257.o LU258.o LU259.o LU260.o LU261.o LU262.o LU263.o LU264.o LU265.o LU266.o LU267.o LU268.o LU269.o LU270.o LU271.o LU272.o LU273.o LU274.o LU275.o LU276.o LU277.o LU278.o LU279.o LU280.o LU281.o LU282.o LU283.o LU284.o LU285.o LU286.o LU287.o LU288.o LU289.o LU290.o LU291.o LU292.o LU293.o LU294.o LU295.o LU296.o LU297.o LU298.o LU299.o LU300.o LU301.o LU302.o LU303.o LU304.o LU305.o LU306.o LU307.o LU308.o LU309.o LU310.o LU311.o LU312.o LU313.o LU314.o LU315.o LU316.o LU317.o LU318.o LU319.o LU320.o LU321.o LU322.o LU323.o LU324.o LU325.o LU326.o LU327.o LU328.o LU329.o LU330.o LU331.o LU332.o LU333.o LU334.o LU335.o LU336.o LU337.o LU338.o LU339.o LU340.o LU341.o LU342.o LU343.o LU344.o LU345.o LU346.o LU347.o LU348.o LU349.o LU350.o LU351.o LU352.o LU353.o LU354.o LU355.o LU356.o LU357.o LU358.o LU359.o LU360.o LU361.o LU362.o LU363.o LU364.o LU365.o LU366.o LU367.o LU368.o LU369.o LU370.o LU371.o LU372.o LU373.o LU374.o LU375.o LU376.o LU377.o LU378.o LU379.o LU380.o LU381.o LU382.o LU383.o LU384.o LU385.o LU386.o LU387.o LU388.o LU389.o LU390.o LU391.o LU392.o LU393.o LU394.o LU395.o LU396.o LU397.o LU398.o LU399.o LU400.o LU401.o LU402.o LU403.o LU404.o LU405.o LU406.o LU407.o LU408.o LU409.o LU410.o LU411.o LU412.o LU413.o LU414.o LU415.o LU416.o LU417.o LU418.o LU419.o LU420.o LU421.o LU422.o LU423.o LU424.o LU425.o LU426.o LU427.o LU428.o LU429.o LU430.o LU431.o LU432.o LU433.o LU434.o LU435.o LU436.o LU437.o LU438.o LU439.o LU440.o LU441.o LU442.o LU443.o LU444.o LU445.o LU446.o LU447.o LU448.o LU449.o LU450.o LU451.o LU452.o LU453.o LU454.o LU455.o LU456.o LU457.o LU458.o LU459.o LU460.o LU461.o LU462.o LU463.o LU464.o LU465.o LU466.o LU467.o LU468.o LU469.o LU470.o LU471.o LU472.o LU473.o LU474.o LU475.o LU476.o LU477.o LU478.o LU479.o LU480.o LU481.o LU482.o LU483.o LU484.o LU485.o LU486.o LU487.o LU488.o LU489.o LU490.o LU491.o LU492.o LU493.o LU494.o LU495.o LU496.o LU497.o LU498.o LU499.o LU500.o LU501.o LU502.o LU503.o LU504.o LU505.o LU506.o LU507.o LU508.o LU509.o LU510.o LU511.o LU512.o LU513.o LU514.o LU515.o LU516.o LU517.o LU518.o LU519.o LU520.o LU521.o LU522.o LU523.o LU524.o LU525.o LU526.o LU527.o LU528.o LU529.o LU530.o LU531.o LU532.o LU533.o LU534.o LU535.o LU536.o LU537.o LU538.o LU539.o LU540.o LU541.o LU542.o LU543.o LU544.o LU545.o LU546.o LU547.o LU548.o LU549.o LU550.o LU551.o LU552.o LU553.o LU554.o LU555.o LU556.o LU557.o LU558.o LU559.o LU560.o LU561.o LU562.o LU563.o LU564.o LU565.o LU566.o LU567.o LU568.o LU569.o LU570.o LU571.o LU572.o LU573.o LU574.o LU575.o LU576.o LU577.o LU578.o LU579.o LU580.o LU581.o LU582.o LU583.o LU584.o LU585.o LU586.o LU587.o LU588.o LU589.o LU590.o LU591.o LU592.o LU593.o LU594.o LU595.o LU596.o LU597.o LU598.o LU599.o LU600.o LU601.o LU602.o LU603.o LU604.o LU605.o LU606.o LU607.o LU608.o LU609.o LU610.o LU611.o LU612.o LU613.o LU614.o LU615.o LU616.o LU617.o LU618.o LU619.o LU620.o LU621.o LU622.o LU623.o LU624.o LU625.o LU626.o LU627.o LU628.o LU629.o LU630.o LU631.o LU632.o LU633.o LU634.o LU635.o LU636.o LU637.o LU638.o LU639.o LU640.o LU641.o LU642.o LU643.o LU644.o LU645.o LU646.o LU647.o LU648.o LU649.o LU650.o LU651.o LU652.o LU653.o LU654.o LU655.o LU656.o LU657.o LU658.o LU659.o LU660.o LU661.o LU662.o LU663.o LU664.o LU665.o LU666.o LU667.o LU668.o LU669.o LU670.o LU671.o LU672.o LU673.o LU674.o LU675.o LU676.o LU677.o LU678.o LU679.o LU680.o LU681.o LU682.o LU683.o LU684.o LU685.o LU686.o LU687.o LU688.o LU689.o LU690.o LU691.o LU692.o LU693.o LU694.o LU695.o LU696.o LU697.o LU698.o LU699.o LU700.o LU701.o LU702.o LU703.o LU704.o LU705.o LU706.o LU707.o LU708.o LU709.o LU710.o LU711.o LU712.o LU713.o LU714.o LU715.o LU716.o LU717.o LU718.o LU719.o LU720.o LU721.o LU722.o LU723.o LU724.o LU725.o LU726.o LU727.o LU728.o LU729.o LU730.o LU731.o LU732.o LU733.o LU734.o LU735.o LU736.o LU737.o LU738.o LU739.o LU740.o LU741.o LU742.o LU743.o LU744.o LU745.o LU746.o LU747.o LU748.o LU749.o LU750.o LU751.o LU752.o LU753.o LU754.o LU755.o LU756.o LU757.o LU758.o LU759.o LU760.o LU761.o LU762.o LU763.o LU764.o LU765.o LU766.o LU767.o LU768.o LU769.o LU770.o LU771.o LU772.o LU773.o LU774.o LU775.o LU776.o LU777.o LU778.o LU779.o LU780.o LU781.o LU782.o LU783.o LU784.o LU785.o LU786.o LU787.o LU788.o LU789.o LU790.o LU791.o LU792.o LU793.o LU794.o LU795.o LU796.o LU797.o LU798.o LU799.o LU800.o LU801.o LU802.o LU803.o LU804.o LU805.o LU806.o LU807.o LU808.o LU809.o LU810.o LU811.o LU812.o LU813.o LU814.o LU815.o LU816.o LU817.o LU818.o LU819.o LU820.o LU821.o LU822.o LU823.o LU824.o LU825.o LU826.o LU827.o LU828.o LU829.o LU830.o LU831.o LU832.o LU833.o LU834.o LU835.o LU836.o LU837.o LU838.o LU839.o LU840.o LU841.o LU842.o LU843.o LU844.o LU845.o LU846.o LU847.o LU848.o LU849.o LU850.o LU851.o LU852.o LU853.o LU854.o LU855.o LU856.o LU857.o LU858.o LU859.o LU860.o LU861.o LU862.o LU863.o LU864.o LU865.o LU866.o LU867.o LU868.o LU869.o LU870.o LU871.o LU872.o LU873.o LU874.o LU875.o LU876.o LU877.o LU878.o LU879.o LU880.o LU881.o LU882.o LU883.o LU884.o LU885.o LU886.o LU887.o LU888.o LU889.o LU890.o LU891.o LU892.o LU893.o LU894.o LU895.o LU896.o LU897.o LU898.o LU899.o LU900.o LU901.o LU902.o LU903.o LU904.o LU905.o LU906.o LU907.o LU908.o LU909.o LU910.o LU911.o LU912.o LU913.o LU914.o LU915.o LU916.o LU917.o LU918.o LU919.o LU920.o LU921.o LU922.o LU923.o LU924.o LU925.o LU926.o LU927.o LU928.o LU929.o LU930.o LU931.o LU932.o LU933.o LU934.o LU935.o LU936.o LU937.o LU938.o LU939.o LU940.o LU941.o LU942.o LU943.o LU944.o LU945.o LU946.o LU947.o LU948.o LU949.o LU950.o LU951.o LU952.o LU953.o LU954.o LU955.o LU956.o LU957.o LU958.o LU959.o LU960.o LU961.o LU962.o LU963.o LU964.o LU965.o LU966.o LU967.o LU968.o LU969.o LU970.o LU971.o LU972.o LU973.o LU974.o LU975.o LU976.o LU977.o LU978.o LU979.o LU980.o LU981.o LU982.o LU983.o LU984.o LU985.o LU986.o LU987.o LU988.o LU989.o LU990.o LU991.o LU992.o LU993.o LU994.o LU995.o LU996.o LU997.o LU998.o LU999.o -o Scimark2.exe -L"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/lib" -L"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/lib" -static-libgcc -mcmodel=large -fPIC -Wl,--image-base -Wl,0x10000000C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o: in function `check_managed_app':C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:364:(.text+0x17):
relocation truncated to fit: R_X86_64_PC32 against symbol `.refptr.mingw_initltsdrot_force' defined in .rdata$.refptr.mingw_initltsdrot_force[.refptr.mingw_initltsdrot_force] section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o
C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:365:(.text+0x26):
relocation truncated to fit: R_X86_64_PC32 against symbol `.refptr.mingw_initltsdyn_force' defined in .rdata$.refptr.mingw_initltsdyn_force[.refptr.mingw_initltsdyn_force] section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o
C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:366:(.text+0x33):
relocation truncated to fit: R_X86_64_PC32 against symbol `.refptr.mingw_initltssuo_force' defined in .rdata$.refptr.mingw_initltssuo_force[.refptr.mingw_initltssuo_force] section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.oC:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:367:(.text+0x40):
relocation truncated to fit: R_X86_64_PC32 against symbol `.refptr.mingw_initcharmax' defined in .rdata$.refptr.mingw_initcharmax[.refptr.mingw_initcharmax] section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o
C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:370:(.text+0x4d):
relocation truncated to fit: R_X86_64_PC32 against symbol `.refptr.__image_base__' defined in .rdata$.refptr.__image_base__[.refptr.__image_base__] section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o
C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o:
in function `pre_c_init':
C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:141:(.text+0x6a):
relocation truncated to fit: R_X86_64_PC32 against symbol `.refptr.mingw_app_type' defined in .rdata$.refptr.mingw_app_type[.refptr.mingw_app_type] section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.oC:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:140:(.text+0x70): relocation truncated to fit: R_X86_64_PC32 against `.bss'
C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:144:(.text+0x80): relocation truncated to fit: R_X86_64_PC32 against symbol `__set_app_type' defined in .text section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/lib/libmsvcrt.a(dwngs00096.o)C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:146:(.text+0x85): relocation truncated to fit: R_X86_64_PC32 against symbol `__p__fmode' defined in .text section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/lib/libmsvcrt.a(lib64_libmsvcrt_os_a-__p__fmode.o)
C:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:146:(.text+0x8c): relocation truncated to fit: R_X86_64_PC32 against symbol `.refptr._fmode' defined in .rdata$.refptr._fmode[.refptr._fmode] section in C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.oC:/crossdev/src/mingw-w64-v7-git20191109/mingw-w64-crt/crt/crtexe.c:152:(.text+0x95): additional relocation overflows omitted from the output
collect2.exe: error: ld returned 1 exit status
C:DScimark2-Dev-Cpp-masterMakefile.win:25: recipe for target 'Scimark2.exe' failed
mingw32-make.exe: *** [Scimark2.exe] Error 1

经过更多测试之后,似乎2GB可执行文件的大小限制(无论使用-mcmodel = medium还是-mcmodel = large)都是上述错误的障碍。我能够执行100个文件,每个文件编译1,000,000行,并且生成了〜1.1GB的可执行文件。我开始使用-O(优化大小),这使项目向前发展了很多。这里要注意的几件事是,可执行文件越大,Scimark2得分就越慢,这很有趣。使用1000个1,000,000个行文件和-O的第一个成功的10亿行编译在1483秒(24.7分钟)内生成了359MB可执行文件。我还尝试了500个文件,包含2,000,000行,实际上花费了更长的时间。当可执行文件更大并且使用-Os编译时,默认的Scimark2项目比具有额外10亿行代码的项目快4倍。

500个文件2万亿行代码每个文件使用了高达156GB的内存,但并非全部使用64个内核。

我不认为此编译时间可以准确地表示3990x Threadripper,因为在100万和200万行代码文件大小中,并未使用所有内核。我不知道这是否与MAKE和G ++或自动-j设置有关,它会在其中选择要使用的内核数,或者即使计算机上存在IO瓶颈,也无法解决该问题。文件越小,MAKE / G ++ -j组合使用的内核越多。我还尝试了带有-pipe标志和不带有-pipe标志的情况,该标志在编译过程中使用管道而不是文件。这里还有趣的是,C ++ Builder中的TwineCompile似乎没有相同的限制。使用它进行并行编译时,所有内核立即启动。

四重编译

为了更快地编译10亿行C ++代码,我在项目中加载了250个1,000,000行代码文件的4个Dev-C ++实例,并同时编译了所有4个项目。这类似于10亿行对象Pascal代码,因为在该项目下,它正在编译250个项目,每个项目有400万行代码。这就是四边形编译的结果。

Dev-C ++的四实例

注意:此屏幕截图上有一个错误,其中显示了32个内核和64个线程,应读取64个内核和128个线程。

编译结果…

  • 错误:0
  • 警告:0
  • 输出文件名:C:DScimark2-Dev-Cpp-master_250_1m_DScimark2.exe
  • 输出大小:90.0009765625 MiB
  • 编译时间:906.58s

编译结果…

  • 错误:0
  • 警告:0
  • 输出文件名:C:DScimark2-Dev-Cpp-master_250_1m_CScimark2.exe
  • 输出大小:90.0009765625 MiB
  • 编译时间:909.45s

编译结果…

  • 错误:0
  • 警告:0
  • 输出文件名:C:DScimark2-Dev-Cpp-master_250_1m_AScimark2.exe
  • 输出大小:90.0009765625 MiB
  • 编译时间:915.17s

编译结果…

  • 错误:0
  • 警告:0
  • 输出文件名:C:DScimark2-Dev-Cpp-master_250_1m_BScimark2.exe
  • 输出大小:90.0009765625 MiB
  • 编译时间:918.05s

在AMD 3990X Threadripper上在15分钟内完成10亿行C ++代码。

这个项目非常有趣,而且TDM-GCC编译器有各种不同的C ++标志,例如-mtune = native,-mtune = znver2和-mtune = znver3,泰山老父我没有在此设置中尝试过。正如我们在这篇文章中看到的那样,对具有64核和128线程的现代计算机的软件支持仍然可以解决所有问题,但是通常可以正常工作并提供一些强大的计算能力。带有TwineCompile的C ++ Builder是一款功能强大的生产力解决方案,适用于多核计算机,可以非常快速地编译一百万行代码,并且由于其深度的IDE集成,因此可以比MAKE / GCC并行编译Jobs功能更好地工作。当使用大型代码库和大型文件时,开源Dev-C ++是一个非常强大的解决方案,可以充分利用Delphi中的并行编程库。在并行编译期间,Dev-C ++ UI的响应速度给我留下了深刻的印象。准备好开始使用C ++构建Windows应用程序了吗?从下面的链接中试用C ++ Builder或Dev-C ++。您还可以研究更多有关学习C ++和其他有关以下5950X 16核心计算机的现代硬件文章的信息。

额外阅读...

在LearnCPlusPlus.org上了解有关使用C ++进行编程的更多信息。

AMD Ryzen 9 5950x Powerhouse可在12秒内编译百万行Delphi代码的四分之三

在AMD Ryzen 9 5950x上使用Delphi在45秒内并行编译300个本机Windows应用程序

使用16核心Ryzen 9 5950x在2分钟内编译100万行C ++

Ryzen 9 5950x:在16个内核上约5分钟内编译了十亿行Delphi代码

Ryzen 9 5950x:具有16个内核的并行编译124 Windows C ++项目仅需1分钟

获取两个强大的C ++并行编译IDE

下载C ++ Builder可以在多核计算机上获得大量生产力。

下载Dev-C ++可获得更基本的C ++体验,但现在具有强大的并行编译支持。

查看Embarcadero Delphi中内置的Dev-C ++的完整源代码。

看一下Delphi以及它用于构建Dev-C ++和C ++ Builder的过程。

10亿行C ++代码使用3万元/个的电脑处理器AMD Threadripper 3990X:在64核CPU处理器256GB内存电脑上编译需要多长时间?相关推荐

  1. 1分钟插入10亿行数据!抛弃Python,写脚本请使用Rust

      新智元报道   来源:Avinash 一位程序员急需在一分钟之内生成十亿行的测试数据库,然而在用Python写了脚本之后发现「大失败」.怎么办?当然是用Rust了! 于是,他做了一个所有程序员都会 ...

  2. mysql数据超10亿条,大型主键:超过10亿行MySQL + InnoDB?

    I was wondering if InnoDB would be the best way to format the table? The table contains one field, p ...

  3. 腾讯员工中66%是研发,用C++最多,去年新写12.9亿行代码

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 在腾讯做研发是种怎样的体验?现在,"鹅厂"用官方数据给出了答案. 今天(3月10日),腾讯发布<腾讯研发大数据报 ...

  4. 2018年开源状况:代码贡献超310亿行,而漏洞超16000个

    几年前,"开源"还是点点星火,如今已成燎原之势.在过去的2018年,企业都在积极加强自己在开源方面的实力,IBM大手笔340亿美元收购了RedHat,微软75亿美元收购了GitHu ...

  5. 年增代码 12.9 亿行,每天完成需求近 4000 个,鹅厂程序员秘密大爆料!

    整理 | 伍杏玲 出品 | 程序人生(ID:coder_life) 封图 | 程序人生付费下载于视觉中国 2019年,腾讯员工两次以"壕无人性"喜提热搜:网友根据腾讯第一季财报算出 ...

  6. 10行python代码的词云

    关于词云wordcloud 什么是词云呢?词云又叫文字云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本 ...

  7. 10亿用户之后,为什么是百度率先打破花园围墙?

    文|李永华 来源 | 螳螂财经(ID:TanglangFin) 自从去年10月QuestMobile发布的报告中提到百度系产品用户规模突破10亿,BAT在"10亿俱乐部"再聚首,成 ...

  8. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...

  9. 马斯克:推特要学习微信,让10亿人「活在上面」成为超级APP

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 发自 凹非寺 量子位 | 公众号 QbitAI 推特未来主人马 ...

最新文章

  1. dsp和通用计算机的区别,dsp芯片是什么_dsp芯片和通用微处理器有什么区别
  2. windows平台下 c++获取 系统版本 网卡 内存 CPU 硬盘 显卡信息
  3. 远程办公第五天,你还在扩容吗?
  4. 不同组合方式有四种纸币java_拼凑钱币丶Java教程网-IT开发者们的技术天堂
  5. 集成JavaFX和Swing(修订版)
  6. android新材料设计,android - 如何实现新材料BottomAppBar为BottomNavigationView - SO中文参考 - www.soinside.com...
  7. (转)使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型
  8. 《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第七节 - 文件图片及子图处理类BufferedImageChimpImage...
  9. 矩阵迹(trace)与行列式(determinate)的一些性质
  10. python 使用 pyodbc 访问 Sql Server
  11. 宇宙机器人超级计算机,宇宙机器人无线控制器使用指南白金攻略
  12. 初次 使用RuoYi 若依框架总结(前端)
  13. 在Linux Ubuntu上编译DNX
  14. HTML- markdown版 江城子·乙卯正月二十日夜记梦
  15. 详细描述NAND FLASH FTL 层算法
  16. 【编译原理】LL(1)语法分析器
  17. [Qt] TCP客户端与服务器断开连接自动重联机制
  18. Su+ELK实现网络监测(1)——Suricata安装与配置
  19. 佳佳的筷子 Chopsticks
  20. 记录贴:RuntimeError: version_ <= kMaxSupportedFileFormatVersion INTERNAL ASSERT FAILED at /pytorch/caff

热门文章

  1. ANA 2 优化版含预设 – Sonic Academy ANA 2 Bundle v2.0.94 WiN
  2. QT 出现“找不到libgcc_s_dw2-1.dll”的解决方式
  3. VS 2019 专业版 下载安装教程
  4. 55最佳实践系列:MongoDB最佳实践
  5. 荣耀路由x1 虚拟服务器,荣耀路由器x1用手机怎么设置? | 192路由网
  6. 带头大哥敛财1300万
  7. [ZZ]深入了解scanf()/getchar()和gets()等函数
  8. java线程同步原理
  9. 笨方法学Python笔记(9)
  10. 西安科技大学计算机考研资料汇总