设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?6 z; a- K  N4 A! t5 M4 P7 h5 c7 \

    " {. R" c# U' g9 H7 J8 W' q自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。* l# b4 X  b* g/ i$ e
    8 m% E0 G+ p9 Z4 s: b
    速度优化问题真的很有意思啊。
      ?+ l2 `; l6 _" a& \: C/ m- f4 e( H
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    " i5 @7 k* A$ I' h. b2 V把代码贴上来看看?) _* H$ f! c  D# P& y1 o

    6 ?3 p3 Z9 u9 G2 N4 W# F5 C9 A( s难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 4 L% L  ?) t( j  ~/ y1 J
    数值分析 发表于 2022-9-24 23:04
    8 D. Z6 ^7 m( g6 ]5 e拉下来?拉多少?. Y# H# j& q' i
    把代码贴上来看看?
    / d/ }' O9 p5 B

    $ c0 P4 s2 S. O8 Rvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ n/ {, G$ h, K* n3 C2 e' _
    {- e6 a2 c- ?# N! X6 G% c: v
            comp temp, xtimesy;
    " u; l, _9 |( g  U$ S        xtimesy.re = 0;
    ; Y9 a$ z3 ]6 n        xtimesy.im = 0;
    % X' J. Q4 V4 L& T4 ~        int j0 = lenB - 1;
      }1 _, i0 ~0 p. g5 e4 w$ F/ [& E        int    i, j, i1, reali;
    6 M. |2 J1 L: \        if (lenA % 2 == 1)
    " k* R8 ~' T; W                reali = lenA + 1;
    ! o. ~2 ]- p5 ~6 y) j" d        else
    9 f- q* ~& V; ]4 f, m                reali = lenA;
    6 F, [5 |# }2 l5 f  ], w* k; ~1 {" V        reali /= 2;
    ( w; M1 ^+ F2 C" T2 C- Q8 _1 }1 A2 i. ^
            int nconv = reali + lenB;# G/ k5 Q1 A8 W3 C; }+ e1 M7 ?
            //#pragma omp parallel for9 B% O+ f+ S2 |$ h. a6 L# Q
            for (i = reali; i < nconv; i++)+ q# }( A0 Z4 O9 z$ b
            {
    ! q7 |# W7 I; w0 v$ A6 ?; @                temp.re = 0;1 k% x5 O' k- z4 ~; I
                    temp.im = 0;
    # Z, K% v' C/ s- N2 N' M+ D1 i                i1 = i;' t4 r4 y5 C* H. O
                    for (j = j0; j >= 0; j--)2 I: W+ N& e/ S. V( v) v' Q! s
                    {& z- ]% W5 O* O6 U
                            /* floating date operation */
    ' G, L% D  \2 T* q                }

    6 T5 x! Q, o  Q        }
    # N6 v# Q. v2 c/ x}! _$ p+ R1 W9 K+ f( g3 Z

    ! z" G1 _1 a5 p1 t) vxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    . J; J' U8 i* k0 z# L' N
    * C4 ?" e5 {; |/ I! Y& ~+ T红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。4 A+ v" M' q& a3 H/ H* c4 `
    现在call xcorr 100次,耗时78s.
      l* F6 Q4 j% r: n* s( j, ^
    $ |( W. F7 |$ K' R如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. % J$ `# {% Y3 z2 @, k" E5 a. Z
    & \1 V# U) h. R" Q% p/ @
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ' Z: o6 c+ E( s, w, P6 F6 L" x/ |/ XMaybe Debug mode?

    & n5 j+ a/ m8 J) G0 `9 n9 M' r
    9 @7 M9 d5 F' ]) X5 i不应该,看我上面的回复。
    8 t( Z( B4 \( ?) m+ p% i- M
    7 J2 s5 Z& o* Q. m- H  C( h我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ) @( D2 f. U, B+ y+ k4 T% _
    雷达 发表于 2022-9-24 23:54
    0 h( g9 Y5 t% C3 y1 V, O3 a9 z( y8 Xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- h2 _/ t) s% t' }1 {; B
    {9 e" D- {- f1 ^, S# k4 A6 w. B( D
            comp temp, xtimesy;
    ) P3 V: _- ]6 `4 D9 N, y

    ! l- M( l1 I9 d$ W& P  t$ p这个不是这么比的吧。。。
    ' C2 {( J5 Q: p: q( h, `& Z  N* ?7 W9 j, R* h- U
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。& X2 }. r# G+ {8 h) ]8 {5 v* N

    7 D2 }1 j/ a4 R( a而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑   T( T2 e# {# `
    数值分析 发表于 2022-9-25 00:20$ h& _( g5 }: S1 T; |. b7 h. O
    这个不是这么比的吧。。。
    4 S- t9 W* ]  Z3 Y2 V# t% i
    # v" }) j7 Q* e' p" U您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    / u% a1 s, T7 M, D% }6 m  Q* O( z3 }* D" Q
    有道理。0 H: f' s9 h9 A5 S7 {: _$ M$ @
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    1 Q: g1 t) T9 O7 n! v+ W1 Z  `3 W" ]& b; E: \( T
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:469 D; z2 G, a# L& ^% T
    有道理。
    8 h! G2 h2 E3 Y所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( v/ ^7 n5 S9 s( V2 }  O你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多, `7 v: l9 x7 m! n( w. L# y+ g9 |5 K
    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" ]9 u) _4 a, p! T7 `9 M" d/ P
    这个不是这么比的吧。。。, s- I7 B2 P) j1 I; i

    6 M* V# d5 {/ x您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    4 M7 P& b* a* m7 x& T  U- D5 h
    ( y& J: `! `! F9 \现在的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 编辑
    5 @* h( I5 E  k6 V+ e5 P$ y
    沉宝 发表于 2022-9-25 01:48
      J: Q+ {, a0 m1 B9 J现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    0 ^" L/ r9 Z+ e2 l
    $ `+ I) T/ |: v7 x
    是的,兄台说的对。$ a9 D. x  X" J

    : a$ M: I: ?% |7 f. |0 |0 w  \其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    3 [0 V2 z1 X) f' B" m8 ]
    5 P* V5 _- O1 o( \* ]  _2 [' ], `雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。# B" ]# ]2 b. z: k) a' z1 [# [2 v

    & D; X7 D0 Z& z5 D2 Z5 `: B/ [比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。3 g; T/ D! c+ ~5 _  [9 k
    # p5 ~6 ]9 w1 f7 g. q( D
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 % h1 ]" s4 c% v; q: u
    沉宝 发表于 2022-9-25 01:27
    ; ]$ j8 o& O- C9 A你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    + M- s, z: h+ D; r& C* O; ~( R7 c
    2 I2 u) M' p5 s  p& [. l又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    - x3 L% V1 ]% y# O# o! Z4 ]; B! |) A% a& F- w9 N
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:471 ^: [$ E* K4 _$ f  F" M- W% y
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) }/ a( x; v1 n7 b  n& E" a; R  k  j
    时间差一倍的结果可以接受。* L* M" ^' I% u$ j% Q4 D3 ^+ K
    3 Z, G( W5 N9 s2 S
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    6 B# t  z& q) `" O) Z
    雷达 发表于 2022-9-25 04:472 j3 [* `% U8 `! _
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 j4 ^; _( ^5 Y) @& L, E+ b1 W6 [' Q

    7 d3 K* h$ R. _# m& r+ ?9 N! ~$ B7 c0 F+ E, P# h8 b

    , F8 p3 l( ]( R% R6 n3 f能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 0 A/ F# J: M- }  Y. m- o2 n
    数值分析 发表于 2022-9-25 14:58
    5 F" x) x0 D  Z能不能把这个也贴上来,看看和上一个有什么不同?

    ! r- N  x# b3 o0 G理了理思路,重新做了一个测试。, }" A9 O9 [" q
    做了两个 vector 和 两个 float *, 都长 1000005 b+ k, {+ {- ]) y3 L
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    6 D$ i4 K$ F$ o0 C( x8 c3 T
    0 g$ h  Z0 [+ B: a& U# g内循环试了4种方法,$ u5 N$ B$ `" }8 n& W
    1. 直接调用 vector inner_product 247s ) f  c$ l4 c+ C% N) r
    2. vector 循环点乘累加 237s
      A" `9 q+ P# V  O4 F8 L; F% c5 R+ h! U2 ?3. float * 循环点乘累加 204s
    : c6 a1 a! U7 v0 W: d0 @3 I$ D: Q4. 空循环 100000 次 202s
    + b: v2 B$ T5 O1 w1 g
    & T. f4 _. N7 `9 x1 o& @( ?不做内循环 200s
    . T( ^' D1 O/ T% g! W" F
    2 j! u' ?% R0 v# G你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    / R+ }9 W/ E! \; f另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    9 T: _4 U  N, J$ K% \' a! x7 G- A
    1 R+ }4 z" s& A5 k  \( g至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 h( K9 i" U7 \$ h% |; c

    * D, b- P/ m+ g9 E% w(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 @& K8 X9 }" E, t6 j2 Q* k9 @9 i

    " {( p2 m6 D( D  I
            std::vector < float > vec1(N);+ L8 |( c' f$ t* j7 c0 f: R: c+ U
            std::vector < float > vec2(N);8 E/ K  X# Y( [- t% q3 d" ^! l0 \
            float* b1 = new float[N];" I& b% O8 I2 I# @
            float* b2 = new float[N];
    ' @1 ?) |: I) P1 v" c
    / f$ G/ |3 V  p6 l        for (int j = 0; j < 6000; j++)
    , @' M7 L7 \; [        {
    $ a) ^# u0 w  B' j, v                std::generate(vec1.begin(), vec1.end(), []() {
    3 o( U! ~- ]. Q# }+ V                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;# J/ |! n2 r: x3 X7 o1 q! d2 N' p
                            });( X# O% z/ V. Q% \- b

    3 \2 S. J# ]. a0 k( ]+ X) o                std::generate(vec2.begin(), vec2.end(), []() {
    ) K/ `0 U& m( I$ o! X                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;  Q' \( N  u: D# O- s8 X6 N5 |3 }  n
                            });
    - g6 Z# n) Y$ }
    $ x) l+ i  C/ _5 X. V$ [                for (size_t jj = 0; jj < vec1.size(); jj++)
    , Z! J! n, \9 I& @                {
    5 q* S6 {3 g" M2 j$ w$ ~                        b1[jj] = vec1[jj];' ]" H9 s7 o6 o# z5 t3 y
                    }
    " M! i3 N+ v/ Y7 j6 K9 l5 A
    ( U- t3 o9 s. K; U                for (size_t jj = 0; jj < vec2.size(); jj++)% P/ R& z6 X& b! Y2 \$ E' k
                    {. _2 e( a$ a* @2 ?! D& A' ?
                            b2[jj] = vec2[jj];
    6 `: M. U* F$ x                }
    6 x" g) C+ H/ F% r1 ]) i) f
    : n$ p  p2 t7 Q0 }                //Method - 1  N=100000 247s  ! X/ }$ }- W  [1 Z# I2 J" w9 Y, l
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    + E; X; ]5 b' F; J$ O; T( Q8 z4 i                                
    ) B& z; E9 h: z! B( M# ~1 u                //Method - 2  N=100000  237s" }* d: I1 o, d* ~5 k1 a! H
                    /*4 ]/ S! A5 c2 v# K; v
                    for (int jj = 0; jj < N ; jj++)
    & J6 J: u  C. S4 K  N& S                {& f: v! k, S- G2 J
                            fresult += vec1[jj] * vec2[jj];
    9 r. d( R/ I$ t7 ^! ^+ m: d                }
    * U5 F, b( _$ H; q0 G                */
    0 w4 d& y3 [6 Q( a5 a  \                                
    $ ]3 a9 ^: I7 Y6 J& y: q                //Method - 3  N=100000 204s
    ' ~/ T# W% D: b; E4 R+ V/ v                /*
    3 U9 _* q8 V4 S( E3 V% v                for (int jj = 0; jj < N; jj++)
    . v  j' b8 H2 E' _* L                {# v  i( m* E. V! B3 q9 b/ ^
                            fresult += b1[jj] * b2[jj];! Q2 ?2 {, k% `; g; f# a
                    }/ y) r0 D% W/ [7 T6 ]
                    */+ X" E9 j7 R2 ?( [3 V0 l/ S" a1 v3 M
      a2 ~; g$ P$ p9 L) C6 d+ d& E
                    //Method - 4   202s
    0 `9 s; q' L; `2 Y                /*
    $ p3 v" U  j$ Y                for (int jj = 0; jj < N; jj++)
    % Q& D, y9 O5 x8 ^9 j( s                {
    & r# n2 L# z: h: W$ |$ F# m                        
    5 _4 A7 B* X# h/ ]+ M: c6 U8 a, G  M                }) i  _6 @4 r* A) y9 \( y( _
                    */
    & @5 B5 \; C# _, e4 ]                //comment out all methods, N=100000  202s                ( v! a9 q, k7 o  s8 ]
            }
    7 ^2 I: X2 R8 J/ c* C4 m5 B3 J/ ~. y  N) z+ L
            delete []b1;
    + Y+ S  e9 L$ z+ l7 |        delete []b2;

    & V2 H+ J" L8 t) J0 Z& G
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / q4 j6 M( h5 d% x# F  _, h5 |5 s$ B
    , H5 T) D3 r& C1 X你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?& Q" g  n  T1 e/ a: e* G
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15( }2 R" E( r9 R; h. I
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 Q% t- ]4 M% _' N6 E3 C2 x
    5 }1 Z' E* C, \' ~你第二个试验里面的j在循环里面又重新定义 ...
    , Z: D' P; A8 o6 ?
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; r1 |( ~/ ]7 i& e1 O2 \5 K7 i/ p! L6 |5 o7 l  V
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # F$ k6 F% g. p% N$ S$ O0 H内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL1 l) y+ B7 f- b5 f
    & l7 I5 @8 o6 z# Y) {
    不和它 ...

    ; _2 b7 _" }; W8 i! U; Z, \! Q3 E+ }6 d! S$ u
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    4 U+ `# g! K0 S: R/ Z3 Q! a0 [后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    $ D$ d: w$ B  P# |! J. _/ Svoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    7 ^% Y- E& A% l$ V{
    7 ~5 l9 _' b! E& I4 {4 p        comp temp, xtimesy;

    2 a& i4 s7 V0 v* P+ @2 c9 W* v2 B这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。: }6 ^% a; U2 [/ D- o
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?/ [8 Z) `) t2 s; O3 k. _
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-6 08:19 , Processed in 0.077343 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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