设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - l6 N) [( w' ?* R) r9 b- l4 j5 C4 t7 r( ?0 O2 ]# C
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。* `0 Z6 J7 [9 h$ q; Y6 I

    # O1 D  t. g( b2 A速度优化问题真的很有意思啊。
    & f; f7 }; T! g, f
    : U( i4 U) q4 S! q" s- B欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    : }6 l9 S) }: I把代码贴上来看看?/ s" P$ |, X- M& B% E

    " h" V6 I& z2 @9 }6 L难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 ]7 B$ ], J- b1 L6 P
    数值分析 发表于 2022-9-24 23:043 e& r7 [% F2 Q  D$ z. Y
    拉下来?拉多少?; i' A# [8 M, A% t- g
    把代码贴上来看看?
    * Z  w' p6 y4 R$ U0 Q8 }; w) R

    & _# |3 b8 p5 Y, _& Q  o. [% _: Mvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      g! K8 [! s, X: s{
    ! b5 v- _& O9 L+ w$ h7 T: W* `) \: }) j        comp temp, xtimesy;; _4 V; F, k  N- q$ M
            xtimesy.re = 0;' I# R7 r% S( [3 z7 G; J
            xtimesy.im = 0;
    9 t6 {) ~4 W+ W) G+ ]' E4 l  U        int j0 = lenB - 1;
    0 y8 k* W* ?( S' T        int    i, j, i1, reali;# r0 ]6 Y3 D" }! O% Z
            if (lenA % 2 == 1)
    - h$ `# n& v( h* k+ @                reali = lenA + 1;
    7 I( }) s+ d5 S, h+ c        else" o& x3 l' c8 x7 X. T
                    reali = lenA;
      D. Z( \2 \* \3 G1 ?$ X        reali /= 2;
    ) n' H8 q. Q( e0 a* H- l, r. Z) ~  B
            int nconv = reali + lenB;
    0 Q4 s  n) ^. B5 O; h; X* `* V        //#pragma omp parallel for
    ) j$ H( D" N$ k        for (i = reali; i < nconv; i++)
    9 A6 ]- `5 p8 o9 L' _        {
    & _5 M8 g0 r0 G. K/ X+ K& v# Z                temp.re = 0;/ [) W9 w7 `$ [$ u0 D, i0 t
                    temp.im = 0;
    , Q/ x  P6 T' L5 f& v9 I0 x" H                i1 = i;
    6 {$ w8 \- T5 ~                for (j = j0; j >= 0; j--)
    4 o' w3 K* A; \* ]2 c  Q                {
    # s0 x  D3 t/ U* a% p$ n& d                        /* floating date operation */
    - N7 ]! L8 e# R5 w/ Z                }
    0 g6 D, R8 e- r9 N  z9 @
            }
    * X1 m3 n$ v: G' l$ d1 f}
    1 y& `) M$ q8 H8 ?# m9 y, O; |, U9 Q" W0 F" `4 T6 d8 w
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 l7 F# N; ~9 q5 R. A
    * d& F. l  i  C3 U( ?1 J红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 `5 Q8 n' \+ J7 q" F; f) n现在call xcorr 100次,耗时78s.
    5 P5 H6 v2 ^5 w. s: g1 T% ~0 f7 i- Q
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. # y9 M- D2 X1 g  m8 _# B7 G
    ' `' y1 f# L! l- }6 O: i5 l7 Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ) u4 s- r  V, n/ Q8 D1 NMaybe Debug mode?
    - U4 x) R$ y) @9 @1 A. _/ }( K
    * {2 Y1 t+ P* a$ @" D
    不应该,看我上面的回复。
    . x/ a. x) m+ h; ?# A' z- E1 o2 S7 Q8 q* x
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    * n9 y( G' E% f6 e% D
    雷达 发表于 2022-9-24 23:54
    % V; C3 ^# g0 j) s& e6 Ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! z+ n6 v5 e+ z  M{, q5 f: c3 T0 ~
            comp temp, xtimesy;

    0 r& H" Z( S/ Z# A* s7 }1 }8 j0 p  V
    这个不是这么比的吧。。。. Z8 ]! s3 u9 P2 M& [+ A

    * b( o3 Q( Y9 }您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    % `. X4 B" m; _0 I+ w# t0 R; X2 d# [0 _3 T+ z) }5 V9 j
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    - H5 \4 D$ N  |9 B/ ?9 r6 v
    数值分析 发表于 2022-9-25 00:20, a* E* R! S, ~0 F2 T
    这个不是这么比的吧。。。" T, W  a, O. {/ D  y
    / Z, g: |* A' H, S# ^1 M, w
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    / w" F" n0 c; }
    7 a" V9 w6 @5 w- ?) U& J有道理。. [0 }( j; M! i1 U$ |' ^/ h
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ; f5 ?( f8 V, {# @$ Q
    7 V% }$ ~% S* d! T! n+ ?- V1 A我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:462 L, g4 R- w" q4 }, z% }' _
    有道理。
    & p/ m% O4 `4 O% y, D, l$ |5 I% ?. Y所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    + Q3 P" e1 k! h! s+ b( o6 ^$ X你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    , ~. e4 P0 L* ?6 N3 y; V4 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
    # u2 Y/ H2 [: E+ l# ?这个不是这么比的吧。。。
    1 j8 k+ r4 i+ p9 Y/ j1 \7 S
    8 P: m  P9 D6 T& r* L0 y3 _您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    6 z0 O$ {! ^( B! O* N- F
    ; k4 e1 J4 ~* n# y3 v8 O- ~; m现在的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 编辑
    ' z0 F. W' O4 t" [( z7 }0 I3 y
    沉宝 发表于 2022-9-25 01:48
    ( X, ^$ U* Q; g. l5 e现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    # w9 R) x5 t7 e  O7 O$ f
    6 }9 U& V8 U0 ?7 G6 k3 ]9 Q
    是的,兄台说的对。6 y. n- k3 {+ k

    # R' Q# r% O1 P* ]* F其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。9 n7 E2 Y( @; C* m7 }) h; Q( Y0 b

    4 ]3 r& T9 e2 Z2 ~; y' F雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    3 }3 `5 H# j' c1 x$ l; ]
    , N7 w& N/ g: s* r, Q. s比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    2 P; T. o, L5 e
    4 t" e- A" x0 k  q当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ' G+ G: `2 s: j& Y$ N6 p; ?$ Y, j; r
    沉宝 发表于 2022-9-25 01:27
    ! M! n# U3 t  G* ~/ D你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    9 N4 W$ Z" R9 g; k! ~

    . H' {( I5 h: P  _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    4 i( X* w; e1 @
    ( D1 l- l5 l/ ~9 N  ^0 I! U" }我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47! Z% {, a- D+ q, J2 x
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    . y/ E; M+ Z$ n6 d. e8 a5 R时间差一倍的结果可以接受。
    " W0 I' N' J0 s1 b5 `/ S1 ~* ]9 }) B% \( t/ u( r& L3 y
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 5 z+ x# K5 Y+ _* E
    雷达 发表于 2022-9-25 04:47
    8 z+ }/ y/ R9 W又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 I/ W6 L" a% L! j& P
    : O- B* {8 Z% L: u( ~7 ~5 Z# l- u! c5 O/ e) x# W4 U
    * ^6 V) F: W% P$ z3 i
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ' ~2 A  F! e' L9 n
    数值分析 发表于 2022-9-25 14:58
    2 R4 ?8 f" n$ q能不能把这个也贴上来,看看和上一个有什么不同?
    - X5 ?8 e9 M" }2 [0 }
    理了理思路,重新做了一个测试。
    6 h% M) z8 a, U5 h3 I: b2 E做了两个 vector 和 两个 float *, 都长 100000% K1 v9 g2 E  y9 e
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 g2 s8 b$ G8 W( N" G5 M8 r- Z

    + f" |1 Q8 j/ F内循环试了4种方法,! H! h% X- O$ w
    1. 直接调用 vector inner_product 247s ( Y: @$ g! G' X8 E
    2. vector 循环点乘累加 237s6 B% D: a' H: ?. v' G7 Y
    3. float * 循环点乘累加 204s' Y7 X3 D0 d* T* M& G/ N# l
    4. 空循环 100000 次 202s  C% f' `( H! {. q8 u& j

    " p+ C9 p( {3 U) }不做内循环 200s
    2 f7 _1 P' p2 O
    % @; P. ?& j* l你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 f! t$ z& z/ ^) E/ C  ]
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; i5 ]- H2 K" {5 M! j- _

    $ H5 O1 m- g' i7 Z6 T+ `至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), S) ]/ H% d+ y6 s/ Z  q( s

    0 i$ a4 e4 w  s( P4 h- c2 _, `. `(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 j# w* q) x  y" q* S1 ]& r/ W
    , M. s' ~# _/ K5 G- f: D, f1 C4 V/ S
            std::vector < float > vec1(N);
    & G, N. i0 }' C2 ^1 f  ]        std::vector < float > vec2(N);9 s; c& T& k: U/ T/ B( N. [: E! Q+ c
            float* b1 = new float[N];- D8 e+ \6 @( f5 e) D, c8 o: a
            float* b2 = new float[N];0 N0 x$ y- U. S
    9 z: H  ]  \- z
            for (int j = 0; j < 6000; j++)
    / H; J3 I- T: Y        {
    , p. x( M* Z* I0 E                std::generate(vec1.begin(), vec1.end(), []() {
    - u+ H+ `+ _' X                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 h! ]) u! G" x1 Y2 N
                            });/ b$ x2 L- r2 o% L
    " K" X" `( J6 f5 y) b+ _
                    std::generate(vec2.begin(), vec2.end(), []() {
    ) ~; \2 p* H* U/ Q                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# Q( ?4 O) }/ H2 Z
                            });
    : l2 K4 t' F8 ^9 j3 S
    1 u4 Z1 Q+ u" H% Z                for (size_t jj = 0; jj < vec1.size(); jj++)6 F0 o' X/ v3 l# B
                    {
    5 }, n. J% `7 J0 W4 K( O                        b1[jj] = vec1[jj];
    $ j* C; ]" s8 x                }
    8 W; v: ^  S8 H/ z1 {- D! D7 E0 t- l/ V" D  P. f
                    for (size_t jj = 0; jj < vec2.size(); jj++)4 ^( \7 z( d, b- j
                    {2 J+ |# b( z! g2 z# U4 h
                            b2[jj] = vec2[jj];  V+ \* H6 B( Z& }. }( J/ L  X
                    }; F$ x- S) ~& s8 d6 u: o: Y1 Q$ b4 ^4 l

    0 ~, @1 w; L# L3 C' N5 ^4 G                //Method - 1  N=100000 247s  
    & D/ Q9 H6 v! e+ Q& G% S                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. _! l: k, E4 x. t. {$ @7 W
                                    8 l. f& ]2 K, J6 D6 Y
                    //Method - 2  N=100000  237s
    4 z$ u9 \! V# H. w/ O. @4 z" z! H                /*/ U' ^9 X# o1 J+ [: Y' v% d
                    for (int jj = 0; jj < N ; jj++)
    5 r1 d- J$ c/ q: t& s/ @1 r                {" ^* b. L# n9 g
                            fresult += vec1[jj] * vec2[jj];
      O* |9 ]6 \  P) m5 {                }+ {! N+ j& w9 y+ a$ G' c
                    */
    * z* a2 y% W0 h) n                                
    % _8 C6 w1 S: w4 y, n# H: o/ G5 O                //Method - 3  N=100000 204s8 f6 C9 c& ]7 h2 ]
                    /*
    2 F2 [% L& V2 J) @. m                for (int jj = 0; jj < N; jj++)
    ! W9 j6 U: M1 M, \9 o: _9 Q3 G/ p! {                {
    2 w* a3 j; s. m' f+ A                        fresult += b1[jj] * b2[jj];
    : K0 I. d5 Z) A2 G                }4 Y- m( }- F; p$ _/ d; w
                    */
    ) ~1 }1 }: Y) O  q$ M2 R& K
      [2 f/ o! ?. k0 K9 O                //Method - 4   202s
    7 h- c$ Y& x# H& }5 T                /*% M! K0 y; f* }5 T
                    for (int jj = 0; jj < N; jj++)
    / B7 F8 O5 T: s1 O3 D8 I( b                {
    1 x2 P1 J* F. d/ m1 n# m) F. u                        
    ! d3 p8 O0 p; [. H7 b                }/ w6 W# |, r* e& ~9 F5 t8 k) F* _
                    */
    ( f: w" l! @2 i. M& T  b* A* i                //comment out all methods, N=100000  202s                ) h9 W4 w' X% Y* @
            }
    0 I9 J- C5 k1 G2 c: H9 K* Q( T: w. A' Y- N* f( D4 J& |
            delete []b1;; E/ k2 d2 e( D* r% `
            delete []b2;
    6 Y# A+ D1 K0 a+ z' U
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    : T( m$ \% Z( ^! d; `5 B
    & t5 N! r4 u: O, J2 d3 J你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    7 ^- h- P+ G( f; V
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15; D* D+ x7 h3 |. Q0 A, D7 g2 r" y
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 X4 o( i& Y4 t( x1 |
      m- C8 @3 W0 ^& q% l" T! }你第二个试验里面的j在循环里面又重新定义 ...

    + ]8 S/ _; Y" g- r3 h内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    " g5 l5 B2 C. G5 Y, |4 N
    & F9 t0 y; ~; Y- {( N. ~不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    . g2 d0 W5 y. g  R$ F5 a$ ^: @内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL! O8 H% u! ?9 b9 V
    " {' R$ @/ K4 G4 o6 u6 u# v
    不和它 ...

    " K3 e5 x  E* m
    + g6 {" m+ G/ A# n0 R$ y! m不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    / l* n, i5 E6 N8 _  ~& V5 q后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54* r3 V+ C5 D$ b3 c: l+ [* C
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ t, ^  g: b4 `/ ^9 i3 K& |2 q
    {, b, X6 A$ G! P( q0 t
            comp temp, xtimesy;

    2 u* `* n4 B: q3 n这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。8 x9 e; m% D& C, z7 ^
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?0 o6 O2 P" w- e
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-6 18:42 , Processed in 0.066058 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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