Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 朴素矩阵乘法的优化(ICC与GCC)_C++_C_Gcc_Optimization_Icc - Fatal编程技术网

C++ 朴素矩阵乘法的优化(ICC与GCC)

C++ 朴素矩阵乘法的优化(ICC与GCC),c++,c,gcc,optimization,icc,C++,C,Gcc,Optimization,Icc,下面的代码使用一种非常简单的方法来计算矩阵乘积a*b,并将结果存储在c中。在GCC 4.4.6(使用-mtune=native)和Intel Compiler 13.0.1上,代码都是使用-O3编译的,GCC上的速度要差得多(所用样本数据的两倍以上) 我很好奇这些差异的原因,但不幸的是,我对汇编输出不够熟悉,无法理解这里发生了什么。乍一看,ICC似乎在计算矢量化方面做得更好,但我无法解释更多。(这主要是为了学习,因为我不可能在生产中使用它!) 以下是ICC的输出: # -- Begin _Z2

下面的代码使用一种非常简单的方法来计算矩阵乘积
a*b
,并将结果存储在
c
中。在GCC 4.4.6(使用
-mtune=native
)和Intel Compiler 13.0.1上,代码都是使用
-O3
编译的,GCC上的速度要差得多(所用样本数据的两倍以上)

我很好奇这些差异的原因,但不幸的是,我对汇编输出不够熟悉,无法理解这里发生了什么。乍一看,ICC似乎在计算矢量化方面做得更好,但我无法解释更多。(这主要是为了学习,因为我不可能在生产中使用它!)

以下是ICC的输出:

# -- Begin  _Z2mmiPdS_S_
# mark_begin;
       .align    16,0x90
    .globl _Z2mmiPdS_S_
_Z2mmiPdS_S_:
# parameter 1: %edi
# parameter 2: %rsi
# parameter 3: %rdx
# parameter 4: %rcx
..B1.1:                         # Preds ..B1.0
..___tag_value__Z2mmiPdS_S_.1:                                  #8.3
        pushq     %r12                                          #8.3
..___tag_value__Z2mmiPdS_S_.3:                                  #
        pushq     %r13                                          #8.3
..___tag_value__Z2mmiPdS_S_.5:                                  #
        pushq     %r14                                          #8.3
..___tag_value__Z2mmiPdS_S_.7:                                  #
        pushq     %r15                                          #8.3
..___tag_value__Z2mmiPdS_S_.9:                                  #
        pushq     %rbx                                          #8.3
..___tag_value__Z2mmiPdS_S_.11:                                 #
        pushq     %rbp                                          #8.3
..___tag_value__Z2mmiPdS_S_.13:                                 #
        subq      $72, %rsp                                     #8.3
..___tag_value__Z2mmiPdS_S_.15:                                 #
        movq      %rsi, %r9                                     #
        movslq    %edi, %rax                                    #
        xorl      %r10d, %r10d                                  #11.9
        testl     %edi, %edi                                    #11.25
        jle       ..B1.7        # Prob 10%                      #11.25
                                # LOE rax rdx rcx rbx rbp rsi r9 r12 r13 r14 r15 edi r10d
..B1.2:                         # Preds ..B1.1
        movl      %edi, %r11d                                   #10.5
        lea       (,%rax,8), %r8                                #
        andl      $-4, %r11d                                    #10.5
        movq      %rax, %r14                                    #12.28
        movslq    %r11d, %r11                                   #10.5
        movl      %edi, %r12d                                   #12.28
        movq      %rsi, 8(%rsp)                                 #12.28
        movq      %r8, %rbp                                     #12.28
        movq      %rdx, 32(%rsp)                                #12.28
        movq      %r9, %r13                                     #12.28
        movq      %rcx, (%rsp)                                  #12.28
        movl      %r10d, %r15d                                  #12.28
        pxor      %xmm0, %xmm0                                  #12.28
        movq      %r11, %rbx                                    #12.28
                                # LOE rbx rbp r13 r14 r12d r15d
..B1.3:                         # Preds ..B1.5 ..B1.48 ..B1.45 ..B1.2
        cmpl      $12, %r12d                                    #10.5
        jle       ..B1.38       # Prob 0%                       #10.5
                                # LOE rbx rbp r13 r14 r12d r15d
..B1.4:                         # Preds ..B1.3
        movq      %r13, %rdi                                    #12.13
        xorl      %esi, %esi                                    #12.13
        movq      %rbp, %rdx                                    #12.13
        call      _intel_fast_memset                            #12.13
                                # LOE rbx rbp r13 r14 r12d r15d
..B1.5:                         # Preds ..B1.4
        incl      %r15d                                         #11.9
        lea       (%r13,%r14,8), %r13                           #11.9
        cmpl      %r12d, %r15d                                  #11.9
        jb        ..B1.3        # Prob 82%                      #11.9
                                # LOE rbx rbp r13 r14 r12d r15d
..B1.6:                         # Preds ..B1.48 ..B1.45 ..B1.5  # Infreq
        movl      %r12d, %edi                                   #
        movq      %r14, %rax                                    #
        movq      8(%rsp), %rsi                                 #
        testl     %edi, %edi                                    #11.25
        movq      32(%rsp), %rdx                                #
        movq      (%rsp), %rcx                                  #
                                # LOE rax rdx rcx rbx rbp rsi r12 r13 r14 r15 edi
..B1.7:                         # Preds ..B1.1 ..B1.6           # Infreq
        movl      $0, %r9d                                      #11.9
        movl      $0, %r8d                                      #
        jle       ..B1.33       # Prob 10%                      #11.25
                                # LOE rax rdx rcx rbx rbp rsi r8 r12 r13 r14 r15 edi r9d
..B1.8:                         # Preds ..B1.7                  # Infreq
        movq      %rdx, 32(%rsp)                                #
                                # LOE rax rcx rsi r8 edi r9d
..B1.9:                         # Preds ..B1.31 ..B1.8          # Infreq
        xorl      %r12d, %r12d                                  #
        lea       (%rsi,%r8,8), %r13                            #14.17
        movq      %r13, %r15                                    #10.5
        xorl      %ebx, %ebx                                    #13.13
        andq      $15, %r15                                     #10.5
        xorl      %r10d, %r10d                                  #
        movl      %r15d, %r14d                                  #10.5
        lea       (%rcx,%r8,8), %rbp                            #14.48
        andl      $7, %r14d                                     #10.5
        xorl      %r11d, %r11d                                  #
        movl      %r14d, 48(%rsp)                               #
        xorl      %edx, %edx                                    #
        movl      %r15d, 56(%rsp)                               #
        movq      %r13, 40(%rsp)                                #
        movq      %r8, 16(%rsp)                                 #
        movl      %r9d, 24(%rsp)                                #
        movq      %rsi, 8(%rsp)                                 #
        movq      %rcx, (%rsp)                                  #
        movq      32(%rsp), %r14                                #
                                # LOE rax rdx rbp r10 r12 r14 ebx edi r11d
..B1.10:                        # Preds ..B1.30 ..B1.9          # Infreq
        cmpq      $8, %rax                                      #10.5
        jl        ..B1.34       # Prob 10%                      #10.5
                                # LOE rax rdx rbp r10 r12 r14 ebx edi r11d
..B1.11:                        # Preds ..B1.10                 # Infreq
        movl      56(%rsp), %r9d                                #10.5
        testl     %r9d, %r9d                                    #10.5
        je        ..B1.14       # Prob 50%                      #10.5
                                # LOE rax rdx rbp r9 r10 r12 r14 ebx edi r11d
..B1.12:                        # Preds ..B1.11                 # Infreq
        cmpl      $0, 48(%rsp)                                  #10.5
        jne       ..B1.34       # Prob 10%                      #10.5
                                # LOE rax rdx rbp r10 r12 r14 ebx edi r11d
..B1.13:                        # Preds ..B1.12                 # Infreq
        movl      $1, %r9d                                      #10.5
                                # LOE rax rdx rbp r9 r10 r12 r14 ebx edi r11d
..B1.14:                        # Preds ..B1.13 ..B1.11         # Infreq
        movl      %r9d, %r13d                                   #10.5
        lea       8(%r13), %rcx                                 #10.5
        cmpq      %rcx, %rax                                    #10.5
        jl        ..B1.34       # Prob 10%                      #10.5
                                # LOE rax rdx rbp r9 r10 r12 r13 r14 ebx edi r11d
..B1.15:                        # Preds ..B1.14                 # Infreq
        movl      %edi, %r15d                                   #10.5
        xorl      %ecx, %ecx                                    #10.5
        subl      %r9d, %r15d                                   #10.5
        movslq    %r11d, %r8                                    #14.33
        andl      $7, %r15d                                     #10.5
        negl      %r15d                                         #10.5
        addl      %edi, %r15d                                   #10.5
        movslq    %r15d, %r15                                   #10.5
        testq     %r13, %r13                                    #10.5
        lea       (%r14,%r8,8), %rsi                            #14.33
        jbe       ..B1.35       # Prob 0%                       #10.5
                                # LOE rax rdx rcx rbp rsi r8 r9 r10 r12 r13 r14 r15 ebx edi r11d
..B1.16:                        # Preds ..B1.15                 # Infreq
        movsd     (%r10,%rbp), %xmm0                            #14.48
        movq      40(%rsp), %r14                                #14.48
                                # LOE rax rdx rcx rbp rsi r8 r9 r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.17:                        # Preds ..B1.17 ..B1.16         # Infreq
        movsd     (%rsi,%rcx,8), %xmm1                          #14.33
        mulsd     %xmm0, %xmm1                                  #14.48
        addsd     (%r14,%rcx,8), %xmm1                          #14.17
        movsd     %xmm1, (%r14,%rcx,8)                          #14.17
        incq      %rcx                                          #10.5
        cmpq      %r13, %rcx                                    #10.5
        jb        ..B1.17       # Prob 82%                      #10.5
                                # LOE rax rdx rcx rbp rsi r8 r9 r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.18:                        # Preds ..B1.17                 # Infreq
        movq      32(%rsp), %r14                                #
                                # LOE rax rdx rbp rsi r8 r9 r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.19:                        # Preds ..B1.18 ..B1.35         # Infreq
        addq      %r9, %r8                                      #14.33
        lea       (%r14,%r8,8), %rcx                            #14.33
        testq     $15, %rcx                                     #10.5
        je        ..B1.23       # Prob 60%                      #10.5
                                # LOE rax rdx rbp rsi r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.20:                        # Preds ..B1.19                 # Infreq
        movq      40(%rsp), %rcx                                #14.48
        unpcklpd  %xmm0, %xmm0                                  #14.48
                                # LOE rax rdx rcx rbp rsi r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.21:                        # Preds ..B1.21 ..B1.20         # Infreq
        movsd     (%rsi,%r13,8), %xmm1                          #14.33
        movsd     16(%rsi,%r13,8), %xmm2                        #14.33
        movsd     32(%rsi,%r13,8), %xmm3                        #14.33
        movsd     48(%rsi,%r13,8), %xmm4                        #14.33
        movhpd    8(%rsi,%r13,8), %xmm1                         #14.33
        movhpd    24(%rsi,%r13,8), %xmm2                        #14.33
        movhpd    40(%rsi,%r13,8), %xmm3                        #14.33
        movhpd    56(%rsi,%r13,8), %xmm4                        #14.33
        mulpd     %xmm0, %xmm1                                  #14.48
        mulpd     %xmm0, %xmm2                                  #14.48
        mulpd     %xmm0, %xmm3                                  #14.48
        mulpd     %xmm0, %xmm4                                  #14.48
        addpd     (%rcx,%r13,8), %xmm1                          #14.17
        addpd     16(%rcx,%r13,8), %xmm2                        #14.17
        addpd     32(%rcx,%r13,8), %xmm3                        #14.17
        addpd     48(%rcx,%r13,8), %xmm4                        #14.17
        movaps    %xmm1, (%rcx,%r13,8)                          #14.17
        movaps    %xmm2, 16(%rcx,%r13,8)                        #14.17
        movaps    %xmm3, 32(%rcx,%r13,8)                        #14.17
        movaps    %xmm4, 48(%rcx,%r13,8)                        #14.17
        addq      $8, %r13                                      #10.5
        cmpq      %r15, %r13                                    #10.5
        jb        ..B1.21       # Prob 82%                      #10.5
        jmp       ..B1.26       # Prob 100%                     #10.5
                                # LOE rax rdx rcx rbp rsi r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.23:                        # Preds ..B1.19                 # Infreq
        movq      40(%rsp), %rcx                                #14.48
        unpcklpd  %xmm0, %xmm0                                  #14.48
        .align    16,0x90
                                # LOE rax rdx rcx rbp rsi r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.24:                        # Preds ..B1.24 ..B1.23         # Infreq
        movaps    (%rsi,%r13,8), %xmm1                          #14.33
        movaps    16(%rsi,%r13,8), %xmm2                        #14.33
        movaps    32(%rsi,%r13,8), %xmm3                        #14.33
        movaps    48(%rsi,%r13,8), %xmm4                        #14.33
        mulpd     %xmm0, %xmm1                                  #14.48
        mulpd     %xmm0, %xmm2                                  #14.48
        mulpd     %xmm0, %xmm3                                  #14.48
        mulpd     %xmm0, %xmm4                                  #14.48
        addpd     (%rcx,%r13,8), %xmm1                          #14.17
        addpd     16(%rcx,%r13,8), %xmm2                        #14.17
        addpd     32(%rcx,%r13,8), %xmm3                        #14.17
        addpd     48(%rcx,%r13,8), %xmm4                        #14.17
        movaps    %xmm1, (%rcx,%r13,8)                          #14.17
        movaps    %xmm2, 16(%rcx,%r13,8)                        #14.17
        movaps    %xmm3, 32(%rcx,%r13,8)                        #14.17
        movaps    %xmm4, 48(%rcx,%r13,8)                        #14.17
        addq      $8, %r13                                      #10.5
        cmpq      %r15, %r13                                    #10.5
        jb        ..B1.24       # Prob 82%                      #10.5
                                # LOE rax rdx rcx rbp rsi r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.26:                        # Preds ..B1.24 ..B1.21 ..B1.34 # Infreq
        cmpq      %rax, %r15                                    #10.5
        jae       ..B1.30       # Prob 0%                       #10.5
                                # LOE rax rdx rbp r10 r12 r14 r15 ebx edi r11d
..B1.27:                        # Preds ..B1.26                 # Infreq
        movsd     (%rbp,%r12,8), %xmm0                          #14.48
        lea       (%r14,%rdx,8), %rcx                           #14.33
        movq      40(%rsp), %rsi                                #14.48
                                # LOE rax rdx rcx rbp rsi r10 r12 r14 r15 ebx edi r11d xmm0
..B1.28:                        # Preds ..B1.28 ..B1.27         # Infreq
        movsd     (%rcx,%r15,8), %xmm1                          #14.33
        mulsd     %xmm0, %xmm1                                  #14.48
        addsd     (%rsi,%r15,8), %xmm1                          #14.17
        movsd     %xmm1, (%rsi,%r15,8)                          #14.17
        incq      %r15                                          #10.5
        cmpq      %rax, %r15                                    #10.5
        jb        ..B1.28       # Prob 82%                      #10.5
                                # LOE rax rdx rcx rbp rsi r10 r12 r14 r15 ebx edi r11d xmm0
..B1.30:                        # Preds ..B1.28 ..B1.26         # Infreq
        incl      %ebx                                          #13.13
        addq      %rax, %rdx                                    #13.13
        addl      %edi, %r11d                                   #13.13
        addq      $8, %r10                                      #13.13
        incq      %r12                                          #13.13
        cmpl      %edi, %ebx                                    #13.13
        jb        ..B1.10       # Prob 82%                      #13.13
                                # LOE rax rdx rbp r10 r12 r14 ebx edi r11d
..B1.31:                        # Preds ..B1.30                 # Infreq
        movl      24(%rsp), %r9d                                #
        incl      %r9d                                          #11.9
        movq      16(%rsp), %r8                                 #
        addq      %rax, %r8                                     #11.9
        movq      8(%rsp), %rsi                                 #
        cmpl      %edi, %r9d                                    #11.9
        movq      (%rsp), %rcx                                  #
        jb        ..B1.9        # Prob 82%                      #11.9
                                # LOE rax rcx rsi r8 edi r9d
..B1.33:                        # Preds ..B1.31 ..B1.7          # Infreq
        addq      $72, %rsp                                     #18.1
..___tag_value__Z2mmiPdS_S_.16:                                 #
        popq      %rbp                                          #18.1
..___tag_value__Z2mmiPdS_S_.18:                                 #
        popq      %rbx                                          #18.1
..___tag_value__Z2mmiPdS_S_.20:                                 #
        popq      %r15                                          #18.1
..___tag_value__Z2mmiPdS_S_.22:                                 #
        popq      %r14                                          #18.1
..___tag_value__Z2mmiPdS_S_.24:                                 #
        popq      %r13                                          #18.1
..___tag_value__Z2mmiPdS_S_.26:                                 #
        popq      %r12                                          #18.1
..___tag_value__Z2mmiPdS_S_.28:                                 #
        ret                                                     #18.1
..___tag_value__Z2mmiPdS_S_.29:                                 #
                                # LOE
..B1.34:                        # Preds ..B1.10 ..B1.14 ..B1.12 # Infreq
        xorl      %r15d, %r15d                                  #10.5
        jmp       ..B1.26       # Prob 100%                     #10.5
                                # LOE rax rdx rbp r10 r12 r14 r15 ebx edi r11d
..B1.35:                        # Preds ..B1.15                 # Infreq
        movsd     (%rbp,%r12,8), %xmm0                          #14.48
        jmp       ..B1.19       # Prob 100%                     #14.48
                                # LOE rax rdx rbp rsi r8 r9 r10 r12 r13 r14 r15 ebx edi r11d xmm0
..B1.38:                        # Preds ..B1.3                  # Infreq
        cmpq      $4, %r14                                      #10.5
        jl        ..B1.47       # Prob 10%                      #10.5
                                # LOE rbx rbp r13 r14 r12d r15d
..B1.39:                        # Preds ..B1.38                 # Infreq
        xorl      %esi, %esi                                    #10.5
        movq      %rbx, %rdx                                    #10.5
        movq      %r13, %rcx                                    #
        xorl      %eax, %eax                                    #
        pxor      %xmm0, %xmm0                                  #
                                # LOE rax rdx rcx rbx rbp rsi r13 r14 r12d r15d xmm0
..B1.40:                        # Preds ..B1.40 ..B1.39         # Infreq
        addq      $4, %rsi                                      #10.5
        movq      %rax, (%rcx)                                  #12.13
        movhpd    %xmm0, 8(%rcx)                                #12.13
        movq      %rax, 16(%rcx)                                #12.13
        movhpd    %xmm0, 24(%rcx)                               #12.13
        addq      $32, %rcx                                     #10.5
        cmpq      %rbx, %rsi                                    #10.5
        jb        ..B1.40       # Prob 82%                      #10.5
                                # LOE rax rdx rcx rbx rbp rsi r13 r14 r12d r15d xmm0
..B1.42:                        # Preds ..B1.40 ..B1.47         # Infreq
        cmpq      %r14, %rdx                                    #10.5
        jae       ..B1.48       # Prob 0%                       #10.5
                                # LOE rdx rbx rbp r13 r14 r12d r15d
..B1.43:                        # Preds ..B1.42                 # Infreq
        xorl      %ecx, %ecx                                    #
                                # LOE rdx rcx rbx rbp r13 r14 r12d r15d
..B1.44:                        # Preds ..B1.44 ..B1.43         # Infreq
        movq      %rcx, (%r13,%rdx,8)                           #12.13
        incq      %rdx                                          #10.5
        cmpq      %r14, %rdx                                    #10.5
        jb        ..B1.44       # Prob 82%                      #10.5
                                # LOE rdx rcx rbx rbp r13 r14 r12d r15d
..B1.45:                        # Preds ..B1.44                 # Infreq
        incl      %r15d                                         #11.9
        lea       (%r13,%r14,8), %r13                           #11.9
        cmpl      %r12d, %r15d                                  #11.9
        jb        ..B1.3        # Prob 82%                      #11.9
        jmp       ..B1.6        # Prob 100%                     #11.9
                                # LOE rbx rbp r13 r14 r12d r15d
..B1.47:                        # Preds ..B1.38                 # Infreq
        xorl      %edx, %edx                                    #10.5
        jmp       ..B1.42       # Prob 100%                     #10.5
                                # LOE rdx rbx rbp r13 r14 r12d r15d
..B1.48:                        # Preds ..B1.42                 # Infreq
        incl      %r15d                                         #11.9
        lea       (%r13,%r14,8), %r13                           #11.9
        cmpl      %r12d, %r15d                                  #11.9
        jb        ..B1.3        # Prob 82%                      #11.9
        jmp       ..B1.6        # Prob 100%                     #11.9
        .align    16,0x90
..___tag_value__Z2mmiPdS_S_.36:                                 #
                                # LOE rbx rbp r13 r14 r12d r15d
# mark_end;
    .type   _Z2mmiPdS_S_,@function
    .size   _Z2mmiPdS_S_,.-_Z2mmiPdS_S_
    .data
# -- End  _Z2mmiPdS_S_
编辑:在Olaf Dietsche的帮助下,下面的代码似乎可以在GCC 4.8.2中运行得更快,尽管仍然比Intel慢一点(~30%)。主要区别在于,初始化是提前完成的(这本身没有什么区别),循环顺序是互换的(这对GCC来说是一个主要区别)

memset(c,0,n*n);
对于(j=0;j
我不确定ICC在这种情况下是否真的能产生更快的代码,因为我没有运行任何实际的基准测试。但是您可以告诉GCC使用
-funroll循环展开循环。输出将更长,将包含大量xmm,并且看起来更快。

看起来英特尔编译器正在使用SIMD指令(
mulpd
addpd
movaps
等)——它能够在一个时钟周期内执行多个操作(即a=b*c和d=e*f),而GCC代码需要两个用户才能完成相同的操作。。我不确定是否有可能在GCC中自动启用这些操作,但您可以通过一些工作手工编写它们


GCC的标志-msse、-msse2、-msse3似乎导致它尝试自己进行一些SIMD优化。

您的代码似乎错误或不适合矢量化

当我根据这篇博文修改你的代码时

inti,j,k;
对于(i=0;i
并用

gcc-4.8 -O3 -S a.c
它至少使用了一些SIMD指令

.L8:
    movsd    (%rcx), %xmm1
    addl     $1, %r8d
    movsd    (%rdx,%rsi), %xmm2
    unpcklpd %xmm1, %xmm1
    movhpd   8(%rdx,%rsi), %xmm2
    movsd    (%rax,%rsi), %xmm0
    mulpd    %xmm2, %xmm1
    movhpd   8(%rax,%rsi), %xmm0
    addpd    %xmm1, %xmm0
    movlpd   %xmm0, (%rax,%rsi)
    movhpd   %xmm0, 8(%rax,%rsi)
    addq     $16, %rsi
    cmpl     %r8d, %ebx
    ja       .L8
    cmpl     %edi, %r15d
    je       .L9
虽然没有国际刑事法院那么多

更新:


添加
-funroll循环
会将生成的程序集代码大幅放大到发布的ICC程序集的长度。

ICC和gcc都不一定会优化展开程度。要匹配它们,您将使用例如。 gcc-funroll循环--参数最大展开次数=4 国际商会-展开4 因为gcc倾向于在过去8年中(如果允许的话)对CPU的展开超过最佳值,而icc则更为保守。 上面还提到icc-O3鼓励编译器优化循环嵌套,甚至可能使用特殊的opt matmul工具。
原始形式意味着一个点积缩减内循环,对于该循环,gcc可能需要-ffast数学和更现代的-march=选择,以便进行优化。如果icc无法通过切换循环嵌套来避免点积,那么它在重新填充点积(批处理为多个和)方面更具攻击性。

icc假设“-ffast math”,但gcc不这样做。如果您想要良好的矩阵操作,请尝试“英特尔MKL”。我只是以这段代码为例来理解编译器优化中的差异,对于实际的矩阵乘法,情况并非如此。在这里使用
-ffast math
似乎不会影响速度,并且程序集输出也几乎相同。您的gcc输出显然没有矢量化。mulsd是低64位的一次乘法[用于gcc输出]。相比之下,mulpd是一种压缩乘法(一次2个乘法-低乘低,高乘高)[用于icc]。我认为这是主要的区别。由于在ICC中使用SIMD,您运行的乘法指令是原来的一半。循环展开有帮助,但主要效果来自SIMD。请参阅此处,查看是否可以使用gcc打开它:。注意O3本身是不够的,因为它不知道要使用什么指令集,也就是说ICC自动矢量化了代码。GCC也可以,通过
-ftree矢量化
,并告诉它使用什么级别的SSE,例如
-msse2
。是的,确实如此。感谢使用GCC标志的提示,我以前编写的所有SIMD代码都是用手动方式完成的,例如
\u mm\u add\u ps
,其ilkgcc的自动矢量化还不太成熟。它在很多情况下都不能正常工作。看起来这就是其中之一,虽然看起来很简单。在手臂上,我看到它比我能做的更好,但出于某种原因,这让它打了个嗝。关于代码的形式。我试过使用
-msseN
,遗憾的是,在这种情况下,它并没有显著影响性能。(另外,
-ftree vectorize
-O3
暗示)唉,在这种情况下,它对实际速度的影响似乎可以忽略不计。这确实大大提高了速度!尽管仍有一点落后,但现在速度更接近了(约30%)。与往常一样,
-funroll循环在这里的作用可以忽略不计。但是,这真的会产生相同的结果吗?也许现在,您会看到
-msse3
或更高版本的性能差异。我修复了初始化(第12行)。但是初始化仍然是错误的,因为您使用的变量
k
位于内部作用域中。我想我已经猜出来了,看我编辑的问题。哦,你是对的。我删除了初始化altog
    memset(c, 0, n * n);
    for (j = 0; j < n; j++) {
        for (k = 0; k < n; k++) {
            for (i = 0; i < n; i++) {
                c[i + n * j] += a[i + n * k] * b[k + n * j];   // Line 14       
            }
        }
    }
gcc-4.8 -O3 -S a.c
.L8:
    movsd    (%rcx), %xmm1
    addl     $1, %r8d
    movsd    (%rdx,%rsi), %xmm2
    unpcklpd %xmm1, %xmm1
    movhpd   8(%rdx,%rsi), %xmm2
    movsd    (%rax,%rsi), %xmm0
    mulpd    %xmm2, %xmm1
    movhpd   8(%rax,%rsi), %xmm0
    addpd    %xmm1, %xmm0
    movlpd   %xmm0, (%rax,%rsi)
    movhpd   %xmm0, 8(%rax,%rsi)
    addq     $16, %rsi
    cmpl     %r8d, %ebx
    ja       .L8
    cmpl     %edi, %r15d
    je       .L9