设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?. K: \, R  j* w* B8 c( h+ @

    9 o- x' `+ N$ f" Y: F2 ]自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    2 d* H, b" f% b( m' |( G% _; G) j  L; Z
    速度优化问题真的很有意思啊。
    9 e9 b' N2 B$ B. u( W  H5 H, ^) O7 J2 i* l, u9 V7 D# E
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 1933 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    . g1 v) u! g. Z9 R, N+ w3 G7 }& M4 R把代码贴上来看看?  Z' O5 G0 m0 i, g0 J1 G
    . b8 N$ i! }5 C% N' n
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [LV.7]分神

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

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    ! e8 O* f, [4 i
    数值分析 发表于 2022-9-24 23:047 m5 l2 r; _5 [! \  {) d/ j
    拉下来?拉多少?
    ' V' a* @8 }+ x- T$ _  z0 X+ E把代码贴上来看看?
    . ?( G- Q3 W/ N" ~
    2 s7 K: b. ^' J" D: Y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 ^( ^+ ?1 Z" \$ U7 q& \- @
    {4 ?- @! \4 {* B5 w4 }
            comp temp, xtimesy;& K/ R, a; m* b
            xtimesy.re = 0;1 z3 W1 U% D+ n& U) G
            xtimesy.im = 0;" e- V1 P: t# c" |; K+ f' ]
            int j0 = lenB - 1;7 p, l% _( l: K
            int    i, j, i1, reali;
    9 X* `; P% `. }* _: X        if (lenA % 2 == 1)/ X) f7 ?2 X) U2 r" w9 W+ }" x( u
                    reali = lenA + 1;
    . q( n' f, m4 D( t! E5 y! r        else
    : ]- P1 Q  o! R4 i, K9 L                reali = lenA;
      `! S2 [# r! |        reali /= 2;
    4 Z5 D/ p' n, [6 e7 ~, L( Q) w* o$ U
    ' L1 E- T6 q; T/ Z/ U. D% v& P        int nconv = reali + lenB;! L4 m1 `: e* ^8 k% U
            //#pragma omp parallel for+ D3 A! L0 E9 N! A* |' p
            for (i = reali; i < nconv; i++)
    2 K$ v1 n/ ]+ }        {7 t4 ?) Y. u) c+ X
                    temp.re = 0;
    % X4 }' @& ~) T2 K" H5 a+ d" t9 x                temp.im = 0;' `1 {7 a; N1 z# u" W
                    i1 = i;9 G& d5 ~5 Y  e8 k& a
                    for (j = j0; j >= 0; j--)
    . Q! j" P* T6 f  Y3 N" e                {5 Z: o5 U; g, l6 n
                            /* floating date operation */& r) K9 Q5 D; V+ W- D+ P& k+ Z
                    }

    9 `, A& Y5 y. R% T& ^        }
      T2 ^6 @# K9 P" G0 u, K}
    ; M  T. }7 G. [1 B( R0 R) D9 y( M' l4 ~2 a5 O8 n
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ! r; Z4 u7 m; C% B8 ^$ K8 h2 O6 j
    0 l( N+ }: C, u% j红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。; c) X( l# J0 k" j6 G
    现在call xcorr 100次,耗时78s." I0 t: m4 @/ g& x5 ~) t
    & B4 Z; S- v" P) I
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ; o7 g# e6 M/ N$ ^9 a
    ' F1 Q2 T4 E. t/ ~$ h
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33! K3 Y# v0 z) x# ^. M" k2 |8 y
    Maybe Debug mode?
    , R9 m- M' w! `9 F7 D: H$ d
      R8 F& l$ C9 n4 y! x9 P7 I  e
    不应该,看我上面的回复。3 F7 l4 e7 s" y/ z7 z" v! a6 }

    ' ~) b% {: g3 }8 u我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 1933 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    - Y6 L- C/ l" V  H* `( `7 O
    雷达 发表于 2022-9-24 23:54
    ) y; x, p2 T, J9 _: @8 ^void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 b3 [3 n! E; r$ C$ g{! o: e- {" Q: x
            comp temp, xtimesy;

    " ^3 b4 A- w* B$ P9 q! q
    / e. Z0 r8 m: w& t6 f; U这个不是这么比的吧。。。
    2 P$ v8 G; t; ^. _) P' X3 `7 j3 \) V- V0 u5 G) x+ |: t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。9 R6 G. m% v  p
    4 |  h+ P; f5 [( D' F
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 7 e0 Z' P8 B+ C. ?3 t/ k9 ?7 D* G
    数值分析 发表于 2022-9-25 00:20
    4 M( l8 b8 s2 F6 ^这个不是这么比的吧。。。2 K+ p7 G* t: E; C- _, t

    * u! y& @  a1 m4 q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    $ f0 |/ S! T; D1 z* L. y. _, ?
    * v+ E% e  c7 W" T2 g4 l" k有道理。7 a. }% T5 @4 W) \0 G# U8 q
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。& Z: g* U8 y7 v3 q$ ?; h

      {! X, p  v  P( q7 W我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46* @4 B: H4 J5 G+ u
    有道理。/ a8 p* f6 O7 t, Y& Q3 `, S+ H
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    4 F: q" r3 W% {! s0 |
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    % L" D( S& S$ v3 I$ P, `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- Y+ S# i- z2 F* ~( P+ b- J8 \
    这个不是这么比的吧。。。! ?3 ^" }; }  q: l

    4 b2 |: @# i6 u' t- `, f: M5 F您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    & c+ b! A) U0 H8 z

    & T* J0 D. X8 P( m/ D( \现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 1933 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 3 k% A8 K) m+ E: r- I. u
    沉宝 发表于 2022-9-25 01:48
    4 l0 o% n6 G" ^现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    0 k6 X% ~$ j$ R' m

    7 Y$ o+ d+ z- k! [是的,兄台说的对。' ?- G2 Q* b4 @# |4 o! G9 G; @* c

    # a: q6 q. Q- q) S: S: K2 A, M其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。& T  ?2 r1 d& U7 j$ H  w1 e; H' ]
      w9 }, K0 F+ d" ]4 b
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。! {$ C" g$ H# e( Y3 g
    3 R2 p: F8 I0 p  z; q) Z; C6 f' J
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    + z2 X# g7 s- B* t1 ]5 s! o& }, h4 e, V: P' s
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    " S# t1 |; l5 W4 D. Z- O+ k
    沉宝 发表于 2022-9-25 01:27
    , r( B( g  A2 p( Q/ k  J7 c$ d$ n你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    8 ?$ u8 p( m. d5 |) E8 K% C
    & e! w7 m% ~$ k$ L+ z! @' E
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    0 Z" q* g+ Q) N- ^2 J9 ~5 j- R
    3 g5 }5 G& J  I  P0 [% T7 k5 D我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ) @5 l% m7 I9 Y0 g* ^) ]8 g1 K又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    3 ]: j! @0 o; V5 G) p
    时间差一倍的结果可以接受。# v2 }3 U. z) e6 w4 p  j! K% l
    ; {% V# f" |' \5 }7 g* j  {- ?
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 1933 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 + d( x: J' L  c/ W! P% x
    雷达 发表于 2022-9-25 04:47( ~9 e; K8 G. C1 r$ ~
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ; E8 j4 s* p) a3 Z, w# u) s8 ~
    * R1 u% @, M3 m9 x

    $ C9 ^6 v  v! Q
    2 ~7 T% _; Y3 |) a2 R能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 o0 F" g1 P, Q
    数值分析 发表于 2022-9-25 14:58( T' W% k) {0 x/ c5 ?  h! E$ K
    能不能把这个也贴上来,看看和上一个有什么不同?
    # l5 }5 y: G) E( S" q
    理了理思路,重新做了一个测试。1 d3 r( O" u: A( t: p+ m( z
    做了两个 vector 和 两个 float *, 都长 100000
    1 z% V* @6 I2 I; O/ `外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( s7 \  A- i& \- K

    5 a" C' P* _$ A7 `内循环试了4种方法,9 {+ C7 e2 |8 @# E8 |4 |; r, Z
    1. 直接调用 vector inner_product 247s
    7 h8 f; S' m3 y# B; t! N2. vector 循环点乘累加 237s
    0 s0 Z' [7 K- }9 ^/ o' [5 @3. float * 循环点乘累加 204s
    5 w9 \$ y; t& C- x; o% C) b5 T4. 空循环 100000 次 202s
    % ?. h6 _  i% [# p
    & c7 `# H& x* l不做内循环 200s5 T0 f/ r% [" P4 {' W
    , I7 q+ W8 Z  ?/ C7 c
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 q( V3 B/ A1 h4 v% a
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ ^# S' r4 Y% v8 i8 I3 }

    # D. {' E- }# }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ' H6 ?: ?% P- [$ i! L2 f
    8 O6 L% ?& A3 x(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    - c3 V% a4 T8 |0 J1 K% B+ N4 q# i. g6 L$ n
            std::vector < float > vec1(N);
    7 c- ]: E1 S# U( @( @        std::vector < float > vec2(N);3 c7 |# v1 Z% i) A0 \& Z
            float* b1 = new float[N];
    % X+ U! a% _. b5 N        float* b2 = new float[N];% ^2 k9 b( X: g' L: {
    ( W8 I. p/ t7 S( O9 Q' O2 U
            for (int j = 0; j < 6000; j++)
    8 @; S0 w4 `# m0 e* q        {
    * d  K8 d7 b- R6 U# K2 U                std::generate(vec1.begin(), vec1.end(), []() {: A* f9 P) c4 C9 p1 U6 e& v
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;  ^0 S; O5 C$ Q9 D) q0 s  _
                            });
    & N9 x& i" v- T" d. y1 i9 Z8 T- V# i# H% @8 d9 F/ H, u9 Q8 H
                    std::generate(vec2.begin(), vec2.end(), []() {: K2 G, B; G  K5 C) C4 o2 J
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& M  j! U; v8 u
                            });
    - }2 V4 s* v7 d7 j. ]* p1 U
    , [4 u" K/ S8 E, E9 E" |& N                for (size_t jj = 0; jj < vec1.size(); jj++)
    5 L8 G# i: C( F' j8 u) V) J5 T                {
    + |6 Y! y& S( H6 n) P3 P                        b1[jj] = vec1[jj];) {+ Z" [" @+ B( M; t6 p' R4 I
                    }
    9 p- x* h+ J; {7 K9 P, E& k9 K2 ^; x' m( a2 \4 d2 R& L' a: |: A
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ( K! J# |& i# q, w! |                {
    ; b; D7 i! G: g5 e                        b2[jj] = vec2[jj];+ s7 ]& @. o* @! `( [* j1 A
                    }) J0 E" y, P$ r/ O& o" f% t

    8 Y3 p! H( C* B& Z' }$ h6 M/ M                //Method - 1  N=100000 247s  
    3 u5 j, }) D8 W9 M3 ]1 h                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) D: S- V: `1 j+ M* v+ D' E6 M
                                    % j: x+ E4 _8 P/ w7 c7 _
                    //Method - 2  N=100000  237s) D3 d2 M2 ?) o1 ?: d4 D! J
                    /*) ^7 a& L, S: S; q
                    for (int jj = 0; jj < N ; jj++): J* e. l1 u- ]' i( }6 y
                    {
    . n/ _  }/ U1 R' i3 [9 ~                        fresult += vec1[jj] * vec2[jj];% k1 L& D% u$ k/ `, D7 _
                    }6 J4 ?2 o) j6 ?
                    */
    * j# E9 Q1 c! d- y9 H0 F3 ?                                : D/ N9 Q( M0 c8 c- f
                    //Method - 3  N=100000 204s5 M1 ]/ {* ?1 \2 x3 n: }
                    /*
    + N' |1 @# C2 o) @                for (int jj = 0; jj < N; jj++)6 t! _* ]. J4 t0 T4 {3 t
                    {
    1 V7 m5 m1 D2 d9 D                        fresult += b1[jj] * b2[jj];
    ; ^* a& [9 C; P1 C                }
    % g4 |1 I2 i* _! z+ ^6 q/ o                */
    % a9 s% i# `7 f3 I7 g$ ?' F" e& p4 t/ p" k0 \  ]& G& f
                    //Method - 4   202s
    $ E: D3 Y2 s8 M4 M( s0 m                /** s2 `9 Q0 a3 l
                    for (int jj = 0; jj < N; jj++)
    & r- N/ }/ o6 [) G$ p                {8 b9 C! J2 h3 X3 F& T
                            " W8 ~4 {" [6 Z' F7 Z3 z  c8 N
                    }
    6 E) n3 m7 L9 E! E8 l& k6 F% z+ Z                */8 l9 R) f; X6 ]* |+ N! z/ l9 l
                    //comment out all methods, N=100000  202s                8 N; c& G0 H) p* ~8 [. t+ P6 z$ K
            }5 B' V9 b- h. v# K" a9 |6 m' |& ]
    ) g) _& V2 h, q+ f
            delete []b1;6 \! O1 r, e4 K7 B* f
            delete []b2;

    8 q# \# N0 _1 w' `
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 S/ z3 D0 X3 S& p  M7 A
    : d6 j0 L2 F4 O6 U
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?% i4 T# l; O: q  t, h6 X5 G
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15: G$ B3 g# Z8 A' `4 Q  Q
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 R  c  }0 H/ u
    . n4 D* ^) ~1 h9 e9 `
    你第二个试验里面的j在循环里面又重新定义 ...

    . |5 K$ q4 \- }8 s( c5 W' l内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL; G' t8 m3 ]6 @  L. W& b
    % P  y( d4 _4 g+ F: {& e# x
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    4 U' M: c% q' N' G# }5 ?' y- c  y内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    7 M- Z% \: u9 t+ t; [4 U3 ?  N/ p7 N
    不和它 ...
    ! r& j+ i5 `2 O. `0 m% q
    2 T" y+ H0 L5 J  S$ y7 ^$ T
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    # S1 ]4 ~6 S" H' b( R/ T" k后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    4 a0 i) E: r! Zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)7 R! _: c' F$ @1 ?
    {4 F1 _" h/ l$ o) r5 Y+ ?8 C$ f
            comp temp, xtimesy;
    & M8 d  X% V. F9 ~9 \" l; p& }
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。7 Y# j% `5 O8 P) L
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?. p2 j  h, ?4 r- A$ |  q
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-16 23:43 , Processed in 0.047637 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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