This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Use unaligned access on x86_64


I tested this on my linux workstation with a debug build of clang. The
results are still very interesting.

The perf logs are attached.

Cheers,
Rafael


On 24 April 2015 at 10:54, Rafael EspÃndola <rafael.espindola@gmail.com> wrote:
> Hi,
>
> x86_64 has exquisite support for unaligned loads. It is a shame not to use it.
>
> The attached patch avoids aligning archive members on x86_64. The
> results when linking clang are very interesting:
>
> * massif reports that the malloc memory usage goes from 331,295,192
> bytes to just 133,415,136 bytes.
>
> * the linking time (30 runs average) goes from
>
> 1.310065610 seconds time elapsed ( +-  0.19% )
>
> to
>
> 1.162564763 seconds time elapsed ( +-  0.14% )
>
>
> Cheers,
> Rafael
>
>
> 2015-04-24  Rafael Ãvila de EspÃndola <rafael.espindola@gmail.com>
>
> * fileread.cc (find_or_make_view): Don't align on x86_64.
 Performance counter stats for '/home/espindola/binutils/ld-master --hash-style=gnu --no-add-needed --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o bin/clang-3.7 /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64 -L/home/espindola/inst/clang/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../.. -L/lib -L/usr/lib -allow-shlib-undefined --export-dynamic tools/clang/tools/driver/CMakeFiles/clang.dir/driver.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1_main.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1as_main.cpp.o lib64/libLLVMAArch64CodeGen.a lib64/libLLVMAArch64AsmPrinter.a lib64/libLLVMAArch64AsmParser.a lib64/libLLVMAArch64Desc.a lib64/libLLVMAArch64Info.a lib64/libLLVMAArch64Disassembler.a lib64/libLLVMARMCodeGen.a lib64/libLLVMARMAsmPrinter.a lib64/libLLVMARMAsmParser.a lib64/libLLVMARMDesc.a lib64/libLLVMARMInfo.a lib64/libLLVMARMDisassembler.a lib64/libLLVMCppBackendCodeGen.a lib64/libLLVMCppBackendInfo.a lib64/libLLVMHexagonCodeGen.a lib64/libLLVMHexagonDesc.a lib64/libLLVMHexagonInfo.a lib64/libLLVMHexagonDisassembler.a lib64/libLLVMMipsCodeGen.a lib64/libLLVMMipsAsmPrinter.a lib64/libLLVMMipsAsmParser.a lib64/libLLVMMipsDesc.a lib64/libLLVMMipsInfo.a lib64/libLLVMMipsDisassembler.a lib64/libLLVMMSP430CodeGen.a lib64/libLLVMMSP430AsmPrinter.a lib64/libLLVMMSP430Desc.a lib64/libLLVMMSP430Info.a lib64/libLLVMNVPTXCodeGen.a lib64/libLLVMNVPTXAsmPrinter.a lib64/libLLVMNVPTXDesc.a lib64/libLLVMNVPTXInfo.a lib64/libLLVMPowerPCCodeGen.a lib64/libLLVMPowerPCAsmPrinter.a lib64/libLLVMPowerPCAsmParser.a lib64/libLLVMPowerPCDesc.a lib64/libLLVMPowerPCInfo.a lib64/libLLVMPowerPCDisassembler.a lib64/libLLVMR600CodeGen.a lib64/libLLVMR600AsmPrinter.a lib64/libLLVMR600AsmParser.a lib64/libLLVMR600Desc.a lib64/libLLVMR600Info.a lib64/libLLVMSparcCodeGen.a lib64/libLLVMSparcAsmPrinter.a lib64/libLLVMSparcAsmParser.a lib64/libLLVMSparcDesc.a lib64/libLLVMSparcInfo.a lib64/libLLVMSparcDisassembler.a lib64/libLLVMSystemZCodeGen.a lib64/libLLVMSystemZAsmPrinter.a lib64/libLLVMSystemZAsmParser.a lib64/libLLVMSystemZDesc.a lib64/libLLVMSystemZInfo.a lib64/libLLVMSystemZDisassembler.a lib64/libLLVMX86CodeGen.a lib64/libLLVMX86AsmPrinter.a lib64/libLLVMX86AsmParser.a lib64/libLLVMX86Desc.a lib64/libLLVMX86Info.a lib64/libLLVMX86Disassembler.a lib64/libLLVMXCoreCodeGen.a lib64/libLLVMXCoreAsmPrinter.a lib64/libLLVMXCoreDesc.a lib64/libLLVMXCoreInfo.a lib64/libLLVMXCoreDisassembler.a lib64/libLLVMAnalysis.a lib64/libLLVMCodeGen.a lib64/libLLVMCore.a lib64/libLLVMipa.a lib64/libLLVMipo.a lib64/libLLVMInstCombine.a lib64/libLLVMInstrumentation.a lib64/libLLVMMC.a lib64/libLLVMMCParser.a lib64/libLLVMObjCARCOpts.a lib64/libLLVMOption.a lib64/libLLVMScalarOpts.a lib64/libLLVMSupport.a lib64/libLLVMTransformUtils.a lib64/libLLVMVectorize.a lib64/libclangBasic.a lib64/libclangDriver.a lib64/libclangFrontend.a lib64/libclangFrontendTool.a lib64/libLLVMAArch64AsmPrinter.a lib64/libLLVMAArch64Info.a lib64/libLLVMAArch64Utils.a lib64/libLLVMARMDesc.a lib64/libLLVMARMAsmPrinter.a lib64/libLLVMARMInfo.a lib64/libLLVMHexagonDesc.a lib64/libLLVMHexagonInfo.a lib64/libLLVMMipsAsmPrinter.a lib64/libLLVMMipsInfo.a lib64/libLLVMMSP430AsmPrinter.a lib64/libLLVMNVPTXAsmPrinter.a lib64/libLLVMPowerPCAsmPrinter.a lib64/libLLVMPowerPCInfo.a lib64/libLLVMR600AsmPrinter.a lib64/libLLVMSparcAsmPrinter.a lib64/libLLVMSparcInfo.a lib64/libLLVMSystemZDesc.a lib64/libLLVMSystemZAsmPrinter.a lib64/libLLVMSystemZInfo.a lib64/libLLVMX86CodeGen.a lib64/libLLVMX86Desc.a lib64/libLLVMX86AsmPrinter.a lib64/libLLVMX86Utils.a lib64/libLLVMX86Info.a lib64/libLLVMXCoreAsmPrinter.a lib64/libLLVMAsmPrinter.a lib64/libLLVMSelectionDAG.a lib64/libLLVMCodeGen.a lib64/libLLVMTarget.a lib64/libLLVMXCoreInfo.a lib64/libLLVMMCDisassembler.a lib64/libclangCodeGen.a lib64/libLLVMipo.a lib64/libLLVMVectorize.a lib64/libLLVMInstrumentation.a lib64/libLLVMObjCARCOpts.a lib64/libLLVMScalarOpts.a lib64/libLLVMInstCombine.a lib64/libLLVMProfileData.a lib64/libLLVMObject.a lib64/libLLVMBitWriter.a lib64/libLLVMIRReader.a lib64/libLLVMAsmParser.a lib64/libLLVMLinker.a lib64/libLLVMTransformUtils.a lib64/libLLVMipa.a lib64/libLLVMAnalysis.a lib64/libclangRewriteFrontend.a lib64/libclangARCMigrate.a lib64/libclangStaticAnalyzerFrontend.a lib64/libclangFrontend.a lib64/libclangDriver.a lib64/libLLVMOption.a lib64/libclangParse.a lib64/libLLVMMCParser.a lib64/libclangSerialization.a lib64/libclangSema.a lib64/libclangEdit.a lib64/libLLVMBitReader.a lib64/libclangStaticAnalyzerCheckers.a lib64/libclangStaticAnalyzerCore.a lib64/libclangAnalysis.a lib64/libclangAST.a lib64/libclangRewrite.a lib64/libclangLex.a lib64/libclangBasic.a lib64/libLLVMCore.a lib64/libLLVMMC.a lib64/libLLVMSupport.a -lrt -ldl -ltinfo -lpthread -lz -lm -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crtn.o' (8 runs):

      15052.141297      task-clock (msec)         #    0.999 CPUs utilized            ( +-  0.26% )
                 7      context-switches          #    0.000 K/sec                    ( +-  4.39% )
                 0      cpu-migrations            #    0.000 K/sec                  
           821,628      page-faults               #    0.055 M/sec                  
    47,127,013,923      cycles                    #    3.131 GHz                      ( +-  0.05% )
    23,718,027,798      stalled-cycles-frontend   #   50.33% frontend cycles idle     ( +-  0.10% )
                 0      stalled-cycles-backend    #    0.00% backend  cycles idle   
    62,732,266,692      instructions              #    1.33  insns per cycle        
                                                  #    0.38  stalled cycles per insn  ( +-  0.00% )
    10,375,105,421      branches                  #  689.278 M/sec                    ( +-  0.00% )
       218,491,057      branch-misses             #    2.11% of all branches          ( +-  0.00% )

      15.062255593 seconds time elapsed                                          ( +-  0.26% )

 Performance counter stats for '/home/espindola/binutils/ld-patch --hash-style=gnu --no-add-needed --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o bin/clang-3.7 /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64 -L/home/espindola/inst/clang/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../.. -L/lib -L/usr/lib -allow-shlib-undefined --export-dynamic tools/clang/tools/driver/CMakeFiles/clang.dir/driver.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1_main.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1as_main.cpp.o lib64/libLLVMAArch64CodeGen.a lib64/libLLVMAArch64AsmPrinter.a lib64/libLLVMAArch64AsmParser.a lib64/libLLVMAArch64Desc.a lib64/libLLVMAArch64Info.a lib64/libLLVMAArch64Disassembler.a lib64/libLLVMARMCodeGen.a lib64/libLLVMARMAsmPrinter.a lib64/libLLVMARMAsmParser.a lib64/libLLVMARMDesc.a lib64/libLLVMARMInfo.a lib64/libLLVMARMDisassembler.a lib64/libLLVMCppBackendCodeGen.a lib64/libLLVMCppBackendInfo.a lib64/libLLVMHexagonCodeGen.a lib64/libLLVMHexagonDesc.a lib64/libLLVMHexagonInfo.a lib64/libLLVMHexagonDisassembler.a lib64/libLLVMMipsCodeGen.a lib64/libLLVMMipsAsmPrinter.a lib64/libLLVMMipsAsmParser.a lib64/libLLVMMipsDesc.a lib64/libLLVMMipsInfo.a lib64/libLLVMMipsDisassembler.a lib64/libLLVMMSP430CodeGen.a lib64/libLLVMMSP430AsmPrinter.a lib64/libLLVMMSP430Desc.a lib64/libLLVMMSP430Info.a lib64/libLLVMNVPTXCodeGen.a lib64/libLLVMNVPTXAsmPrinter.a lib64/libLLVMNVPTXDesc.a lib64/libLLVMNVPTXInfo.a lib64/libLLVMPowerPCCodeGen.a lib64/libLLVMPowerPCAsmPrinter.a lib64/libLLVMPowerPCAsmParser.a lib64/libLLVMPowerPCDesc.a lib64/libLLVMPowerPCInfo.a lib64/libLLVMPowerPCDisassembler.a lib64/libLLVMR600CodeGen.a lib64/libLLVMR600AsmPrinter.a lib64/libLLVMR600AsmParser.a lib64/libLLVMR600Desc.a lib64/libLLVMR600Info.a lib64/libLLVMSparcCodeGen.a lib64/libLLVMSparcAsmPrinter.a lib64/libLLVMSparcAsmParser.a lib64/libLLVMSparcDesc.a lib64/libLLVMSparcInfo.a lib64/libLLVMSparcDisassembler.a lib64/libLLVMSystemZCodeGen.a lib64/libLLVMSystemZAsmPrinter.a lib64/libLLVMSystemZAsmParser.a lib64/libLLVMSystemZDesc.a lib64/libLLVMSystemZInfo.a lib64/libLLVMSystemZDisassembler.a lib64/libLLVMX86CodeGen.a lib64/libLLVMX86AsmPrinter.a lib64/libLLVMX86AsmParser.a lib64/libLLVMX86Desc.a lib64/libLLVMX86Info.a lib64/libLLVMX86Disassembler.a lib64/libLLVMXCoreCodeGen.a lib64/libLLVMXCoreAsmPrinter.a lib64/libLLVMXCoreDesc.a lib64/libLLVMXCoreInfo.a lib64/libLLVMXCoreDisassembler.a lib64/libLLVMAnalysis.a lib64/libLLVMCodeGen.a lib64/libLLVMCore.a lib64/libLLVMipa.a lib64/libLLVMipo.a lib64/libLLVMInstCombine.a lib64/libLLVMInstrumentation.a lib64/libLLVMMC.a lib64/libLLVMMCParser.a lib64/libLLVMObjCARCOpts.a lib64/libLLVMOption.a lib64/libLLVMScalarOpts.a lib64/libLLVMSupport.a lib64/libLLVMTransformUtils.a lib64/libLLVMVectorize.a lib64/libclangBasic.a lib64/libclangDriver.a lib64/libclangFrontend.a lib64/libclangFrontendTool.a lib64/libLLVMAArch64AsmPrinter.a lib64/libLLVMAArch64Info.a lib64/libLLVMAArch64Utils.a lib64/libLLVMARMDesc.a lib64/libLLVMARMAsmPrinter.a lib64/libLLVMARMInfo.a lib64/libLLVMHexagonDesc.a lib64/libLLVMHexagonInfo.a lib64/libLLVMMipsAsmPrinter.a lib64/libLLVMMipsInfo.a lib64/libLLVMMSP430AsmPrinter.a lib64/libLLVMNVPTXAsmPrinter.a lib64/libLLVMPowerPCAsmPrinter.a lib64/libLLVMPowerPCInfo.a lib64/libLLVMR600AsmPrinter.a lib64/libLLVMSparcAsmPrinter.a lib64/libLLVMSparcInfo.a lib64/libLLVMSystemZDesc.a lib64/libLLVMSystemZAsmPrinter.a lib64/libLLVMSystemZInfo.a lib64/libLLVMX86CodeGen.a lib64/libLLVMX86Desc.a lib64/libLLVMX86AsmPrinter.a lib64/libLLVMX86Utils.a lib64/libLLVMX86Info.a lib64/libLLVMXCoreAsmPrinter.a lib64/libLLVMAsmPrinter.a lib64/libLLVMSelectionDAG.a lib64/libLLVMCodeGen.a lib64/libLLVMTarget.a lib64/libLLVMXCoreInfo.a lib64/libLLVMMCDisassembler.a lib64/libclangCodeGen.a lib64/libLLVMipo.a lib64/libLLVMVectorize.a lib64/libLLVMInstrumentation.a lib64/libLLVMObjCARCOpts.a lib64/libLLVMScalarOpts.a lib64/libLLVMInstCombine.a lib64/libLLVMProfileData.a lib64/libLLVMObject.a lib64/libLLVMBitWriter.a lib64/libLLVMIRReader.a lib64/libLLVMAsmParser.a lib64/libLLVMLinker.a lib64/libLLVMTransformUtils.a lib64/libLLVMipa.a lib64/libLLVMAnalysis.a lib64/libclangRewriteFrontend.a lib64/libclangARCMigrate.a lib64/libclangStaticAnalyzerFrontend.a lib64/libclangFrontend.a lib64/libclangDriver.a lib64/libLLVMOption.a lib64/libclangParse.a lib64/libLLVMMCParser.a lib64/libclangSerialization.a lib64/libclangSema.a lib64/libclangEdit.a lib64/libLLVMBitReader.a lib64/libclangStaticAnalyzerCheckers.a lib64/libclangStaticAnalyzerCore.a lib64/libclangAnalysis.a lib64/libclangAST.a lib64/libclangRewrite.a lib64/libclangLex.a lib64/libclangBasic.a lib64/libLLVMCore.a lib64/libLLVMMC.a lib64/libLLVMSupport.a -lrt -ldl -ltinfo -lpthread -lz -lm -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.9.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../lib64/crtn.o' (8 runs):

      13904.437071      task-clock (msec)         #    0.999 CPUs utilized            ( +-  0.77% )
                 7      context-switches          #    0.001 K/sec                    ( +-  5.40% )
                 0      cpu-migrations            #    0.000 K/sec                  
           560,733      page-faults               #    0.040 M/sec                  
    43,592,881,802      cycles                    #    3.135 GHz                      ( +-  0.56% )
    21,123,566,028      stalled-cycles-frontend   #   48.46% frontend cycles idle     ( +-  1.14% )
                 0      stalled-cycles-backend    #    0.00% backend  cycles idle   
    60,840,594,530      instructions              #    1.40  insns per cycle        
                                                  #    0.35  stalled cycles per insn  ( +-  0.00% )
    10,034,573,519      branches                  #  721.681 M/sec                    ( +-  0.00% )
       204,925,814      branch-misses             #    2.04% of all branches          ( +-  0.00% )

      13.913896214 seconds time elapsed                                          ( +-  0.77% )


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]