设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    5 a* h% S. I  V0 c  T4 F4 u6 t- g; s& h* ^$ H2 Q" m
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。0 t% z* \5 H( p% n; ~. O% w) T
    7 w, L$ c' F; ^! H
    速度优化问题真的很有意思啊。" c' f8 v1 h% @: |0 g% R

    $ c2 z6 B7 s3 E, }4 k# `欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?# b/ R1 R) s  ]: |2 J) I& ^5 T
    把代码贴上来看看?) M9 f* P# ?8 p& D

    7 L4 B: W9 z( U& R. |难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 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 编辑 1 K4 H6 [( r! k" ~, T
    数值分析 发表于 2022-9-24 23:04- S0 z( z3 U0 b2 ~- z* M
    拉下来?拉多少?
    / w2 G# Q8 U4 O2 S( C' h6 a把代码贴上来看看?

    8 T1 O7 j, \: J9 M+ M9 K% p; y# F4 q" D/ @: |: V- O9 @
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' B& n4 @0 ^: x
    {$ P+ v% }8 ^- K$ C4 n) m
            comp temp, xtimesy;
    4 F$ a7 W5 e# D: w, u# Q        xtimesy.re = 0;
    ! C( j8 t* _) ?0 a; V3 J8 `! H        xtimesy.im = 0;
    / Y. ?, R& h1 }/ v6 e" ]) E( {+ H' m        int j0 = lenB - 1;# ]+ d9 n# O7 Z, x- i
            int    i, j, i1, reali;) v$ E4 g0 k& ?) L+ f
            if (lenA % 2 == 1)
    , _5 k5 Y5 ]; m                reali = lenA + 1;7 t& `1 m* [4 t& b
            else
    7 n3 z, P8 ^6 L7 u                reali = lenA;4 g6 c' {- A) P7 ^" A# T$ i" `  ]8 |
            reali /= 2;
    0 T, ?  E- V) s; U! i
    * {/ n5 M8 C- K$ b* z& @* z        int nconv = reali + lenB;5 c# ~* Z2 S8 y( w2 K
            //#pragma omp parallel for
    / f6 ^9 [% }# j% \4 ]1 |0 A        for (i = reali; i < nconv; i++)% ?! o; E  j! ?( W# B% V2 |
            {$ s4 c5 h$ h; A1 D
                    temp.re = 0;& i. n/ i" A( n$ H' f0 G
                    temp.im = 0;
    5 X$ R4 I! v4 ^  v* B1 x% f                i1 = i;
    3 V2 U+ U4 s" z' g$ o                for (j = j0; j >= 0; j--)1 q: d& N( b) z, u4 m7 O+ f/ [
                    {
    - R$ h# V7 m. W0 W7 k. }. ?, U                        /* floating date operation */
    " z' a3 U, j. R5 ?* g                }

    " `4 R& n8 S/ V* r; ~, D0 J( d        }
    - I- D. U4 C9 z5 H/ S$ B& B0 @}
    + Y( s& E) b& @* G; A+ o
    % g0 P- j* _+ }! E* kxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    & N) F7 \3 }4 e9 B! a6 ?' l' \5 y3 B8 u8 r2 k
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。5 ~6 U9 {$ E1 B3 E' u
    现在call xcorr 100次,耗时78s.
      F8 J- }. P9 \/ v2 T$ Q! d4 Q
      b! |% }/ L# h# J" d如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 6 T0 z  l) X/ |# F* N
    , t, ~% L5 ]: q6 I
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33! L% F# T6 m9 z+ @6 ]9 i
    Maybe Debug mode?
    2 L4 u+ C5 m, ]6 w$ d- i7 _

    , l$ w0 u, [+ H) C8 C& P不应该,看我上面的回复。
    6 R0 P$ z+ x  }! G' X% w. x0 I
    : o: q8 U& a7 L! Y- P( z& `, R我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 & F6 F0 S% N: C: A  ~  _7 g
    雷达 发表于 2022-9-24 23:54
    2 `, p6 G: Q% P% s" I5 Yvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    * @# i4 R1 w3 Q8 C3 H7 n{% I9 ~' I4 ?& _3 Z9 q. O& v
            comp temp, xtimesy;

    , t; P. O- g8 a$ j9 R; V& U, f- V1 ]9 |
    这个不是这么比的吧。。。& P7 n3 [' x0 o5 J% s% f

    7 }2 }, n* v) \& p) D' o- \( U您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。# E, U6 m7 {9 z) v3 L

    5 M* z( q: ?" t而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ) {1 l! ?; [! t+ \9 t
    数值分析 发表于 2022-9-25 00:20
    - P6 \) ]. Z1 ]. \7 ]这个不是这么比的吧。。。
    ) K) X( q/ S6 H( C3 q, q; _7 H" W. Z" y+ a0 a0 Q
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 J4 L; g# i- r# G+ h' j' ], [- `

    ' b" C/ M- \9 M0 O# C& }! a有道理。& U& g# m6 V. r; ^; t) `
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    * h; G6 z' }. `4 |! O" A, J; T5 U  O. z/ k6 W
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    6 ?8 s9 l$ p/ j8 G, w有道理。5 m+ X  W$ B2 M6 T- U" y& S* X5 d
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    7 {8 Z- l9 R4 A你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多" m1 U; w; l* U6 D% J9 {+ A! _
    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. L5 ~% s5 }. A; h. Q( v! [
    这个不是这么比的吧。。。$ D5 a: ?9 d* K4 C# W" ?2 V

    7 J1 e  v: I2 P: E* D+ R& ~3 k0 I/ ]. y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    2 U! s( f( R6 T' X- C' l8 b: U' G( R& V6 v% g# G$ A
    现在的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 编辑
    ) j6 N  l: {" K6 F
    沉宝 发表于 2022-9-25 01:485 u2 e- r. f7 a/ B! o; _" V$ k
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    . [1 u0 _4 T  A% D( l1 l* e
    1 x$ [2 F& C! r0 }% k) w' y, f: A是的,兄台说的对。5 W' Q. _% \8 y/ T& b: c
    3 F% H& J; D. Q+ k$ I! j
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    6 G, P* y( a0 D9 n5 z' ?5 J1 o0 [  J: h2 h$ T- A  E4 ~! H' V
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    + @% |2 A+ ]1 l) F+ T; w, p
    % Y* O) }& j4 W$ e/ p3 K' _比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。' U0 W5 h/ H9 `8 s- p. j

      v$ u- S5 O: t; G" K当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ) S; g8 U9 p( Z2 w- Y/ V* _3 h2 D
    沉宝 发表于 2022-9-25 01:27
    ) E  A& t5 R! x, C) y) p1 L你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    : P) g  ^! N+ V4 D9 M. P
    7 J; b9 H# \# F又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。8 u6 `/ t5 V& V$ {% B+ Z

    8 q/ V1 e; Z6 W9 e0 `& K+ U$ H" y我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    6 d9 f/ Y. f; N  v. F又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 g/ `8 J1 I6 T  D
    时间差一倍的结果可以接受。; Z) q" `% h* z; H+ t. ?1 ]

    0 Q$ a7 S# N- }/ i# @你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    / n3 i% n& @! Q: W# O
    雷达 发表于 2022-9-25 04:47
    8 N8 W' Q& t" n又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 K. G) {8 Y. ]5 C6 a

    # A4 Z% M" d% P. B5 h$ b
      ?; B/ Y' T6 r1 b0 p7 \) v( z$ ]% I* x# v) R4 ?) a& {2 O
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 % V, z2 C* W1 e+ v. u, b: p
    数值分析 发表于 2022-9-25 14:58
    5 g) r  D7 W9 T4 P) a& W& `能不能把这个也贴上来,看看和上一个有什么不同?
    ( G1 P8 t( C9 h2 Q$ {& M, E
    理了理思路,重新做了一个测试。
    & t7 `6 p! x7 K0 P5 w1 o2 \做了两个 vector 和 两个 float *, 都长 100000
    0 P! @( N( t  z- P  E/ f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    5 g. R' `* t+ A
    / m; J5 Q8 i* A3 R内循环试了4种方法,
    : [0 r! o0 M" B2 K) R1. 直接调用 vector inner_product 247s
    . c0 r- L. y# C6 [# a8 q: G2. vector 循环点乘累加 237s! B  s2 W$ e6 P* k/ b( {0 ~; y( q
    3. float * 循环点乘累加 204s% M$ Y' `4 r0 z
    4. 空循环 100000 次 202s
    , }7 v9 H( }* p3 I
    # ~0 W5 i" e9 W6 q- U& E8 L/ p* H不做内循环 200s
    8 w! f/ W4 S3 G9 b- e9 ]
    , @3 I+ V0 C. q: Z6 D0 z" y你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    + r1 p. e; o+ k' z0 U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    0 k, T- C/ ]/ W, ]$ G% }1 ^3 G& _: M( |  d
    " L6 U" M6 l. ], L) f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 r8 ?4 s9 _/ p+ e9 K5 y+ R

    # c- Y. a( X5 x0 s0 ~; H, n(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    % v0 X: O' _# K/ r7 ~. h/ r: v0 V; m+ b8 M9 T( c& }
            std::vector < float > vec1(N);
    4 E( h1 r/ ?) p  t" m) L8 y% w- T        std::vector < float > vec2(N);% M8 h" T+ @, f. M) u
            float* b1 = new float[N];
    ) _4 h. y& o& p        float* b2 = new float[N];# }9 b/ x9 I5 d  ^' Y  y9 c' T

    5 i! \3 Y% `1 s* _        for (int j = 0; j < 6000; j++)' p, _& p& t, v2 J" l
            {; ^1 V: R) C* `2 t  B
                    std::generate(vec1.begin(), vec1.end(), []() {
    + K4 u0 O1 C, H+ W; P& @" {  T                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    0 z9 {2 L- t: i2 n                        });
    , r7 B5 G" x0 Z: f
    1 j6 L* ~5 E! U5 m9 s5 _$ p0 ]                std::generate(vec2.begin(), vec2.end(), []() {
    $ y1 i* ^6 G: k2 P+ x; a! `6 Q1 _                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    7 a3 }; S; P3 J                        });
    7 l1 A* |1 y  V# u: g) H5 S! ^
    2 Z& Q% _* r- _$ W                for (size_t jj = 0; jj < vec1.size(); jj++)
    ( c/ l6 A% z# |; I+ J& J( s                {$ ~" U" [6 W5 D; a3 N/ M9 v  o* X  x
                            b1[jj] = vec1[jj];6 y6 I# [6 O+ a! k  {
                    }
    4 D3 h7 z7 @/ i% S6 S9 K0 Z( S, n& V% C
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ' Y$ {+ \! Q! l5 N                {
    % v) K! V1 O$ V                        b2[jj] = vec2[jj];
    , j5 A6 C# Y4 ]0 P+ j8 i                }7 A, R1 Z- W  @  H) x
    0 Z+ [0 ?7 _8 r+ O
                    //Method - 1  N=100000 247s  
      i4 P& y; \! |) c                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% b" S) e; ?2 b( `7 ~. p
                                    ( Q2 N7 u( S, C" ]+ v0 I
                    //Method - 2  N=100000  237s1 F* |- ?( O6 o) G) L
                    /*
    * S  V" O% U. M2 `9 d                for (int jj = 0; jj < N ; jj++)
    . Z8 M, H2 t( f4 z0 G, M, L                {7 ~2 o9 ?! E5 R+ _: W
                            fresult += vec1[jj] * vec2[jj];, d0 c6 s: c0 {
                    }) o/ a$ [# C0 ~0 W: J) C) n
                    */5 k7 Z; i" ~* h+ _) e
                                    
    9 a$ {7 k( F0 F& n: T7 Q                //Method - 3  N=100000 204s5 v: E$ ~/ B5 M' y4 p
                    /*- v7 b% E$ B3 T( |
                    for (int jj = 0; jj < N; jj++)
    " ?, ~4 n& N4 n+ x# _2 i# Z& C+ R                {2 K* N3 p; e+ i" `. d; p0 {/ y" Z
                            fresult += b1[jj] * b2[jj];& ~" O( S5 d6 @5 Z) H7 [
                    }
    : _" f0 ^+ P9 n) X+ M: T                */% ?. V: [2 A& S' x3 P, i  O) F. @. J
    / {# m$ ^' L3 `2 M- I! i+ Z
                    //Method - 4   202s
    9 l9 {4 t) S5 l- F                /*5 T8 l/ \4 ~( l, |
                    for (int jj = 0; jj < N; jj++)) p% ^) s; E+ B0 J" w
                    {  _* @) u& h3 a; @
                            
    0 }# Z. R! ~. y                }
    * X: `6 U8 m  }6 O, d* b. A% r+ r                */! E! i; @, D- _7 n, K  j# M
                    //comment out all methods, N=100000  202s                8 o) X! ?; H8 u! e9 D  J
            }
    ) |$ k( A# ~$ v0 |* h& j/ X9 v0 }1 s+ ?  i8 Q3 k0 j6 u
            delete []b1;
    + L* K7 M  }5 a        delete []b2;
    # w- C. u0 r* [% `5 Z
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! B- A1 W1 g! h, ?
    4 k. ~3 k) s- P3 y0 ], l) i
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?" j4 H% q" s& t3 e6 o: O. P
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:152 e' m6 e; O1 p9 {$ }
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    - g6 G- e2 c2 `; i2 O; V& q( z
    3 Y2 c' D7 Q/ c你第二个试验里面的j在循环里面又重新定义 ...

    4 f' P6 A6 r, a5 H内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL1 x, s+ g8 w+ b! f$ ]  r

    * [- x) s0 k: d4 A不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    1 d  k0 B( n( A5 V% w/ d内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL4 s! P$ u; n: v7 ?; \) u

    & K  q+ }$ y6 J+ y/ o0 p, {+ V* s不和它 ...

    / ]; p9 ?8 w4 A3 F1 C# y7 O8 @% U7 F6 ]
    . Y; \  o& J! e# N' Y不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    6 \. h/ \: m/ B' J7 G后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    % E: m  K/ _5 H( v* S! F1 N* \% uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 X" ~/ P& h' b" j2 x# C/ A
    {3 E3 X' f, [0 K
            comp temp, xtimesy;
    ; S8 M3 L+ ~/ F  p+ k
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    6 f3 {1 X" P/ z6 u3 X内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    : ^4 h; E. S( ?0 f: z' X9 }) CVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-25 00:53 , Processed in 0.082354 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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