为什么 OpenMP SIMD 指令会降低性能?

2024-03-23

我正在学习如何在 OpenMP/Fortran 中使用 SIMD 指令。我 写了简单的代码:

program loop
      implicit none
      integer      :: i,j
      real*8       :: x

      x = 0.0

      do i=1,10000
           do j=1,10000000
                x = x + 1.0/(1.0*i)
           enddo
      enddo

      print*, x


end program loop

当我编译这段代码并运行它时,我得到:

ifort -O3 -vec-report3 -xhost loop_simd.f90 
loop_simd.f90(10): (col. 12) remark: LOOP WAS VECTORIZED
loop_simd.f90(9): (col. 7) remark: loop was not vectorized: not inner loop

time ./a.out 
   97876060.8355515     

real    0m8.940s
user    0m8.937s
sys 0m0.005s

我做了编译器关于“非内部循环”的建议,并且 添加了 SIMD crash(2) 指令:

program loop
      implicit none
      integer      :: i,j
      real*8       :: x

      x = 0.0

!$omp simd collapse(2) reduction(+:x)
      do i=1,10000
           do j=1,10000000
                x = x + 1.0/(1.0*i)
           enddo
      enddo

      print*, x


end program loop

然后我再次编译并运行代码,得到以下结果 输出:

ifort -O3 -vec-report3 -openmp -xhost loop_simd.f90 
loop_simd.f90(8): (col. 7) remark: OpenMP SIMD LOOP WAS VECTORIZED

time ./a.out 
   97876054.9903757     

real    0m26.535s
user    0m26.540s
sys 0m0.003s

我不知道为什么SIMD性能会下降? 什么时候 SIMD 会比标准 Fortran 代码更好?

    .section .text
.LNDBG_TX:
# mark_description "Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.2.144 Build 2";
# mark_description "0140120";
# mark_description "-O3 -vec-report3 -openmp -xhost -S";
    .file "loop_simd.f90"
    .text
..TXTST0:
L__routine_start_MAIN___0:
# -- Begin  MAIN__
# mark_begin;
       .align    16,0x90
    .globl MAIN__
MAIN__:
..B1.1:                         # Preds ..B1.0
..___tag_value_MAIN__.1:                                        #1.9
..LN0:
  .file   1 "loop_simd.f90"
   .loc    1  1  is_stmt 1
        pushq     %rbp                                          #1.9
..___tag_value_MAIN__.3:                                        #
..LN1:
        movq      %rsp, %rbp                                    #1.9
..___tag_value_MAIN__.4:                                        #
..LN2:
        andq      $-128, %rsp                                   #1.9
..LN3:
        subq      $128, %rsp                                    #1.9
..LN4:
        movq      $0x0000117fe, %rsi                            #1.9
..LN5:
        movl      $3, %edi                                      #1.9
..LN6:
        call      __intel_new_feature_proc_init                 #1.9
..LN7:
                                # LOE rbx r12 r13 r14 r15
..B1.12:                        # Preds ..B1.1
..LN8:
        vstmxcsr  (%rsp)                                        #1.9
..LN9:
        movl      $.2.3_2_kmpc_loc_struct_pack.1, %edi          #1.9
..LN10:
        xorl      %esi, %esi                                    #1.9
..LN11:
        orl       $32832, (%rsp)                                #1.9
..LN12:
        xorl      %eax, %eax                                    #1.9
..LN13:
        vldmxcsr  (%rsp)                                        #1.9
..___tag_value_MAIN__.6:                                        #1.9
..LN14:
        call      __kmpc_begin                                  #1.9
..___tag_value_MAIN__.7:                                        #
..LN15:
                                # LOE rbx r12 r13 r14 r15
..B1.2:                         # Preds ..B1.12
..LN16:
        movl      $__NLITPACK_0.0.1, %edi                       #1.9
..LN17:
        call      for_set_reentrancy                            #1.9
..LN18:
                                # LOE rbx r12 r13 r14 r15
..B1.3:                         # Preds ..B1.2
..LN19:
   .loc    1  8  is_stmt 1
        movl      $4, %eax                                      #8.7
..LN20:
   .loc    1  6  is_stmt 1
        vxorpd    %ymm2, %ymm2, %ymm2                           #6.7
..LN21:
   .loc    1  8  is_stmt 1
        vmovd     %eax, %xmm0                                   #8.7
..LN22:
        xorl      %eax, %eax                                    #8.7
..LN23:
        vpshufd   $0, %xmm0, %xmm1                              #8.7
..LN24:
        vmovdqu   .L_2il0floatpacket.19(%rip), %xmm0            #8.7
..LN25:
                                # LOE rbx r12 r13 r14 r15 eax xmm0 xmm1 ymm2
..B1.4:                         # Preds ..B1.6 ..B1.3
..LN26:
   .loc    1  11  is_stmt 1
        vcvtdq2ps %xmm0, %xmm3                                  #11.34
..LN27:
        vrcpps    %xmm3, %xmm5                                  #11.28
..LN28:
        vmulps    %xmm3, %xmm5, %xmm4                           #11.28
..LN29:
        vaddps    %xmm5, %xmm5, %xmm6                           #11.28
..LN30:
        vmulps    %xmm5, %xmm4, %xmm7                           #11.28
..LN31:
   .loc    1  10  is_stmt 1
        xorl      %edx, %edx                                    #10.12
..LN32:
   .loc    1  11  is_stmt 1
        vsubps    %xmm7, %xmm6, %xmm8                           #11.28
..LN33:
        vcvtps2pd %xmm8, %ymm3                                  #11.28
..LN34:
                                # LOE rbx r12 r13 r14 r15 eax edx xmm0 xmm1 ymm2 ymm3
..B1.5:                         # Preds ..B1.5 ..B1.4
..LN35:
   .loc    1  10  is_stmt 1
        incl      %edx                                          #10.12
..LN36:
   .loc    1  11  is_stmt 1
        vaddpd    %ymm3, %ymm2, %ymm2                           #11.17
..LN37:
   .loc    1  10  is_stmt 1
        cmpl      $10000000, %edx                               #10.12
..LN38:
        jb        ..B1.5        # Prob 99%                      #10.12
..LN39:
                                # LOE rbx r12 r13 r14 r15 eax edx xmm0 xmm1 ymm2 ymm3
..B1.6:                         # Preds ..B1.5
..LN40:
   .loc    1  8  is_stmt 1
        addl      $4, %eax                                      #8.7
..LN41:
   .loc    1  10  is_stmt 1
        vpaddd    %xmm1, %xmm0, %xmm0                           #10.12
..LN42:
   .loc    1  8  is_stmt 1
        cmpl      $10000, %eax                                  #8.7
..LN43:
        jb        ..B1.4        # Prob 66%                      #8.7
..LN44:
                                # LOE rbx r12 r13 r14 r15 eax xmm0 xmm1 ymm2
..B1.7:                         # Preds ..B1.6
..LN45:
   .loc    1  6  is_stmt 1
..LN46:
   .loc    1  15  is_stmt 1
        lea       (%rsp), %rdi                                  #15.7
..LN47:
   .loc    1  6  is_stmt 1
        vextractf128 $1, %ymm2, %xmm0                           #6.7
..LN48:
   .loc    1  15  is_stmt 1
        movl      $-1, %esi                                     #15.7
..LN49:
   .loc    1  6  is_stmt 1
        vaddpd    %xmm0, %xmm2, %xmm1                           #6.7
..LN50:
        vunpckhpd %xmm1, %xmm1, %xmm3                           #6.7
..LN51:
   .loc    1  15  is_stmt 1
        lea       64(%rsp), %r8                                 #15.7
..LN52:
        movq      $0x1208384ff00, %rdx                          #15.7
..LN53:
        movl      $__STRLITPACK_0.0.1, %ecx                     #15.7
..LN54:
        xorl      %eax, %eax                                    #15.7
..LN55:
   .loc    1  6  is_stmt 1
        vaddsd    %xmm3, %xmm1, %xmm4                           #6.7
..LN56:
   .loc    1  15  is_stmt 1
        vmovsd    %xmm4, 64(%rsp)                               #15.7
..LN57:
        movq      $0, (%rsp)                                    #15.7
..LN58:
        vzeroupper                                              #15.7
..LN59:
        call      for_write_seq_lis                             #15.7
..LN60:
                                # LOE rbx r12 r13 r14 r15
..B1.8:                         # Preds ..B1.7
..LN61:
   .loc    1  18  is_stmt 1
        movl      $.2.3_2_kmpc_loc_struct_pack.12, %edi         #18.1
..LN62:
        xorl      %eax, %eax                                    #18.1
..___tag_value_MAIN__.8:                                        #18.1
..LN63:
        call      __kmpc_end                                    #18.1
..___tag_value_MAIN__.9:                                        #
..LN64:
                                # LOE rbx r12 r13 r14 r15
..B1.9:                         # Preds ..B1.8
..LN65:
        movl      $1, %eax                                      #18.1
..LN66:
        movq      %rbp, %rsp                                    #18.1
..LN67:
        popq      %rbp                                          #18.1
..___tag_value_MAIN__.10:                                       #
..LN68:
        ret                                                     #18.1
        .align    16,0x90
..___tag_value_MAIN__.12:                                       #
..LN69:
                                # LOE
..LN70:
# mark_end;
    .type   MAIN__,@function
    .size   MAIN__,.-MAIN__
..LNMAIN__.71:
.LNMAIN__:
    .data
    .align 4
    .align 4
.2.3_2_kmpc_loc_struct_pack.1:
    .long   0
    .long   2
    .long   0
    .long   0
    .quad   .2.3_2__kmpc_loc_pack.0
    .align 4
.2.3_2__kmpc_loc_pack.0:
    .byte   59
    .byte   117
    .byte   110
    .byte   107
    .byte   110
    .byte   111
    .byte   119
    .byte   110
    .byte   59
    .byte   77
    .byte   65
    .byte   73
    .byte   78
    .byte   95
    .byte   95
    .byte   59
    .byte   49
    .byte   59
    .byte   49
    .byte   59
    .byte   59
    .space 3, 0x00  # pad
    .align 4
.2.3_2_kmpc_loc_struct_pack.12:
    .long   0
    .long   2
    .long   0
    .long   0
    .quad   .2.3_2__kmpc_loc_pack.11
    .align 4
.2.3_2__kmpc_loc_pack.11:
    .byte   59
    .byte   117
    .byte   110
    .byte   107
    .byte   110
    .byte   111
    .byte   119
    .byte   110
    .byte   59
    .byte   77
    .byte   65
    .byte   73
    .byte   78
    .byte   95
    .byte   95
    .byte   59
    .byte   49
    .byte   56
    .byte   59
    .byte   49
    .byte   56
    .byte   59
    .byte   59
    .section .rodata, "a"
    .align 16
    .align 8
__NLITPACK_0.0.1:
    .long   0x00000002,0x00000000
    .align 4
__STRLITPACK_0.0.1:
    .byte   48
    .byte   1
    .byte   1
    .byte   0
    .byte   0
    .data
# -- End  MAIN__
    .section .rodata, "a"
    .space 3, 0x00  # pad
    .align 16
.L_2il0floatpacket.19:
    .long   0x00000001,0x00000002,0x00000003,0x00000004
    .type   .L_2il0floatpacket.19,@object
    .size   .L_2il0floatpacket.19,16
    .align 16
.L_2il0floatpacket.20:
    .long   0x3f800000,0x3f800000,0x3f800000,0x3f800000
    .type   .L_2il0floatpacket.20,@object
    .size   .L_2il0floatpacket.20,16
    .data
    .section .note.GNU-stack, ""
# End

非 openmp 代码的 ASM 输出

    .section .text
.LNDBG_TX:
# mark_description "Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.2.144 Build 2";
# mark_description "0140120";
# mark_description "-O3 -vec-report3 -xhost -S";
    .file "loop_simd.f90"
    .text
..TXTST0:
L__routine_start_MAIN___0:
# -- Begin  MAIN__
# mark_begin;
       .align    16,0x90
    .globl MAIN__
MAIN__:
..B1.1:                         # Preds ..B1.0
..___tag_value_MAIN__.1:                                        #1.9
..LN0:
  .file   1 "loop_simd.f90"
   .loc    1  1  is_stmt 1
        pushq     %rbp                                          #1.9
..___tag_value_MAIN__.3:                                        #
..LN1:
        movq      %rsp, %rbp                                    #1.9
..___tag_value_MAIN__.4:                                        #
..LN2:
        andq      $-128, %rsp                                   #1.9
..LN3:
        subq      $128, %rsp                                    #1.9
..LN4:
        movq      $0x0000117fe, %rsi                            #1.9
..LN5:
        movl      $3, %edi                                      #1.9
..LN6:
        call      __intel_new_feature_proc_init                 #1.9
..LN7:
                                # LOE rbx r12 r13 r14 r15
..B1.10:                        # Preds ..B1.1
..LN8:
        vstmxcsr  (%rsp)                                        #1.9
..LN9:
        movl      $__NLITPACK_0.0.1, %edi                       #1.9
..LN10:
        orl       $32832, (%rsp)                                #1.9
..LN11:
        vldmxcsr  (%rsp)                                        #1.9
..LN12:
        call      for_set_reentrancy                            #1.9
..LN13:
                                # LOE rbx r12 r13 r14 r15
..B1.2:                         # Preds ..B1.10
..LN14:
   .loc    1  6  is_stmt 1
..LN15:
   .loc    1  11  is_stmt 1
        vmovss    .L_2il0floatpacket.0(%rip), %xmm6             #11.28
..LN16:
   .loc    1  9  is_stmt 1
        xorl      %eax, %eax                                    #9.7
..LN17:
   .loc    1  6  is_stmt 1
        vxorpd    %ymm8, %ymm8, %ymm8                           #6.7
..LN18:
        vmovapd   %ymm8, %ymm7                                  #6.7
..LN19:
        vmovapd   %ymm8, %ymm0                                  #6.7
..LN20:
        vmovapd   %ymm8, %ymm1                                  #6.7
..LN21:
        vmovapd   %ymm8, %ymm2                                  #6.7
..LN22:
        vmovapd   %ymm8, %ymm3                                  #6.7
..LN23:
        vmovapd   %ymm8, %ymm4                                  #6.7
..LN24:
        vmovapd   %ymm8, %ymm5                                  #6.7
..LN25:
                                # LOE rbx r12 r13 r14 r15 eax xmm6 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm7 ymm8
..B1.3:                         # Preds ..B1.5 ..B1.2
..LN26:
        incl      %eax                                          #
..LN27:
   .loc    1  11  is_stmt 1
        vxorps    %xmm9, %xmm9, %xmm9                           #11.28
..LN28:
        vcvtsi2ss %eax, %xmm9, %xmm9                            #11.28
..LN29:
        vdivss    %xmm9, %xmm6, %xmm10                          #11.28
..LN30:
        vcvtss2sd %xmm10, %xmm10, %xmm10                        #11.28
..LN31:
        vmovddup  %xmm10, %xmm11                                #11.28
..LN32:
   .loc    1  10  is_stmt 1
        xorl      %edx, %edx                                    #10.12
..LN33:
   .loc    1  11  is_stmt 1
        vinsertf128 $1, %xmm11, %ymm11, %ymm9                   #11.28
..LN34:
                                # LOE rbx r12 r13 r14 r15 eax edx xmm6 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm7 ymm8 ymm9
..B1.4:                         # Preds ..B1.4 ..B1.3
..LN35:
   .loc    1  10  is_stmt 1
        addl      $32, %edx                                     #10.12
..LN36:
   .loc    1  11  is_stmt 1
        vaddpd    %ymm9, %ymm8, %ymm8                           #11.17
..LN37:
        vaddpd    %ymm7, %ymm9, %ymm7                           #11.17
..LN38:
        vaddpd    %ymm0, %ymm9, %ymm0                           #11.17
..LN39:
        vaddpd    %ymm1, %ymm9, %ymm1                           #11.17
..LN40:
        vaddpd    %ymm2, %ymm9, %ymm2                           #11.17
..LN41:
        vaddpd    %ymm3, %ymm9, %ymm3                           #11.17
..LN42:
        vaddpd    %ymm4, %ymm9, %ymm4                           #11.17
..LN43:
        vaddpd    %ymm5, %ymm9, %ymm5                           #11.17
..LN44:
   .loc    1  10  is_stmt 1
        cmpl      $10000000, %edx                               #10.12
..LN45:
        jb        ..B1.4        # Prob 99%                      #10.12
..LN46:
                                # LOE rbx r12 r13 r14 r15 eax edx xmm6 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm7 ymm8 ymm9
..B1.5:                         # Preds ..B1.4
..LN47:
   .loc    1  9  is_stmt 1
        cmpl      $10000, %eax                                  #9.7
..LN48:
        jb        ..B1.3        # Prob 66%                      #9.7
..LN49:
                                # LOE rbx r12 r13 r14 r15 eax xmm6 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm7 ymm8
..B1.6:                         # Preds ..B1.5
..LN50:
   .loc    1  6  is_stmt 1
        vaddpd    %ymm7, %ymm8, %ymm6                           #6.7
..LN51:
   .loc    1  15  is_stmt 1
        lea       (%rsp), %rdi                                  #15.7
..LN52:
   .loc    1  6  is_stmt 1
        vaddpd    %ymm1, %ymm0, %ymm0                           #6.7
..LN53:
        vaddpd    %ymm3, %ymm2, %ymm1                           #6.7
..LN54:
        vaddpd    %ymm5, %ymm4, %ymm2                           #6.7
..LN55:
        vaddpd    %ymm0, %ymm6, %ymm3                           #6.7
..LN56:
        vaddpd    %ymm2, %ymm1, %ymm4                           #6.7
..LN57:
        vaddpd    %ymm4, %ymm3, %ymm5                           #6.7
..LN58:
   .loc    1  15  is_stmt 1
        movl      $-1, %esi                                     #15.7
..LN59:
        movq      $0x1208384ff00, %rdx                          #15.7
..LN60:
        movl      $__STRLITPACK_0.0.1, %ecx                     #15.7
..LN61:
        xorl      %eax, %eax                                    #15.7
..LN62:
        lea       64(%rsp), %r8                                 #15.7
..LN63:
        movq      $0, (%rsp)                                    #15.7
..LN64:
   .loc    1  6  is_stmt 1
        vextractf128 $1, %ymm5, %xmm7                           #6.7
..LN65:
        vaddpd    %xmm7, %xmm5, %xmm8                           #6.7
..LN66:
        vunpckhpd %xmm8, %xmm8, %xmm9                           #6.7
..LN67:
        vaddsd    %xmm9, %xmm8, %xmm10                          #6.7
..LN68:
   .loc    1  15  is_stmt 1
        vmovsd    %xmm10, 64(%rsp)                              #15.7
..LN69:
        vzeroupper                                              #15.7
..LN70:
        call      for_write_seq_lis                             #15.7
..LN71:
                                # LOE rbx r12 r13 r14 r15
..B1.7:                         # Preds ..B1.6
..LN72:
   .loc    1  18  is_stmt 1
        movl      $1, %eax                                      #18.1
..LN73:
        movq      %rbp, %rsp                                    #18.1
..LN74:
        popq      %rbp                                          #18.1
..___tag_value_MAIN__.6:                                        #
..LN75:
        ret                                                     #18.1
        .align    16,0x90
..___tag_value_MAIN__.8:                                        #
..LN76:
                                # LOE
..LN77:
# mark_end;
    .type   MAIN__,@function
    .size   MAIN__,.-MAIN__
..LNMAIN__.78:
.LNMAIN__:
    .section .rodata, "a"
    .align 8
    .align 8
__NLITPACK_0.0.1:
    .long   0x00000000,0x00000000
    .align 4
__STRLITPACK_0.0.1:
    .byte   48
    .byte   1
    .byte   1
    .byte   0
    .byte   0
    .data
# -- End  MAIN__
    .section .rodata, "a"
    .space 3, 0x00  # pad
    .align 4
.L_2il0floatpacket.0:
    .long   0x3f800000
    .type   .L_2il0floatpacket.0,@object
    .size   .L_2il0floatpacket.0,4
    .data
    .section .note.GNU-stack, ""
# End

使用 OpenMP,Ifort 使用 SIMD 来矢量化外循环(通过i),所以基本上所有的时间都花在了

## set up ymm3 with 4 copies of 1.0/(1.0*i),
# and j = %edx = 0
..B1.5:                              do {
    incl      %edx                   #   j++
    vaddpd    %ymm3, %ymm2, %ymm2    # ymm3 + ymm2  =>  ymm2
    cmpl      $10000000, %edx        } while(j<10000000);
    jb        ..B1.5        # Prob 99%

10M 次迭代vaddpd将完全主导循环外部所有内容的成本,因此重要的是该内部循环执行 10k / 4 次。 (注意add $4, %eax / cmp $10000, %eax / jb,分支目标回到内循环之前。)

由于它仅使用单个累加器,因此吞吐量受到循环携带依赖性(3 个周期)的限制。


没有 OpenMP:

它仍在完成全部工作,而不是优化任何循环。

它自动矢量化就像#pragma openmp,但使用多个累加器来增加并行性。多个添加指令可以同时执行,而不是每个指令都依赖于前一个指令。

内循环的设置非常相似,然后内循环是:

## set up ymm3 with 4 copies of 1.0/(1.0*i),
..B1.4:
    addl      $32, %edx                                     #10.12
    vaddpd    %ymm9, %ymm8, %ymm8       # ymm8 + ymm9  =>  ymm8
    vaddpd    %ymm7, %ymm9, %ymm7       # ymm7 + ymm9  =>  ymm7
    vaddpd    %ymm0, %ymm9, %ymm0       # ymm0 + ymm9  =>  ymm0
    vaddpd    %ymm1, %ymm9, %ymm1       # ...
    vaddpd    %ymm2, %ymm9, %ymm2
    vaddpd    %ymm3, %ymm9, %ymm3
    vaddpd    %ymm4, %ymm9, %ymm4
    vaddpd    %ymm5, %ymm9, %ymm5
    cmpl      $10000000, %edx
    jb        ..B1.4        # Prob 99%

    # then combine the 8 vector accumulators down to one, and horizontal sum that.

8个累加器可以保留8个vaddpds 立即飞行,但在 Intel SnB/IvB 上延迟仅为 3 个周期(请参见Agner Fog 的 insn 表 http://agner.org/optimize/)。你没有说你正在使用什么微架构,但我可以从以下事实推断出 Sandybridge/Ivybridge:-xhost使用 AVX1 但不使用 AVX2。 (广播与vmovddup / vinsertf128,而不是 AVX2vbroadcastsd %xmm9, %ymm9)

这完美地解释了 3 倍速比:26.535 / 8.940 = 2.97 ~= 3. (vaddpd在 Skylake 之前的 Intel CPU 上,每个时钟的吞吐量为 1,延迟 = 3。由于指令级并行性的增加,该版本受到吞吐量而非延迟的限制。

使用如此多的累加器展开将对 Skylake 有所帮助,其中 FP add 具有 4 个周期延迟和每个周期 2 个吞吐量。 (SKL 从端口 1 中删除了低延迟专用矢量 FP 添加单元,并在端口 0 和 1 上改进的 4c 延迟 FMA 单元中运行它。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 OpenMP SIMD 指令会降低性能? 的相关文章

  • 进行水平 SSE 向量和(或其他简化)的最快方法

    给定一个由三个 或四个 浮点数组成的向量 对它们求和的最快方法是什么 SSE movaps shuffle add movd 总是比 x87 快吗 SSE3 中的水平相加指令值得吗 转移到 FPU 然后是 faddp faddp 的成本是多
  • 大多数编译器都会优化 MATMUL(TRANSPOSE(A),B) 吗?

    In a Fortran program I need to compute several expressions like M v MT v MT M M MT etc Here M and v are 2D and 1D arrays
  • 循环变量文件名[重复]

    这个问题在这里已经有答案了 我正在使用 Fortran 对分成许多文件的庞大数据集进行计算 文件的名称是 maltoLyo12per reimage set1 traj maltoLyo12per reimage set2 traj mal
  • AVX2浮点比较并得到0.0或1.0而不是全0或全1位

    基本上 在生成的向量中 我想为所有输入浮点值 gt 1 保存 1 0 而为所有输入浮点值 float f 8 1 2 0 5 1 7 1 9 0 34 22 9 18 6 0 7 float r 8 Must be 1 0 1 1 0 1
  • 提高由整数商定义的变量的精度

    假设我有以下程序 program derp implicit none integer parameter ikind selected real kind 18 real kind ikind a 2 0 3 0 print a end
  • 在 openMP C++ 中并行化许多嵌套 for 循环

    你好 我是 C 新手 我编写了一个可以运行的代码 但是由于许多嵌套的 for 循环 它很慢 我想通过 openmp 来加速它 任何可以指导我的人 我尝试使用 pragma omp 并行 前ip循环并在这个循环中我使用了 pragma omp
  • 在 Fortran 中读取行数已知但每行条目数未知的数据文件

    如何读取包含已知行数但每行中的条目数未知的数据文件 例如如果我的数据文件包含类似的内容 1 3 4 5 6 7 8 9 1 3 5 6 4 5 6 7 8 3 5 6 7 8 4 5 7 8 即三行 但每行中的数据未知 有一次我需要来自一行
  • OpenMP 为内联函数声明 SIMD

    The 当前的 OpenMP 标准 http www openmp org mp documents openmp 4 5 pdf subsection 2 8 2说关于declare simdC C 指令 在函数上使用声明 simd 构造
  • 有没有好的 x86 双精度小矩阵 SIMD 库?

    我正在寻找一个专注于图形小型 4x4 矩阵运算的 SIMD 库 那里有很多单精度 但我需要支持单精度和双精度 我看过 Intel 的 IPP MX 库 但我更喜欢带有源代码的库 我对这些特定操作的 SSE3 实现非常感兴趣 垫4 垫4 Ma
  • Fortran 读取混合文本和数字

    我正在使用 Fortran 90 读取包含以下格式数据的文件 number 125 var1 2 var2 1 var3 4 number 234 var1 3 var2 5 var3 1 我尝试了以下命令并且工作正常 read 2 tem
  • 使用命令行查找数据文件的行数

    有一种常规方法 逐行读取并检查iostat每次读数时都会达到非零或负值 不过 我想打电话system command 例行公事和 使用wc l命令来计算数量 然后想要分配要放置数据的数组的维度 例如 我以两种方式打印行数 Program T
  • 使用 openmp 优化 N-queen

    我正在学习 OPENMP 并编写以下代码来解决 n 皇后问题 Full Code https github com Shafaet Codes blob master OPENMP Parallel 20N Queen 20problem
  • Dependency Walker 未显示所有依赖的 Dll

    我有一个 fortran dll 我想知道它所依赖的程序集再分配目的 http software intel com en us forums showthread php t 73161 我发现的一件事是依赖项步行器没有显示所有依赖项 即
  • 基于任务的编程:#pragma omp task 与 #pragma omp parallel for

    考虑到 void saxpy worksharing float x float y float a int N pragma omp parallel for for int i 0 i lt N i y i y i a x i And
  • 我可以将多个线程分配给 OpenMP 中的代码段吗?

    我正在寻找一种方法来并行执行代码部分 每个部分使用多个线程 例如 如果我有 16 个线程和两个任务 我希望每个线程有 8 个线程同时执行这两个任务 OpenMP 有多种构造 section task 并行执行一般代码 但它们是单线程的 在我
  • 如何用好Fortran语句标签?

    我正在开发一个用 Fortran 95 编写的模型 我对此完全陌生 语句标签的概念似乎很奇怪 到目前为止我只找到了标签可以由作者任意决定的解释 通常以 10 为增量 除了更容易地找出语句的结尾位置之外 这些标签还有其他实际用途吗 以及关于如
  • Fortran if stop 需要 endif 吗?

    在 fortran 90 中 if stop 语句是否需要结束 endif example if foo eq 1 stop do some stuff do some stuff 是循环的一部分还是 stop 意味着程序结束时 endif
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • OpenMP 线程映射到物理内核

    于是我在网上查了一段时间没有结果 我是 OpenMP 的新手 所以不确定这里的术语 但是有没有办法从 OMPThread 由 omp get thread num 给出 和线程将运行的物理核心找出特定机器的映射 我还对 OMP 分配线程的精
  • 使用 OpenMP 编译会导致内存泄漏

    根据 valgrind 的说法 使用 OpenMP 编译简单的 hello world 程序时可能会导致内存泄漏 这是没有意义的 因为 hello world 程序并没有有意使用任何 OpenMP 功能 假设下面的程序名为hi c并根据 g

随机推荐

  • 如何在 @ElementCollection 上指定主键

    因此 如果某些表缺少主键 innodb 的行为可能会导致问题 因此 在 Hibernate 中 我正在寻找一个键来指定 ElementCollection 表上的主键 并将 Set 作为底层数据结构 我找到了一种带有地图的主键的方法 但这有
  • PHP,preg_replace,用标签属性替换标签

    我可以详细解释一下如何使用 php 替换具有当前 attr 的标记吗 我阅读了手册和一些参考资料 如何使用php preg replace替换HTML标签 https stackoverflow com questions 3376051
  • 不允许序列化“Doctrine\DBAL\Driver\PDOConnection”

    我正在做一个项目 我做了一个可导出的课程 这是班级 我正在发送查询以导出类型 Illuminate Database Eloquent Builder
  • 检查是否已经过去 24 小时(从字符串中读取)

    我将日期作为字符串保存在以下格式的文件中 Sat Jul 21 23 31 55 EDT 2012 如何查看是否已经过了 24 小时 我是初学者 所以请解释一下 我不确定我是否完全理解这个问题 您是否有两个日期可供比较 或者您是否希望定期检
  • 在 Jenkins 中设置特定的 Python

    我对配置 Jenkins 或 Python 很陌生 但我必须在 Jenkins 中设置统一测试 我的程序是用Python编写的 但仅适用于Python 2 6 而我应该使用的Jenkins版本是2 7 所以我尝试设置Jenkins来设置一些
  • 将可变数量的变量传递给 PHP 中的类

    我需要传递可变数量的字符串来实例化不同的类 我总是可以对数组的大小进行切换 switch count a case 1 new Class a 0 break case 2 new Class a 0 a 1 break etc 必须有更好
  • Prolog 中的掩码

    我最近一直在尝试理解 Prolog 并且一直在搞乱 Prolog 中的列表列表 我正在尝试创建一种我想在 p 中的面具 序言 我有一个谓词 它确定 Prolog 中两个列表列表 比如说 L1 和 L2 之间的差异 并将它们保存为列表列表 比
  • 如何测试是否支持稀疏文件

    给定文件描述符或文件名 我如何知道是否可以写入任意位置 而无需等待磁盘上的中间部分被显式清零 You can stat 文件获取文件大小和磁盘块数量 在文件末尾查找相对较少数量的磁盘块 写入已知数量的块 然后再次统计文件 将磁盘块的原始数量
  • 移动提供商无法进行 UDP 打洞

    实际上 我正在编写一个 Android 应用程序 该应用程序接收连接到 PC 的网络摄像头的图片 为了获得更多的 fps 我使用 udp 协议而不是 tcp 这个想法是 电脑将图片发送到手机的 IP 和端口 但电话提供商有不同的公共端口 所
  • 在 iOS 中检索通过蓝牙连接的配对设备

    我已连接条形码扫描仪设备 条码扫描仪信息 http www barcodedatalink com pages product details php p 108 我想知道它的配对状态 是否与设备连接 void centralManager
  • Django 使用 ManytoMany 作为外键

    我正在尝试使用多对多关系作为另一个表的外键 但我不确定这是否可能 考虑以下模型 from django db import models class Attribute models Model name models CharField
  • 通过类的java sql连接

    我有以下代码 import java sql import java net public class binsz public void dbConnect String db connect string String username
  • 带数据触发器的 WPF 动画

    我有一个矩形 我正在为其背景颜色设置动画 每次特定数字上升时 它都应该变为绿色 下跌时呈红色 如果数字一段时间内没有变化 它会慢慢淡回默认颜色 因此 动画非常快速地将背景从灰色变为红色 然后需要几秒钟的时间才能淡出回灰色 我已添加为 Dat
  • 如何在 Xcode 4 中从断点操作打印字符串值?

    我有一个断点操作 并且正在使用下拉列表中的 日志 选项 我想打印出字符串 摘要 值 我正在这样做 the person name is p name 但这会打印内存地址 我可以切换到调试器命令选项并执行以下操作 po f name 但后来我
  • 如何创建不安全的 jupyter 服务器

    Jupyter 只允许从本地主机访问 除非我做了一些额外的安全工作 我正在运行我的服务器 以便它只能在本地网络上访问 任何有权访问的人都与本地主机具有相同的可信度 如何设置没有额外安全功能的 jupyter 笔记本服务器 根据您的问题 我希
  • HTML5 视频控件不起作用

    我做了很多研究 尽管有些问题 评论确实为我指明了正确的方向 但我仍然停滞不前 摘要 HTML5 视频显示控件 但无法单击 当你浏览它们时 它们就会消失 您无法单击暂停 播放 静音等任何操作 请帮我弄清楚发生了什么事 该网站是www inno
  • OpenCV 中的 Matlab Conv2 等效项

    我一直在尝试使用 OpenCV 对 2D 矩阵进行卷积 我实际上经历过这段代码http blog timmlinder com 2011 07 opencv equivalent to matlabs conv2 function resp
  • 类似热图的图,但适用于 seaborn 中的分类变量

    同样的问题类似热图的图 但适用于分类变量 https stackoverflow com questions 12998372但使用 python 和 seaborn 而不是 R 假设我有以下数据框 df pd DataFrame John
  • Gecko 清除缓存历史记录和 cookie

    帮助 我用GeckoFx Windows 10 0 0 6对于浏览器和xulrunner 10 0 en US win32 Visual Studio 2010 c 一切正常 但我需要清除 Firefox 中的所有历史记录 工具 gt gt
  • 为什么 OpenMP SIMD 指令会降低性能?

    我正在学习如何在 OpenMP Fortran 中使用 SIMD 指令 我 写了简单的代码 program loop implicit none integer i j real 8 x x 0 0 do i 1 10000 do j 1