设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 9087|回复: 25
打印 上一主题 下一主题

[信息技术] C++ 提速的新发现

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?% M; m) s& |9 u6 c
    , `4 s* ~! u" {7 v) t( q
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。7 ]6 S$ w4 W6 T: L, z+ E

    $ I* Q, v" ?, i% j- V$ r: C速度优化问题真的很有意思啊。# U4 m5 ?$ \% H1 R! N' t" R5 `

    ) C, S7 l+ K9 f5 J欢迎大家继续讨论

    评分

    参与人数 2爱元 +8 收起 理由
    helloworld + 4
    住在乡下 + 4 涨姿势

    查看全部评分

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?) o) m+ p: X' A, I8 [: ^/ r
    把代码贴上来看看?
    2 V. e* G5 H( o+ o8 T4 V0 J! O  R# ?" ^9 m9 t- N/ ~1 P
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-24 07:04
  • 签到天数: 126 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    : R) A& L1 Q8 M0 q+ x( g
    数值分析 发表于 2022-9-24 23:042 }/ e( _) C  x& \1 t0 B) H: X
    拉下来?拉多少?% o" v+ |* s7 h7 B& C+ N  y( n" a
    把代码贴上来看看?
    & V! s- ~' J8 W; l& f. {

    ) J$ b' ^- y# }& xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& `+ g. D4 K" T5 P5 e/ N
    {8 X& g5 z- l5 L, G: Q
            comp temp, xtimesy;
    : Q4 X. a, C/ ]) p* t- ~7 M        xtimesy.re = 0;
    . E. T9 `$ o6 B+ p+ l3 c# U        xtimesy.im = 0;
    5 R9 w/ q1 l5 j$ u; k        int j0 = lenB - 1;
    : t  b3 H+ k' C' S* l+ _, ~3 |        int    i, j, i1, reali;
    % v0 ], U% K5 p" Q5 e: [8 Y8 [7 ^  B        if (lenA % 2 == 1)
    . i4 d3 T* {5 ?3 P# P! s                reali = lenA + 1;
    , g7 w0 Y8 ~4 r4 W' U        else  l0 Y9 W/ a+ t& z* }/ a7 {6 W% ?2 R
                    reali = lenA;. s  f- L8 t) e" ~! d, ~
            reali /= 2;5 ~6 ]5 t4 ^# b0 ]0 w; t3 D! y; P

    : f  d3 L' U' O# G. z5 W! Q! }4 J        int nconv = reali + lenB;
    6 c4 c% a4 g$ T5 x  M  w6 H5 z        //#pragma omp parallel for6 O; g, T4 r( E
            for (i = reali; i < nconv; i++)
    ; p3 S7 E. |' s2 r$ ?' e0 f        {) ]/ l! a) A+ I* p$ f/ C9 F
                    temp.re = 0;- O. l/ B0 b. L' z* s6 o9 X3 h& e
                    temp.im = 0;' L/ c: U- ]9 z6 d, ]
                    i1 = i;
    6 m# j# [) ~8 `: M                for (j = j0; j >= 0; j--)
    3 Q$ F* p. Y+ D& B' a1 ^7 \                {+ P& Q& w, r0 i& e3 {6 o9 S
                            /* floating date operation */
    , Z  d% j: D5 C% H( }/ {                }
    8 K8 z4 G4 g8 S% ~( O$ K
            }
    ( F1 {- t' u7 x}2 \( ]: f- R& h0 E9 N, t  L
    + F! F" u) m! G4 q* q0 Z  F! ]
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样" p' y0 m3 k9 D# g  Q

    7 G; Q, N+ B; d7 N$ Q红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。! o. D# W, m4 K8 E+ z* Z
    现在call xcorr 100次,耗时78s.- ~" _9 L3 I  z

    5 N0 W& f. q' z如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. $ r& h7 e; v% R! E# L; S
    9 U5 U' J7 ?$ T2 I" ^
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    & V2 P. U1 q5 a$ jMaybe Debug mode?
    . z) m& z) Q( O- {2 r3 \, F/ i' ~
    3 d9 W3 ]' i* H) L8 m" W
    不应该,看我上面的回复。
    " w# _, R  k9 S
    6 c$ R% c2 S8 K- u. J我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 # W! k- O. }: H4 d5 ^! D* v
    雷达 发表于 2022-9-24 23:54
    0 c5 f! ]- z$ K* t' k4 z. Mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) U- N7 z* g% }' w' @
    {9 |" G0 ^2 g4 c- ]9 q! M' K
            comp temp, xtimesy;

    0 a' ?, @# }# Y$ v- H/ @, A  G. p+ D( V' ^! m' u
    这个不是这么比的吧。。。
      `. k0 f- u; n) e: M; E  [6 w. z; J8 W  X' U$ r" t' g) o
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。* @, l3 a' w: [+ w

    $ d) O% A$ y7 S9 {. [而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    - ]  [' d0 Q/ P1 j8 f, R2 }0 m
    数值分析 发表于 2022-9-25 00:20
    $ B) i6 x- G5 M8 _, ^* M0 m这个不是这么比的吧。。。
      R9 j: j  W. ?. V1 ^) L8 Z/ U3 ?$ M5 k! V% B
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ( A% e- z3 x2 Q+ {' i# I3 B. `$ i" q
    有道理。$ E( D& z# e1 F! s
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。( o% t( O0 Y, x9 a7 w6 b

    8 |5 s& `' v( h# T8 J; v9 R3 T我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:460 \; x/ `& w  K3 W* M0 ?1 E
    有道理。( d# v+ s% E$ y
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ; e( e& F6 T$ E3 l+ j
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多7 G) ~( p# ^% L
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20" T! t: K* g& z! ]8 x. [
    这个不是这么比的吧。。。) x( q4 m% q3 G( ]
    + [+ d) s( Q1 A0 C( n  e% h2 W
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    0 t! E& q! ^8 ~  A5 Z* B/ `

    8 j2 x3 ]$ J7 v% {( |* E现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    1 z% F0 N% t1 S: R- X) V
    沉宝 发表于 2022-9-25 01:48  }; P0 ^  D2 Y+ J0 @9 P; U
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    0 ]3 }; @3 r4 c8 l" R5 f. S

    3 m; o& @: K9 E. S% s* u是的,兄台说的对。2 b) |5 b4 x' R- S* B+ W% C
    7 r) x2 E" n2 E% ^, N; E  h
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。+ {4 j! @& u+ b+ j9 s
    3 j  r) Z' M. L4 ?
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。2 f6 `+ M1 G, \, A& E7 p3 o
    4 r) N* y5 r& A. @& s& \0 N
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。. v0 Y# k, K( E3 o/ }! w( G1 k( U8 N

    - Z. M5 s2 D; G0 b0 c; g当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ' [8 q5 r7 s9 Y; I+ ]: H
    沉宝 发表于 2022-9-25 01:27* J" E- c/ }7 G* Z0 {8 d6 J
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    4 U" S/ t9 O* R. M$ u- H
    5 ]( |" O; ~0 N6 Z) j1 v# _% d; [" H9 e又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ' S! c7 q' u7 H9 d) V( q/ @. C$ H9 H$ h9 X2 V; f
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    % B1 Z% h6 B' O  _4 O2 V2 J又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ' c- l$ n5 Z8 I8 v/ ~; w( Z
    时间差一倍的结果可以接受。+ e- g$ O& t3 \7 v' `6 {4 C
    4 O: a5 Y/ G8 p2 R" b: J+ ]: q
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-7 02:13
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 7 k1 R* r% I, q% _: N( j
    雷达 发表于 2022-9-25 04:47
    ; e5 y: _% k) G- Q又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    - U% e$ S, l( W2 T

    ( A% y! u  M& _- Q( U. Z9 K" x  D0 Y4 Y1 Y: M

    4 I( O3 p/ g6 w9 y: k" u能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ; }2 G. I* d; s
    数值分析 发表于 2022-9-25 14:58+ A% k3 J" d2 t7 W
    能不能把这个也贴上来,看看和上一个有什么不同?
    0 y3 O; n, g$ ^+ m
    理了理思路,重新做了一个测试。" c9 w; J% S' W  ^6 p
    做了两个 vector 和 两个 float *, 都长 100000  f0 }0 D: r' e' e7 l
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.% |# Y9 K: @1 {/ o: T7 P0 [3 D" w

    , L9 c( \! f+ K% g内循环试了4种方法,
    . N& I) q. m# u1. 直接调用 vector inner_product 247s
    / x9 e* j) t2 S2 U. ^2. vector 循环点乘累加 237s
    + I3 D: B8 K- w8 F! t; V! `: n3. float * 循环点乘累加 204s: i4 p1 `. X7 }1 p
    4. 空循环 100000 次 202s
    - R4 T7 b1 L2 D5 z
    2 `" F3 i/ @; F& N! {不做内循环 200s& L. [; }) w: V7 ^% [9 j- z3 i
    . P+ w# n4 g8 F- h* j0 R# L- T
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    9 u5 ]0 I9 q/ w& y2 r, ~另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ! e  x4 g1 x+ j4 g6 F: [
    . m; P$ V$ [; V( H4 T1 |至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    5 l. E+ W1 c4 |+ ^9 M5 H. c9 b6 `8 G6 h+ R, E1 U; H! R
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL). t; l; _  W; b- N

    * Q" a0 d$ W9 ~+ `8 o
            std::vector < float > vec1(N);
    9 E9 P! y& D" ^+ N! G1 k. I+ `        std::vector < float > vec2(N);
    9 w& K# R  K# S6 u( @        float* b1 = new float[N];
    6 i" y# g+ l7 j3 s5 _$ i) q; W        float* b2 = new float[N];8 e$ V- y8 B! ]6 [; m/ @) b

    ' ^- t! R* U: b! C- _        for (int j = 0; j < 6000; j++)
    & p+ ^. d2 C6 L. u. ~5 [        {0 _3 K9 B' c4 Z! ^+ X: c
                    std::generate(vec1.begin(), vec1.end(), []() {
    6 `, z- _) }) A1 |                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    % E3 J: }/ b, i0 F% v  R                        });5 W. S6 v6 w# ^5 j) T

    & j9 S1 \  |8 x9 ]                std::generate(vec2.begin(), vec2.end(), []() {* e& w/ `& P5 k# r6 B
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    # p. M4 M7 n) S& _+ l/ c                        });2 X2 q/ A' c3 m* Y$ T& i) d& T3 H

    8 C3 d; u* n  U# q5 w$ H, v' _1 r                for (size_t jj = 0; jj < vec1.size(); jj++)
    ) c$ K- f3 Y: E. B                {
    * k, s6 v) u4 N; r1 a" ]                        b1[jj] = vec1[jj];+ L8 e; K0 @0 k- _
                    }
    7 d; b  W+ ?+ ~+ T9 \/ ]% Y
    / b" H5 b' e) ^' Y9 a1 Y                for (size_t jj = 0; jj < vec2.size(); jj++)4 I/ S; C! K$ b7 _
                    {% W4 R' X2 r, N6 F3 l& y( |: I
                            b2[jj] = vec2[jj];$ A# J: c2 V, [$ m& c7 f7 z7 X8 Z/ ]
                    }" D, W# U+ A" ?  ~

    9 U$ ^& t' w: ]+ L" v( i/ b4 h, B2 R                //Method - 1  N=100000 247s  4 y( A; Y8 T; T9 L, g" p& t3 I
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' I7 `+ _% j% d# E8 A
                                    8 b7 B6 t2 {' V: G1 ?2 @* y9 n6 j
                    //Method - 2  N=100000  237s
      w( P" c" u! x5 h9 A% `( I                /*$ v# J/ i4 i( m. K5 z
                    for (int jj = 0; jj < N ; jj++)1 n& w. x* K; g9 p8 _5 n; X, q
                    {7 j, }. P  O1 k) |, p5 g+ _, T
                            fresult += vec1[jj] * vec2[jj];& M& x6 q2 p% J$ I: }' q" V8 b5 }
                    }
    : C% ~; i, y  T; s$ a; c                */: v& X: p- J* Q( S# h6 N0 F# `
                                    
    7 j! u/ D  \0 V, f8 ^% {2 m+ c                //Method - 3  N=100000 204s( e8 g3 `6 L2 l7 F% J8 {6 j& z
                    /*
    7 C7 J: P0 p6 S' Y                for (int jj = 0; jj < N; jj++)# R! a  q1 y2 j# ?3 y6 r3 Y
                    {
    5 T! x: }( i+ L# i) M                        fresult += b1[jj] * b2[jj];
    ' G. O; z+ a- ~- h) d: v# G  Q' h5 x# s                }+ s! t, n( w; O' r4 A. M' @
                    */; L( B$ w# B0 C! o5 B
    4 V% s% |& w; H; F8 ~
                    //Method - 4   202s
    : I# o! r: v  o( L- ~) L) _+ E                /*
    . h: l$ P* q9 f- O                for (int jj = 0; jj < N; jj++)
    ) ?2 M5 \! U- n$ Q3 W                {
    ; F3 V+ y) `2 L' O) m                        & S( ?2 c+ a- @2 e6 ^: w5 t8 C
                    }3 o$ M/ p7 \5 _- \7 U  ~. s
                    */- E7 b8 b! V6 P% X
                    //comment out all methods, N=100000  202s               
    3 ?" f" \+ t; N9 A6 V        }
    ) o" N' i* ]/ q2 \3 t/ J, n# e' |" m8 t" K% w  W9 |" E; L
            delete []b1;
    + \* g5 J' d6 T- x# u) O        delete []b2;

    % j5 x3 Z( l4 O/ Z6 ?0 V+ Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ; O, z; I" J( P% _. b7 J' f7 R
    5 o# H: \- c: J- M0 V% Z, |+ K2 P你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    $ D3 y. ]* q. }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ b: j/ |" E; n& `8 w. [( m瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * \1 j( w2 b  `. l3 i8 ^- @. O. F/ d! A9 G4 c5 C; g
    你第二个试验里面的j在循环里面又重新定义 ...
    7 i& x$ v3 x9 U, }! t4 a
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL3 G8 t4 J3 f" K% X4 {: J
    : G* P+ w  W- }' v* g( U6 G+ u6 N/ w
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-2-8 10:08
  • 签到天数: 2 天

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    , s$ e9 U/ R( E5 r内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& `- D/ z* M  A. {! [. a- _0 x

    : x2 `+ d) U+ S' w; j& |, f不和它 ...

    6 t, K" e. P# K9 ^, Z) f" X) E/ w
    / s9 Y; k% e- s; y7 w* ?不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。  g! {1 Q8 |# Y7 @
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2022-9-27 07:25:57 | 只看该作者
    一个无关问题,为什么爱坛的帖子里在我这里有好些奇怪的东东在里面,是防拷贝措施吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ; l4 s9 ?+ j1 _/ p. |0 Bvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 O+ S" S4 M: j; T) J4 t
    {0 C  M1 ?$ T' e9 z4 T* D. H
            comp temp, xtimesy;
    % c* |* [( ~; q) T2 I7 E  k' \3 c. ]
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ; b0 |, ^2 p, Y' {内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    3 t4 L! g: W  O& eVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2026-10-7 00:07 , Processed in 0.070615 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表