设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?- ^1 E- `) }- U* G; `
    ( N8 W/ ~4 b. w9 u. R7 Z2 T
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。" E6 ~* V4 X8 x! M( d. H

    + g7 ?$ f/ e  J' v, y+ Z: k速度优化问题真的很有意思啊。
    & `* j- [/ ^0 K
    , e8 K( D' x1 Z% z2 k: N  }+ l0 l欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?' D( M1 v- L* Z4 g. E$ P; o
    把代码贴上来看看?7 G- U- g, b: Z/ ?2 p0 T" [. r

    # q9 `3 M( f6 k8 O: l" a% v  ]难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 |) t! F4 l  C3 C% W
    数值分析 发表于 2022-9-24 23:043 \$ t" O  P& [! ~) S+ `, O" i
    拉下来?拉多少?
    3 G. N* Q+ R; p- D. h把代码贴上来看看?
    + q" K5 k2 z1 A9 H& D

    % x$ P6 |& M; N) j- [void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      |" h0 T) K  c5 e' g{
    & k2 m/ p7 q, k  O3 L3 h+ C        comp temp, xtimesy;
    ) Y9 @2 j) ?$ W5 }( j/ e, k$ \6 p        xtimesy.re = 0;
    , H  S* p) }' B. j9 o  |' y        xtimesy.im = 0;( O/ j6 R# I! @! G. T
            int j0 = lenB - 1;
    / f9 u3 N& W' m- ?' _        int    i, j, i1, reali;7 x. X7 g  N7 S4 S* Q
            if (lenA % 2 == 1)/ |8 s6 u$ s. y. e, }6 h7 \
                    reali = lenA + 1;
    ) M& X6 Y! d! B2 c        else
    ! b6 U' M+ X( m/ ]. J) x  c                reali = lenA;
    3 |* E" I; j1 B5 M0 a        reali /= 2;- C3 f0 m4 V% n7 s) c9 |& r
    9 b" S! t& Q( |# i8 X# a
            int nconv = reali + lenB;8 K. r$ ^( `+ l- X+ g
            //#pragma omp parallel for! U2 l9 I2 G% M3 D. _  f
            for (i = reali; i < nconv; i++)# }" h* X+ a" Q$ \' q
            {# g% p+ v# ^& P; l1 e
                    temp.re = 0;
    ( b0 J5 @. X7 T4 O' m/ H+ _; s2 N" e                temp.im = 0;& t" B  X3 K6 F2 [* G7 }
                    i1 = i;5 F5 c! `7 T& f
                    for (j = j0; j >= 0; j--)6 m. X4 l0 O4 Y: ]  r
                    {
    ( M! \. p0 w! t                        /* floating date operation */
    : q- d( ^. m4 ?5 [                }

    2 E3 L# }# r) Z; A        }0 `$ |% f: K$ H6 [! l- K" ~% Z
    }
    5 i. G) x  ?& Y$ Q
    0 m7 d1 H7 {5 D# [xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    8 I5 w1 [0 t# S% x! `. m1 n/ n/ v, A9 M
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。, M/ \: d* m; w
    现在call xcorr 100次,耗时78s.
    - `9 ~, L) r0 t/ s: d) f, V1 i4 [
    8 G# @& C0 j5 N, C如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. " Q2 @$ T7 a2 b. z2 q* E3 {3 c5 [. m
    - d+ ~/ D9 _: f$ \6 ]) E' X" c
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ; d. r" C3 v. X9 A7 ~0 _Maybe Debug mode?

    / @8 z! z, I; L  P" G4 C9 V$ b
    ' d7 h/ ^( M5 @6 X7 l8 R' ?9 p$ C不应该,看我上面的回复。8 I8 }0 ~) m' j+ ^' v- C
    " x3 p2 P5 T, \. G( I% W4 v: a0 r
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ( y, Q$ L! b4 v# y4 D
    雷达 发表于 2022-9-24 23:54$ }" V- i2 m$ a  D; L
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 H% i4 v& o' M5 c
    {( v: r8 `' r3 O  Q( \, V
            comp temp, xtimesy;
    , z: {6 R1 M0 j  J6 d% Q
    % B$ V! r# \, h/ q
    这个不是这么比的吧。。。0 Q. j# M+ J" \3 {+ E/ i$ {5 j+ {

    7 ^9 \0 U% e+ D2 L您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : s0 }: e& ?, I* l. z5 I! H  r4 O
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    8 d  j6 v, [+ `0 e% e
    数值分析 发表于 2022-9-25 00:20
    $ o: c( |0 [% \6 O% n& z这个不是这么比的吧。。。
    $ N2 C/ ?5 m; O# _: E7 ^) ]. N7 A9 Z
    5 v/ p2 H" g# c/ x- [9 Y/ w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    8 I0 z/ Z& S5 q- i' l8 H3 t7 ?* z9 ]& Q7 p
    有道理。
    3 A9 Z% T3 X, f+ A, j所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。4 _5 J) R1 N  K$ J
    7 z) ~7 e! Y5 `- f# ]' l. m
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46) d. j: J" j  ]
    有道理。% F. g3 h1 t* b3 U7 O
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    . w2 e& P- U' Q8 G3 U6 t' x你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    , J3 l0 M4 W8 r* o! t. KWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20! w0 i' _8 I2 h4 X
    这个不是这么比的吧。。。
    $ V) Y4 t2 Z0 ?
    8 V! ~$ l/ d+ D您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    0 [: R- S- |% q( O/ N/ V* t" k
    ! V' c) q4 z5 F: e, \现在的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 编辑
    ; [* c6 U+ G! t4 J" q/ k
    沉宝 发表于 2022-9-25 01:48
    & U; F: p; U; @' r  L现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    $ ?( x. G6 P8 _* B2 g* J& p. U5 f! |. \' i
    是的,兄台说的对。* Q3 k* B7 ~; s& e

    " N) N. n  {( u( Z9 t8 r+ l5 Y0 I其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    8 b0 z$ M. K/ N+ `$ W8 [7 }' n) I
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。) g0 V  V) {. j. |* ?$ F
    8 ~$ D5 c4 t( K
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    * r% Z: R7 {) V. l$ T0 h' L5 y5 W* V3 e, z6 z
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ! z% j6 X* p/ d  e
    沉宝 发表于 2022-9-25 01:27! l3 w( d- l0 F/ \% n% ?! c
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    - P  z. ~  q% n
    1 r1 I2 N% I# \7 O
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。3 e8 H* X, R6 \. r+ n

    ' y, M: Z4 Z2 I我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    & d$ y0 T: @, P, H2 A) B$ e又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    6 |0 E& u) v# L1 H2 x时间差一倍的结果可以接受。
    ( Y% v2 a; m7 n% u# M3 E" v3 g1 Z! S2 |% l2 f5 y" M6 h
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑   X2 M3 c/ e$ u
    雷达 发表于 2022-9-25 04:47
    $ Q; T1 T" H' X. @2 M又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    , B- t3 O$ W' ]
    ; T! J. v1 v0 ?5 ~
    2 J3 W7 i# A' Y3 O- r6 `5 P
    - [$ p+ F$ Q% R能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; r- c0 d7 p2 t, z: c: X) N
    数值分析 发表于 2022-9-25 14:58
    $ Q- L; D* \" z2 @3 L! _5 i- f' R5 X能不能把这个也贴上来,看看和上一个有什么不同?
    0 ?2 m) m' A9 S# B# S
    理了理思路,重新做了一个测试。+ W8 \; @4 _. Z0 q
    做了两个 vector 和 两个 float *, 都长 100000
    9 u2 Q9 O, S+ @3 \& p外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 F& M; n5 r1 E5 j$ R) |9 M; V  I
    # O/ F& O, C7 S6 Q& u/ {+ g: i2 `+ _
    内循环试了4种方法,5 r; }# x; V( z: s) v1 }4 K
    1. 直接调用 vector inner_product 247s 5 G: b% N- e7 {3 ?( k
    2. vector 循环点乘累加 237s4 E6 }1 b; `$ @$ P/ B( L) a) Z: |# c
    3. float * 循环点乘累加 204s& Y" ^. g# p% l. j- J6 ~% x7 n- ^
    4. 空循环 100000 次 202s
    . Z0 f. e8 o# E
    $ Z5 }3 [5 F: E9 G1 }  {不做内循环 200s8 m. C( n2 e5 m; E1 K& X

    & c4 B6 b( n2 V' ~( s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    3 y9 S6 Y  L8 T# D% }7 \另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。+ O+ A% a. r0 ^- F+ f

    + q4 T$ S# b* x/ Y8 Q7 g: @至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- _. E7 m0 T+ P
    . @7 X: L  q" g; ^' F
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)/ ^  I$ X3 ~- V* p+ [" j
    $ `1 R# j- }! @5 H
            std::vector < float > vec1(N);, v8 o2 t* n7 I. f& w9 I
            std::vector < float > vec2(N);
    " x1 V! v5 |, }/ U( M0 W9 y        float* b1 = new float[N];' ^. {, x1 k* K( R4 d) k
            float* b2 = new float[N];9 |9 W/ L, Y2 k9 e8 V  v

    / G9 {4 [) n3 R5 K) M+ z1 z$ V( L        for (int j = 0; j < 6000; j++)  a, k+ E6 \* i! t% e* \  h  k
            {3 U& }# F& Z5 w. H, O- i, q! D
                    std::generate(vec1.begin(), vec1.end(), []() {& j. I2 i0 e$ j- S0 K% E. \
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
      }: L' g$ M; S' S3 J' R                        });) l. ?1 b& G" ?. r7 n' o

    8 O) H7 s5 u, E( k6 g                std::generate(vec2.begin(), vec2.end(), []() {1 r! @; p/ |; @4 B0 O6 I! L
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    4 f, i; X& E1 L0 R  n+ c                        });# }; i" k; Z: N; m

    * C: u2 c  B) |1 u: `                for (size_t jj = 0; jj < vec1.size(); jj++)) Y; i% |+ Q( C' h7 T& O' T
                    {6 ~) P  r( `5 d8 R
                            b1[jj] = vec1[jj];
    6 C2 d7 Y) S7 P- [                }% ^* H  r' ^  [7 h
    0 D. Y3 ?0 r8 h8 E2 q* _; f
                    for (size_t jj = 0; jj < vec2.size(); jj++)3 n. N1 O- X7 [
                    {" Z% p/ }3 a( p
                            b2[jj] = vec2[jj];7 Q# J+ a. ?" J5 k3 b! s
                    }1 @& P- ?/ l' D1 ?& e% V: W

    # F0 i: z+ [$ z+ ?4 m& X7 Z                //Method - 1  N=100000 247s    k/ \: _0 y" X
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    + r+ g/ P/ B; z3 j, v# L8 R                                
    ! y. y8 F' |4 ]3 v                //Method - 2  N=100000  237s& f( Y: Q1 Q  Q9 m5 m6 x; g! K+ a
                    /*
    ; P' n# v0 e6 E* i- Y( [: r                for (int jj = 0; jj < N ; jj++). t% [) g. Q4 \- j, ]& \
                    {
    6 Y; \4 P& c2 a! Y( e9 E                        fresult += vec1[jj] * vec2[jj];9 k- H3 F1 j; W. |1 @, M/ x
                    }  {- c) D1 q  o6 t
                    */4 M$ a+ h/ x3 m" Z& K1 p
                                    # R6 i8 B$ F' Z( e, ?( Q
                    //Method - 3  N=100000 204s
    ( {: b6 _( q8 o3 S, \7 j                /*% V/ D/ E2 ~0 N0 O+ b) N
                    for (int jj = 0; jj < N; jj++)
    # ^! L3 k) \$ ]8 g5 D7 L; W                {, }5 H! }, H2 Y& q6 @9 A
                            fresult += b1[jj] * b2[jj];/ @, p6 F, y+ }+ E
                    }
    - D! P, d; M( g, d                */7 U, B2 Z4 A2 Y$ p4 ^  [# o
    / G( K9 m% d6 B' D! F' B' E: ]; N
                    //Method - 4   202s
    ! o# a8 X3 P# c* [2 i, u6 i                /*6 R8 z: W3 N7 m' j$ ^
                    for (int jj = 0; jj < N; jj++)# c) \! F. j! g. w) c: P% j# C
                    {4 _3 t% P; t, x7 U4 v& M# P" h$ K
                            
    * [% t* t# O9 C, J( u                }' W1 O, ^4 d3 F
                    */' c  F( ~( W( u% [& B, {
                    //comment out all methods, N=100000  202s               
      p( V& e+ T9 _3 m( T/ Z        }; n% d- W6 F. H5 D9 T

    2 A' h: E) r+ o9 R# T  ]        delete []b1;8 Q0 X$ k! B8 P* x1 b- Z, Z
            delete []b2;

    8 ~" E% X3 W1 C6 k$ Y2 e
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?: y8 Y+ W! ~" ]0 }+ v- R4 ]# h
    2 w/ J1 `1 w( |: J
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?, ], U+ e! D+ r6 o
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    - e5 g9 P0 o3 _5 m瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * Z' I) c0 G$ _- G; }' L+ k/ t  H& }7 U. `) V7 o9 X
    你第二个试验里面的j在循环里面又重新定义 ...
    ; }+ s; i# d; s+ M( I+ z0 X
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / k) C9 N! |; ~7 @; D3 K& {
    8 r. J# y, @* Y1 z+ A. V! K9 D% j4 g不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:160 ?6 I; e% f$ K" V# K0 H% [
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ! L0 p0 |1 ^$ N* a$ h% m' ]" J, F7 I, [( j. z( @0 @
    不和它 ...

    4 N. X9 r+ i3 G8 n5 W" u9 D2 H. G7 w' U, j/ x  q" g" M
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。2 Z. u  Z, A' ?5 u
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54  Z9 @+ V5 m9 T' x' p$ b5 r: v
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 M/ ?6 s' ]' V5 E1 t, i% W" }$ r5 W{7 k* T7 p2 K$ _: i! d+ {2 b7 `6 m- z
            comp temp, xtimesy;

    2 [! L' x! e/ ?6 F- R( o这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ) H8 w3 W" s# G, Q- k内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?( O+ _% Z& U4 M2 f. h6 I
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-15 15:07 , Processed in 0.069339 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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