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

 
作者:Eli M.(Delphi MVP) 
3990xripper

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。

 

5950xvs3990x-6321831

 

注意:视频没有提到此博客文章中使用的较大的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核计算机上加载并运行良好。

tmx-3198832

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

cppgen-3666964

我尝试了多种方法将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 ++项目的不同版本,以找出上述问题并加以纠正。

devcpp63-9215674

让我们从十亿行的项目开始,该项目分为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,0x10000000

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 `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.o

C:/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.o

C:/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.o

C:/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倍。

500files-9471039

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万行代码。这就是四边形编译的结果。

250文件-7586064

Dev-C ++的四实例

quadfiles-9745803

1cpuquadfiles-1279229

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

Quaddisk-3103481

quadfullcompile-4429225

任务管理器9552733

 

编译结果…

  • 错误: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

quadcompileend-9843880

在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的过程。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值