设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    5 z. n2 {8 s6 p% P+ X$ w* o0 h
    ( p$ e1 E! v5 R- ]6 w) ]0 B+ c自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。2 c; Y# y. w; t- P( Z5 E, \
    7 l4 S9 y4 r) L: k, ]* o
    速度优化问题真的很有意思啊。
    / ^" \6 K( m$ p5 j3 q, V9 S! _& h- m+ U( J# |
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?; G6 a: ^; q3 g4 _* J6 @4 J8 _" j: B
    把代码贴上来看看?
    7 r: I# b2 o9 V, E# k9 A- f5 E7 V
    9 s& b$ N% X3 Y! Q. G, {0 N难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 1 N8 N3 x% n* @6 g2 ]
    数值分析 发表于 2022-9-24 23:04
    # a- b2 D$ r" w" q5 P8 O. T拉下来?拉多少?
    ; N6 I5 N! J7 ]  f把代码贴上来看看?
    5 @  e8 _. j# }# m. M: d

    8 K* k2 [5 B' }' P3 K, gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ E2 i: O2 g- f
    {
    " C! a. [2 c5 a  J& F. |1 z        comp temp, xtimesy;
    2 ]( s2 Z# a2 z5 P7 h) `$ ?. |        xtimesy.re = 0;; J  v1 Y2 R  U% y1 k) c# P2 n
            xtimesy.im = 0;
    3 j9 T6 t  i! Q1 k9 _        int j0 = lenB - 1;1 h$ r) D! E, N: V3 Q+ `
            int    i, j, i1, reali;
    ! D* P8 s( T, i        if (lenA % 2 == 1)
    1 T$ N9 D8 p  a9 n! h* [7 X) k1 l                reali = lenA + 1;3 X% [! A& M' o9 d6 H5 [" u  U& W
            else/ z) a7 S5 j- z5 n' e; D& |
                    reali = lenA;
    % f$ y; d, x: @! k2 y        reali /= 2;/ C! m# T3 ~: x# d4 V

    0 f: \( _4 R$ Y) X3 i: R        int nconv = reali + lenB;9 v& C, S  x+ n
            //#pragma omp parallel for
    ! u: p$ Z. {% L/ j; b' P  L! y9 l        for (i = reali; i < nconv; i++)5 T# D8 i) @2 [3 S: G/ V  W
            {
    7 l& @+ H$ h+ E+ B$ c3 h                temp.re = 0;/ R/ D$ P2 J; i, I7 k
                    temp.im = 0;/ F; O! n" D; Q  ?, b* c: l
                    i1 = i;* d+ w; S! j5 G, ~
                    for (j = j0; j >= 0; j--)
    6 k; N; z/ h; U7 W$ N+ O3 |                {: L. l% n# j& T" I- n1 m  A
                            /* floating date operation */
    6 R6 R& B; I+ q6 V/ g& a+ d( B                }
    ! |2 a0 I7 a7 N5 i& ?$ I8 q
            }* v# t2 O/ e2 u
    }" I- p# l) ?+ J5 e
    ( S; P3 K! ?# P1 \3 n# m
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样3 @9 @7 n! Q% M0 M9 p( Q: `+ m
    1 \* E7 E4 B0 X* f
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    1 ~- \- K: S2 M现在call xcorr 100次,耗时78s.' A3 q/ D1 a: |' j$ |
      M; A2 u2 j& R1 T2 g' m# i
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    3 m0 \( N" e" @, x% L& l
    ' j4 C& H8 r6 p7 {5 q
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    1 s+ c' `9 W5 S4 WMaybe Debug mode?
    # x/ X0 u5 D! G1 j
    * d1 W' x) H0 H/ A
    不应该,看我上面的回复。+ p) c! X" t! [. @/ _3 P! s3 k

      h+ M; F1 y8 k" }我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑   ]' K$ O& A+ ?0 a
    雷达 发表于 2022-9-24 23:548 M" x7 y- p9 @0 \
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- a/ D1 t# U+ f% x7 H
    {/ R, N3 N( |9 e; s
            comp temp, xtimesy;
    0 U" i5 u& D2 n4 S5 K+ I) M' y+ H
    ) w2 e5 k3 t. P& b! n2 ~- \
    这个不是这么比的吧。。。
    . \4 L7 a, S, Q. a1 }5 \) @
    # g7 B5 s/ O0 g7 w4 m您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。9 d; G5 I2 g, _4 d, ^3 }9 x& q

    . T. j. ~2 L9 Q$ P) M而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    $ O( s2 S5 d8 L& n
    数值分析 发表于 2022-9-25 00:20
    4 j% t& g9 F+ e- I& G0 Z这个不是这么比的吧。。。
    ! s2 I$ U8 k. U* K1 e2 B6 w1 `% |* h  \3 z7 C: I5 T2 a/ k
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 s+ b2 z0 Q8 m' e
    , ^+ m1 D/ O( X! W2 s6 K. n
    有道理。
    $ c# x8 |1 T* ?/ d所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。/ ?8 y& I6 i0 y. h, O2 i
    7 i( Y" ~7 e1 r; o
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    4 p7 F7 d" h8 W9 L1 r+ k: Z; _有道理。
    1 D7 D; q& \/ }1 ^所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ) s# K. b) D9 d; y) d& G你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ' S2 J/ l! \2 o* S, W5 ?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" r5 {% M% u+ z. x9 X
    这个不是这么比的吧。。。
    5 z+ e9 Z9 [% G9 V
    * O' O3 b9 v' h+ Q' ?' u$ y/ N9 X您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    . A5 A% c& D2 V

    ) ?, s: L, X1 \9 V* D2 C, q3 D6 i- l现在的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 编辑 : p! E$ }& a2 U
    沉宝 发表于 2022-9-25 01:48
    0 T* w) l7 g* b) _; v) w4 n现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    $ E4 @. B3 w8 H+ p

    9 G/ N) Z  R3 \7 f- a* |2 P' c3 i是的,兄台说的对。
    ) s/ K1 A3 H3 U$ X8 \: g! X8 {  Q! r2 g& _
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ! b) [( Q+ S( N/ @- P$ b0 Z
    ( ?- D+ A6 D5 ^% G1 a雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    / u% B1 S9 D. Q+ {6 K4 {. m  I( h: N8 P% `* p
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。$ G; n5 z- h0 m. @; K2 h7 n5 s
    / G: N" r4 Q: u4 A& a2 n- V
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    & P9 A1 q+ m* J. O5 ]
    沉宝 发表于 2022-9-25 01:27
    3 c4 ?4 x: A! g. G( y) H你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , n/ Z: s) H- I5 ?* U4 n

    ; V8 [) A6 ~2 p6 l又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。! q; A+ Y6 Y9 [- X+ ~: o. Z3 J! [+ Z

    , D1 a, u$ u. K3 d! Y& ]我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    * G* D# X& A7 Q4 C* }又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " D3 D" v, `$ M6 A3 w+ P$ C1 u( v
    时间差一倍的结果可以接受。
    ( Z! l( {+ J' L1 y- U  w" _. W% z
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ! V8 x! X3 F2 ]' s
    雷达 发表于 2022-9-25 04:47/ l' U  @3 i4 o, t( {
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
      ~4 C8 G( P3 W2 ?; d0 u5 s
    ) y% T* D; T& h& s, i, k

    - c5 z2 h0 o0 I' a( J$ D' p9 x, W% \7 z  W' s! N/ ?
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 " f$ j7 v) A" N  h! R
    数值分析 发表于 2022-9-25 14:58
    . O1 R- M( u6 \( a' b1 Z6 K能不能把这个也贴上来,看看和上一个有什么不同?

    ! M4 O4 X- f3 ~) a" Q) K5 y理了理思路,重新做了一个测试。# n: s6 g+ r' W; h3 ~& h
    做了两个 vector 和 两个 float *, 都长 100000
    ( X  J% r$ e) E7 e9 S外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* f  [) w% F$ o$ w' W( u" ^8 |

    6 \9 l; S! D: X5 R, m; I4 V内循环试了4种方法,
    / ^  B+ ^  r) j/ u1 g0 y# T! o1. 直接调用 vector inner_product 247s
    & L: s& h1 R# z6 k) m( _2 `! w% @# f2. vector 循环点乘累加 237s
    ) r# `' X# K3 }0 I* q7 q3. float * 循环点乘累加 204s& v) n* P% R8 R9 Y1 `3 g
    4. 空循环 100000 次 202s
    2 t- O  g& F0 l3 G! ^9 Z
    ; @# S. r) p: i+ U$ t' m/ t不做内循环 200s
    . j7 A* D+ ~+ t8 J+ o$ i$ r' }- }
    1 p/ K' F9 g% P6 z0 o你昨天说的对,内循环本身占比是很小的,大头在其他处理。% V5 [# H" y/ J# }; ?* \
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    4 R% y, }! b) w; ?* L
    3 D! l1 l2 u2 b; a* ]至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ ?$ m! b' \. \: R$ s! u2 _

    0 r" B9 J( ?" h- v4 a(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ' ?& U  l0 l/ G$ Q+ m
    ' ]/ ]4 f* e" h/ h
            std::vector < float > vec1(N);
    & g1 K' ]" T7 H$ H( y- E! l, k        std::vector < float > vec2(N);* t9 r- ~. @) Z2 H
            float* b1 = new float[N];
    0 Q* }1 I) U8 `2 l        float* b2 = new float[N];% U  ?, \, h) K
    % z4 A& R5 T4 M  c' J
            for (int j = 0; j < 6000; j++)  s7 {! b6 i; J& ?
            {
    7 K# y; x" L& O1 {- O                std::generate(vec1.begin(), vec1.end(), []() {, b- Y9 `  G3 D0 x3 s( |) _
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    . t/ T# n) R8 k( Q9 E                        });
    , k+ m! W; U8 h3 G& X; g* M" p! B% |# d) h9 q& |' m! S/ o# X: t; u
                    std::generate(vec2.begin(), vec2.end(), []() {
    $ I7 @; s& p) J0 a# H% D                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    % z  p) @( x8 M! i/ W                        });- _; b% [' @, }# x4 X4 v

    + C+ `+ s/ d4 _4 g6 ]8 Z2 A                for (size_t jj = 0; jj < vec1.size(); jj++)- q* f/ x# x7 v0 P7 m  a% {
                    {
    2 ]& b5 f2 b! r- m  k  {7 \* S                        b1[jj] = vec1[jj];: {1 ~( n1 n! \. K
                    }) @: ~$ t0 l- {' E( y  B
    8 z) O- d, J, Y. e) b7 c
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ! ]6 o6 y3 T1 b% u+ _                {
    / }' z2 E0 j' l" }. s                        b2[jj] = vec2[jj];
    6 i7 O% o+ Y; N8 M                }2 k" O4 Z* Y7 Y

    # X/ ^7 B5 N9 e8 ?; {0 c                //Method - 1  N=100000 247s  + `$ c" {9 t8 s
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    % S% |3 s+ t3 C0 a( S+ v  {; h$ w                                
    / U* _; i* J  a; Q                //Method - 2  N=100000  237s
    1 u" @( q# B4 V( G. a                /*8 V' v. e! Y3 e- n$ M1 z
                    for (int jj = 0; jj < N ; jj++)+ N; ]" |0 Z* n+ O  t
                    {+ W1 A7 Q0 @& [9 ~0 a1 g3 k
                            fresult += vec1[jj] * vec2[jj];
    2 s3 `9 Z: f% W1 T! f                }
    1 n+ Q$ @- p% x" L                */
    " P- I; S& A2 q' ~, w' w                                
      `3 ~3 w0 Z1 O4 U3 P8 n                //Method - 3  N=100000 204s# e2 I/ x3 U' N1 f
                    /*
    9 [1 d* n. N- ~& a$ T                for (int jj = 0; jj < N; jj++)
    $ z7 u- z2 C, s# K9 F  X  T; Y                {9 J" N, A; R# U9 k" _: h
                            fresult += b1[jj] * b2[jj];
    * G6 J* L1 E# P( s4 m$ M" D$ D# g                }
    3 a; r" H0 s/ n5 \                */
    2 C; @- }2 A$ T; A7 }3 x8 {8 `* [
                    //Method - 4   202s
    4 M7 B8 i& |1 l* q# R& N                /*
    . [. n( z3 w+ @: t; ^4 v6 r8 U                for (int jj = 0; jj < N; jj++)
      r9 B$ _5 D# o/ Q. }7 M                {
    ) h' J, P( A! X2 z. H                        + ]/ \! M% E0 z) {" ^  p. h" _
                    }( B7 u. J( o7 C9 I8 x
                    */4 Y, X2 a0 o! L5 D' D* |
                    //comment out all methods, N=100000  202s                . h% [* |6 V$ z0 Z, Q; N" _$ T( e
            }
    ( {* ^5 b1 q- Q/ B6 a0 h
    6 A$ o9 m6 a) z& G% |3 {% e# z        delete []b1;. U" ^1 b# m+ K
            delete []b2;

      q) y( d) z. D5 l
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    5 G+ X2 P/ Q. @0 I) ?7 ]& t3 ^% L4 Y/ {( Q. ~, p
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    , M" v* N2 C0 ~, Z
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    % r* K0 K3 x) O9 e瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * K3 ~/ m5 _4 \* l, A. J/ J( u4 G% N& u1 c, X0 O
    你第二个试验里面的j在循环里面又重新定义 ...
    - {! w7 f2 X8 X, k4 k
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    + R' E& d5 C9 e7 L( l! r# y2 d8 R9 \; a
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16& J/ q. I5 w( C
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 X  v' O. G# r( p6 \7 Z2 n1 U. C0 k% }, R) ?
    不和它 ...
    & S/ ]) S# Q$ D! }5 M7 o/ v

    2 k3 q+ N* _& Q( N) O不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    7 V4 ?! d3 `7 _3 Y' ^后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54$ P0 m+ D# L: w% V* e  r' L6 R
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! _  |/ ?& x! d5 M' i{
    6 P/ r5 t, X6 ?        comp temp, xtimesy;
    0 i7 H5 C" l! N, O7 t" `/ Z
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    2 q" U; ]- L; ^/ f, S+ `' s内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?, n2 V: ^' I0 b: G9 I- w
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-26 15:50 , Processed in 0.085203 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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