设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    # a+ J! E0 F9 J7 ^( q4 p+ |/ @. Y! A$ S
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    . L1 z) {) h2 m. _- a1 m# l6 w; C$ Y. O5 p4 C% l/ f
    速度优化问题真的很有意思啊。0 c$ g" h  t- F1 P3 q8 @+ ~$ |9 a

    ; U9 F0 ^- b- T! a* G& f9 C3 m6 s欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    # t7 _6 z( |/ f把代码贴上来看看?
    . C8 K* M- F3 [8 {9 ^, W. b1 D8 [3 ^, n6 p( S  L# R+ z/ T0 |
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    3 l1 h0 e; \' I0 O
    数值分析 发表于 2022-9-24 23:043 E# t+ g" ]' Q2 Z3 L" T& j2 }, X
    拉下来?拉多少?" A, N9 P4 Z$ {* O9 J$ F4 G
    把代码贴上来看看?
    # z$ w/ j& ?7 h8 @
    , V9 u0 @; F; p, g1 J% T
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) _- ]$ J3 _  o8 Z; m/ I: [- N
    {
    4 F, s3 _  X: J: }2 W, r        comp temp, xtimesy;0 Q" b7 g- \* K5 \5 `4 }6 K" `+ @
            xtimesy.re = 0;1 h+ c- Y/ n2 b  e- S  u& S! f
            xtimesy.im = 0;% {+ n1 G, Z% U9 ^5 a- U* i* V
            int j0 = lenB - 1;) d* |5 \& J4 e7 h; K
            int    i, j, i1, reali;
    1 p( z8 y  y3 C  C. R        if (lenA % 2 == 1)
    + S: \! W4 X& J. L                reali = lenA + 1;
    " n" v' u  ]7 z) t; D; N2 s' |        else
    ( ?5 f4 E0 f& n- h0 i: X                reali = lenA;' X5 R& A* {0 {0 y
            reali /= 2;
    ( Y! r% Q, S9 t$ Q7 O6 f3 R' l# |
    ' G9 T0 A4 ]8 |4 [: m. k1 r+ Q$ Z        int nconv = reali + lenB;8 @; d, l7 B8 J  U8 {* b. S
            //#pragma omp parallel for
    . X4 o- O: i8 ], ?        for (i = reali; i < nconv; i++)) Y; @: |' ~% \4 n5 T/ |
            {
    6 y% r- c( ]# N- H$ ~                temp.re = 0;
    6 f) G: @' c+ ^, |+ z                temp.im = 0;3 Z/ L" t6 J, s, X, `/ ?$ x6 `
                    i1 = i;2 |8 G  D+ \8 S$ V3 f- Q0 d
                    for (j = j0; j >= 0; j--)
    $ h( P) j2 `9 }" A1 d9 D+ K$ M                {, o$ g$ o& B/ K3 o0 H3 J. V
                            /* floating date operation */
    7 b" S9 Y* P/ h                }

    1 y1 W( j. s+ A" f- Q        }9 J& J  o6 {& o5 P( Y7 K! v; i5 r9 U
    }
    0 y/ {! J& b! j" I* s. L
    6 J& G- Z+ N8 H6 t' [. a& Mxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样9 `% a- ]( O/ s. p& Y2 e

    6 q  v3 V* G2 m1 `- K1 E5 ]红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    - M0 ?3 w' t- R( {( l, J现在call xcorr 100次,耗时78s.
    & @( E) E6 a. s+ O8 r: c1 h9 v7 |3 H7 w
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    - I1 p( `3 g- K
    ; m( j1 H4 ~+ R
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    0 N$ S6 S( }2 i' T+ TMaybe Debug mode?
    / T% O9 M: a8 I! A, h1 S0 I

    0 v* n3 |. P0 ]不应该,看我上面的回复。+ M9 H/ f5 i2 q% E; ?4 {

    ) F/ U7 {1 P) _我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ' y% a  y& V: Q& w- V/ P! J" o
    雷达 发表于 2022-9-24 23:54
    8 J* k# W( C( P' ~void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 P# K, y1 R; ~- L5 H; J; \
    {
    4 h  K  c1 O8 R; }+ |1 Y        comp temp, xtimesy;
    ( k6 n5 P  @) b
    + \4 a. ?0 d3 _& h3 d5 Z
    这个不是这么比的吧。。。4 c( J' Q4 U8 V0 N0 c. c

    ) A# {) z* o; v1 s# u6 @; P( z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。% P: S2 ~5 E$ a( ^5 V
    % G/ e* W4 a% R1 f: I. {
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 - Z+ ^7 l$ ~; j- n
    数值分析 发表于 2022-9-25 00:20
    4 c& W( `* U7 x* D3 }这个不是这么比的吧。。。+ ^. x! u% W! K

    - e4 g- T, R  |1 g5 e7 P0 P2 Z0 b7 a您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    * Q3 [' ^  m2 O# R. R. d9 a
    3 v: y. E' t1 J! t7 g  a" y! K/ O有道理。
    8 B+ U$ |6 T+ P5 C8 ?) Z% Z: e所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    % p9 C5 L( e. g& }
    4 A- j3 u. Q' ?2 M我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ! {% w: u3 p, ~$ [, B& d  _+ F有道理。
    # D  ^6 S7 U; i4 m7 C' p+ Z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ( x/ [; `. E2 p3 M3 `, _3 F( v. M
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    7 j6 P6 G$ q* u, I' PWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ; I+ }. W5 k' J, F! A这个不是这么比的吧。。。7 c$ i' B. v" [( [/ v! h

    # k7 o5 ~) V; }. \1 P8 U: Y( X您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    & m5 G; `$ \  q) u4 Z% `
    6 x% \  h$ ^3 s/ 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 编辑
    ; f6 ?6 G$ ]' _" r3 {! H# y6 `% U& d
    沉宝 发表于 2022-9-25 01:48% r6 n( x8 E7 `, P; g: n8 }, \) V7 F
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ) M5 a: K/ }% R# K% o7 Y. V
    2 {6 ]# N# y  V1 F0 R) H
    是的,兄台说的对。5 g. P9 N+ L1 }( z! G: X7 ?

    . D* q( W* D4 m6 h' Z2 G  |: h# E其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。, S2 v9 j/ z/ Z' P/ c

    4 d  t* U3 K. H5 N: S# E& G6 X雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。  a& r* `/ J. |" w
    5 E) u6 h+ E$ i6 }  q% r1 P+ N
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。4 i7 m& U: X9 M4 ?( _8 K% E5 g

    * T% L0 M+ A9 ~% {6 s- U" ~当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
      M, B$ E  B! G5 F  F! G
    沉宝 发表于 2022-9-25 01:27: S& [2 J3 z" o; |, Q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ; R$ j- q, {: C) ], s

    ( q" F7 q3 s1 v4 ]. s; [又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。: r6 |( K8 w1 P+ P( U$ N

    7 z  M/ O$ g7 R- u/ F1 h3 k我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:475 z0 ?1 M: D) D2 `  d
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " x/ F  ?3 k7 U3 {/ u) i1 d) ?
    时间差一倍的结果可以接受。; m( ^4 c0 K7 D$ Z
    ! q0 |2 F$ q! L7 R' `
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 2 Y" x, [) s; V+ E
    雷达 发表于 2022-9-25 04:47
    9 O. C4 n/ S0 ]: k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : g- h# e1 w/ s% C. O
    . T3 p3 c) y( e* T# f$ e. z. B. N
    7 q5 Y- ]4 s$ ^5 V$ |6 e' e
    * ]5 G* F  ?1 B8 o# a# q* T
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    0 G+ E3 }- w* T. s# `
    数值分析 发表于 2022-9-25 14:58& O0 Z7 T! `$ s+ d
    能不能把这个也贴上来,看看和上一个有什么不同?

    3 B8 F0 g/ ~9 H# c3 w) R理了理思路,重新做了一个测试。
    / r; Z+ L7 x/ {4 W做了两个 vector 和 两个 float *, 都长 100000
      ~, v5 s6 n% ~! p+ F外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    5 I0 r( V7 O! ~0 T" `2 U3 x' H3 d
    ) `! T" I% L& n0 H1 G内循环试了4种方法,
    " U& }+ t( p! X3 o9 F1. 直接调用 vector inner_product 247s : Y: C8 p& v0 u) n
    2. vector 循环点乘累加 237s+ q" z  y( V( D* Q
    3. float * 循环点乘累加 204s+ Q! J" L- f1 p9 u$ V0 T
    4. 空循环 100000 次 202s
    ( _0 @2 j* m" J
    ' J- A. j% I. l0 i+ L" P# X不做内循环 200s
    / p; [  r$ I2 {4 d
    - M- u* p- x* w  S( w你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ {' |5 C- ^9 T( H/ p7 ^+ t
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) a: I. C: k* b3 I

    0 v% o; O9 y; }, ?. B  y* e2 a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    . y4 B5 z* Y, F5 n. D' [: Q' F2 P' p7 I6 m5 ^: N5 ]. T5 d  O
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    0 g8 Q2 U! j& X! l
    $ _( m  r5 F" H& M
            std::vector < float > vec1(N);
    6 @' n( a; s5 z/ v9 ]/ H        std::vector < float > vec2(N);
    9 z9 |* H5 W+ H        float* b1 = new float[N];
    ; L0 H# D+ m/ F0 I: r7 z        float* b2 = new float[N];
    * o3 j2 \0 W4 |" U  F& N8 l7 B+ Q; ?" W$ ?! a& E& S' i
            for (int j = 0; j < 6000; j++)
    * R/ e, c: E) L5 |        {
    : ~6 k7 u8 p1 @, I+ O, |/ d                std::generate(vec1.begin(), vec1.end(), []() {8 M9 f# n6 K9 o+ C0 s# v9 n4 h2 b
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    6 g) [& s+ s' Q                        });
    3 T$ i+ Q# B7 Q2 l3 s2 _
    " x( _0 x, ?% n1 [9 \' A                std::generate(vec2.begin(), vec2.end(), []() {0 S. {9 c  s7 y7 E
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    / ]# P, F- e2 [, C& A1 f                        });# G3 O  a* H! C3 x. F# L
      h3 Z0 z3 I8 N% r. [
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ) H; p5 O! g6 R- o0 P: r                {  Y/ x& C$ ^2 @8 T
                            b1[jj] = vec1[jj];
    8 r. c3 G4 k# Z, v4 {6 U1 P% _" F6 o3 }                }3 D+ o6 b! _( K- _' w
    0 _- ^! o+ {. p# `! N
                    for (size_t jj = 0; jj < vec2.size(); jj++)% d3 b* \' ~/ E1 ~  R5 i9 c
                    {
    " S, H) \/ J3 D5 r3 ]                        b2[jj] = vec2[jj];5 s& g: I( v! g* d
                    }" l7 [3 p, Z/ r/ @
    " x1 H4 c' {: D" e( b5 T$ S8 A1 v* u
                    //Method - 1  N=100000 247s  $ o/ N7 a( ?4 B7 ]0 Q9 C- }
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    + z7 K7 A+ J! v. F, O                                
    + o( Z1 p2 W: V8 ]                //Method - 2  N=100000  237s$ Y6 k. Q9 D; {
                    /*- _: g: r  n! j: c. z' f" M
                    for (int jj = 0; jj < N ; jj++)+ [0 K& c8 [) ?' r
                    {
    3 S7 `# N8 Z% x- I# _* m                        fresult += vec1[jj] * vec2[jj];
    ) r+ C7 |- w) u/ B/ ~                }
    ) P  ~: j6 f; l1 [8 v- ~$ C$ u                */
    - i: c" l+ l' ^" V7 D' |                                * ^* z1 c( g% Z# y9 j+ j( C0 @- i
                    //Method - 3  N=100000 204s0 p$ W1 p, \' K# m2 t: V
                    /*6 D% o, [) H" r3 y# V3 q
                    for (int jj = 0; jj < N; jj++)& J6 k" O+ z" v) H( S
                    {
    4 O1 U4 \8 ~) I; Q; K, }                        fresult += b1[jj] * b2[jj];( i  B+ `6 x& p2 ]8 H% _7 V
                    }
    " ~; R( I6 g/ g# t6 |, ?7 r$ p6 U                */
    , b( V6 w$ S2 m) m( I
    % d/ J3 y3 W0 z3 q0 r2 y+ S7 ^# W                //Method - 4   202s
    + b2 ^# C5 @" J. t, ~                /*8 y! r1 `3 {% Z! |! P8 d
                    for (int jj = 0; jj < N; jj++)/ o& F3 Q' P, b9 H- j# ~6 P1 T
                    {8 x! m  ~4 {/ ?6 b
                            
    % z0 I: l8 ?- s! M0 l+ J                }( B/ V- H, |! `( K) ]9 l
                    */
    ( o" y# T; `) a7 A6 r                //comment out all methods, N=100000  202s               
    ( G# C7 X9 `+ `- {  o7 x' Z        }
    4 K6 E+ M; \8 r% t) Y7 C
    9 r/ F2 S6 w$ F5 {        delete []b1;
    - b& X* Y7 }5 p+ n) c        delete []b2;
    4 C& I& r' d2 }2 s, \
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    5 y# A# G4 S) S: w" K9 t& d- s5 W( T- b8 r6 C9 D
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    * L: i# r8 ~( i; b3 B  t0 C
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ' U( P6 w/ e1 O) ~瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?) o, P1 k- N% n/ B# h

    ; F/ Y- R; I4 y- D/ u/ y你第二个试验里面的j在循环里面又重新定义 ...

    5 [. k2 s0 n7 Q  u, w: O内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& `! r4 a6 R$ b/ r: O
    & z) F/ \; f: R
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16! [9 j" D1 u; c
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    : l9 s) V! O* t- G; F
      s- m/ {% k8 @- V4 G不和它 ...

    + Q7 y/ j& i* A$ v; J' u. n+ B& @" L4 y) }
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    # B" {2 Y9 C2 Y$ M/ U后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54% H) V0 D- O& \( T+ H
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& v6 Q( n5 N  l) S0 g4 g3 X
    {
    5 a+ x" t' G$ y. i" z        comp temp, xtimesy;

    ! R, h0 ]0 W: C" M; G$ h这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    * i, r+ J5 U' r# }内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?$ X6 L7 l# W) [) B
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-31 09:23 , Processed in 0.075760 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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