设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! A& B6 @' @$ Q  y3 p3 a$ z# S
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。% p/ @) z% M' ~& p6 r5 a
    ( O% Z- Y- r! J9 I
    速度优化问题真的很有意思啊。
    ) M/ I; f, w9 Q8 M; L/ Q6 c$ Y/ n' t* e0 R: u: x- h
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    & g3 s1 z$ ?) ]  U+ J把代码贴上来看看?/ U: ]% n6 C+ v( d" R. O/ t3 u5 p

    2 y: d$ U+ h+ z, {4 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 编辑 , L% Z  f; B: |& ^
    数值分析 发表于 2022-9-24 23:04
    0 Q) K: s4 k1 i) F2 I5 u拉下来?拉多少?
    ; s9 ^* _4 O5 i' [' \% K把代码贴上来看看?

    ; |& C/ s' r& x1 D( i% \- l2 q$ z% S: c" L* F' D" O
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 p9 C1 K; _/ l% T% }
    {6 A5 E% q7 g) ~2 h8 q8 N
            comp temp, xtimesy;6 _5 p# z1 H2 ~: _3 `0 {
            xtimesy.re = 0;
    ; d0 j2 X; X' k/ [  y5 R5 a        xtimesy.im = 0;9 l. O  O0 J1 r9 @* p3 n/ o
            int j0 = lenB - 1;
    + B* a( C$ X1 f# F0 h: C        int    i, j, i1, reali;/ ~1 Q! p7 K$ F  e/ T
            if (lenA % 2 == 1)6 B2 h5 k3 d: ], j9 I
                    reali = lenA + 1;
    7 f' c/ c( |: G6 ^9 n- X( Q+ D        else* ?1 m' j; v7 x6 f# y
                    reali = lenA;/ m7 w# N9 v5 P) P2 o* R- s' T+ F
            reali /= 2;
    . a: P0 p+ ]' o& a4 V6 c( t
    ; p$ ]$ z, j6 a( R  f6 o& K        int nconv = reali + lenB;
    + h) @" i& P& z& D4 _        //#pragma omp parallel for8 c/ @7 u8 z4 M- [& ?$ b# e
            for (i = reali; i < nconv; i++); e" S& x- \& M9 V; ~. W" A
            {
    * ?; [+ f8 M* ^: B                temp.re = 0;
    , H, p* o/ ]! e; R                temp.im = 0;
    7 H8 p) X0 f& Y, z) R                i1 = i;
    3 g3 b( W  g- s  f                for (j = j0; j >= 0; j--)/ {6 W" r6 e- Q" c+ U' V2 |
                    {/ E, X1 v# ]- g8 m
                            /* floating date operation */
    0 m" [# R. T, @4 c                }

    + R. z( a: D% K' m" w9 Q        }( w# I0 N6 R# o: R) e& |5 h( P
    }
    2 V: r9 b$ ]6 c; H! U) L9 a# ~. `& C$ @9 _$ k4 }
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    4 ^7 ~2 |, \9 @, e5 `& w3 L  C. `* K& b' i  a2 Y
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。  x' W1 W! \; x) f6 I  o2 ~( ~
    现在call xcorr 100次,耗时78s.
    7 ]+ ~  ]/ A! y0 F  ~- P: m. d8 H1 J/ a+ A) n: b: D
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    . E5 j; G. J# }# x$ K0 W9 I6 L3 k1 D" h! ~" A! j! \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ' I7 V1 i/ k  L  B( s0 gMaybe Debug mode?

    + H5 n7 x  }4 _3 V
    9 x* ]& D" i. f: H不应该,看我上面的回复。
    , [3 F1 p* P4 T4 d) p1 T6 P' @$ F: x, W7 H! C
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ( E7 `, L& s& p. S' {$ I2 ^6 l
    雷达 发表于 2022-9-24 23:543 [% Z! T+ X5 @. J: J* e& `6 ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) r0 _" K" b, z. Y) H. B{9 R; R: b5 Q- v# T" }
            comp temp, xtimesy;

    $ X/ e' }: j9 N" u! u* j) P
    $ ~) G4 L( |0 s* R$ x这个不是这么比的吧。。。
    * x2 j* Y. C2 W# g  P1 p
    ; q  B7 y  j/ y* M您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。# M% I, E6 `) @) H$ h, q6 H; X7 F0 s

    * p: J3 ]8 z: E3 ~% h* w而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    / v) R: o, z  q; O
    数值分析 发表于 2022-9-25 00:20
    1 S1 N, V9 p# D4 s: i, S这个不是这么比的吧。。。
    ( T7 x& ?0 Y0 {: c
    8 b$ f7 s9 i  Z. r4 ]% }7 l8 F您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # J1 J7 Y. ?2 I8 \( _' `0 m

    ; ?  Q+ G# }3 u" t6 m2 a5 M有道理。
    0 u+ O/ }) P$ e- u' F5 p7 R; D所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ; k, z- F6 g$ |* l& _
    : [! H# H/ R8 b$ h: r4 p( T% [8 s$ B$ M我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    7 K/ V2 A3 C( }有道理。
    ( t. b2 \: I# z* g: J: A所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    ! Y3 W( q4 l8 K: Q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ [) B1 `" I; V" s) DWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20" \' W% V, _5 X6 S; R- O
    这个不是这么比的吧。。。1 Y9 N/ o- p7 M  B7 ^
    ( G  l- a  ~; {1 W1 G8 U
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    , Y+ ^, ], z6 M2 S
    + X1 R! T' B* E, Y
    现在的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 编辑
    / K+ p: z3 t. v- S  C$ r8 O; l. z
    沉宝 发表于 2022-9-25 01:484 \, S1 S2 p0 ~1 w# `0 x* {
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    # W/ l, h; m! f2 D4 g

    ' \/ V+ c3 g5 s1 d0 y是的,兄台说的对。
    : h/ K9 E( d0 E+ i% J
    / Z* Y8 a( j$ z& L( p& E; x6 |  G其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。. O/ W/ r/ F2 k- e. o
    % n' K' e2 U9 J5 _
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ! K8 z/ M, ]! u- u  I2 ?* _1 \! d; \- C8 t8 G
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。$ G5 R! t( w% {4 s9 [
    ; a# `6 x' \; x1 f8 Q: u7 n
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    + P8 e& f5 {4 A" x) A2 w/ t
    沉宝 发表于 2022-9-25 01:27
    1 }$ _! h) i1 y+ i7 }你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    1 ]9 Y* d  L8 Z' W1 H
    9 Y$ Z  J( [. r# l又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。3 P3 J5 x2 L, R

    ' ^: H! m1 V" }我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47( u: [0 B! c' y9 o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( H- i. _9 p" J
    时间差一倍的结果可以接受。
    ! I. C3 ^0 \. |9 a: i
      h9 R6 o5 M3 y7 E* Y* p你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ' p  b# ^* v3 @1 n
    雷达 发表于 2022-9-25 04:473 Q+ Q! B0 M& U) k1 F, X# `% d
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    3 T. W6 l# n7 E% Q

    5 I1 q% }: G: N2 S! D. L, Y6 M# j
    9 f0 ?- b& z/ E
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 F0 t  B+ x2 q) a7 e" _
    数值分析 发表于 2022-9-25 14:58
    8 E5 M$ B0 c& Y+ m; l1 \能不能把这个也贴上来,看看和上一个有什么不同?
    4 @3 }6 E7 R4 D! E
    理了理思路,重新做了一个测试。
    5 S" ^% b$ m$ l" d8 d; o7 x做了两个 vector 和 两个 float *, 都长 1000006 B* X/ p" X4 c1 b
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 L- g$ \' m0 z# q+ t. C
    / B7 G  Y. I& O7 X" t5 w7 b
    内循环试了4种方法,1 p/ i! @" P$ v+ F
    1. 直接调用 vector inner_product 247s * s) J7 @. d0 w: r+ Z% j
    2. vector 循环点乘累加 237s
    : U( d( q3 Z; D8 L0 U% q3. float * 循环点乘累加 204s/ a8 ^% ~7 X' y/ p! k7 n6 p) ^$ N+ c+ \' B3 H
    4. 空循环 100000 次 202s
    5 j' u- y0 {: [9 D  Y8 ]* S) M2 O- i$ r7 d" d( ]  [0 P
    不做内循环 200s, V2 E" N4 b9 u2 C7 ~4 R# P
    " D4 D" l6 B- o5 O* d
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。8 Y8 u% e  L% j- {' N1 \- Z9 p7 w2 E2 c
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    + |0 d  V8 {9 R4 j, }3 G! t  I+ U/ j8 y( [
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ Z) T! U+ p# n8 e; R  G
    7 W* H/ v' d  {- ?2 b/ Z- Z2 F
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    0 P& [# f' Q0 ~' t0 z& l5 U, R4 w- t6 R4 n* h! v  Y" D
            std::vector < float > vec1(N);/ V4 w4 Z% b6 x7 }3 h9 b
            std::vector < float > vec2(N);
      q) }8 D% R# w, U6 @* ?        float* b1 = new float[N];/ \+ o2 _# h6 c% D
            float* b2 = new float[N];; I  h3 i4 x) B& z/ Y3 ?8 A8 E

    ! j# G# D* H6 q        for (int j = 0; j < 6000; j++)
    ) u- i0 q; W: t' k( C' o: x9 \        {
    ; a+ P" Q1 ^+ _' }1 ]: `7 b! Q; \                std::generate(vec1.begin(), vec1.end(), []() {5 W7 V  y. H. j% J% R1 d
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 P$ U" n) i2 y
                            });
      U$ r' `( c& C4 `$ o3 V  l$ j5 L
    9 ]7 v5 H7 y$ N                std::generate(vec2.begin(), vec2.end(), []() {: L# [9 P! t! Z- p2 k5 P0 e4 y  ~
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    2 K9 I1 W2 E2 j7 z" {+ r5 X$ _                        });" G- _- g9 y/ s0 z1 l9 \2 C! e

    . |2 m! Q+ j. X/ _/ _7 v9 Y! B                for (size_t jj = 0; jj < vec1.size(); jj++)5 V* k6 x9 e  M' Q% `+ I) [
                    {
    4 t: y. I9 Y1 o& j4 k                        b1[jj] = vec1[jj];
    : p9 A6 W1 y4 i' n* @) \. r: T                }
    % `/ L$ B3 h$ o& l' N- @/ q& K$ H& I3 k/ b, @" [" I
                    for (size_t jj = 0; jj < vec2.size(); jj++)& o5 h) j" ?9 n/ A2 I
                    {. z" s! R- \- R( q; d6 W* v; y' U
                            b2[jj] = vec2[jj];
    ; V+ {* A* q0 x8 C! Z                }9 X. e% K0 r8 W8 _( C

    + C/ W% C. b  u: t! b' m- N                //Method - 1  N=100000 247s  
    ; k2 F' i; K, c& T                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    % U" F# y0 h; f$ W! i# ]4 N                                
    ' a; w2 W( Z8 M* V# Y                //Method - 2  N=100000  237s" s% w) ~, H/ [0 o% c: D  {) L
                    /*! K( T* ^9 l& B0 Z
                    for (int jj = 0; jj < N ; jj++)
    ; ~* l0 j2 `' ]0 e; `                {$ q& [1 t" }* T) u
                            fresult += vec1[jj] * vec2[jj];7 I& H* ~- A. Q
                    }
    0 f) g& z% ]- l                */
    + u1 ^8 t  O* o7 M7 P: Q                                ' E5 u+ i- k$ j2 v. _
                    //Method - 3  N=100000 204s3 A' u0 E; d' E& I" x
                    /*# u$ o% I/ ?9 ~, O0 b6 S; a2 }
                    for (int jj = 0; jj < N; jj++)
    8 i/ N! M7 Z2 O6 R& k* K0 b& ?9 b                {8 x8 e: B+ m' e: }6 Y  k. I( O
                            fresult += b1[jj] * b2[jj];
    / _  }9 F% l' P7 I                }
    7 ?# w1 a: m0 D; Y5 \5 f                */- W% |# R4 z/ b3 b2 _% t+ O7 @# A
    . {0 g, W! o8 a
                    //Method - 4   202s
    4 E. X) b3 x, ^0 R6 H: v* \                /*
    2 z6 Y/ |8 D$ T9 I                for (int jj = 0; jj < N; jj++)
    / |3 W3 u0 y' Z, z3 w4 S( O6 ]# _8 _                {
    , X% h4 [6 N% F4 u% P, N                        
    ; J2 V# N1 n* Z& z6 z                }( ^+ h2 y0 Z; j. F" A
                    */1 F8 c, f+ P$ k' l7 r9 J
                    //comment out all methods, N=100000  202s               
    ' A9 T2 _9 G: G9 l* c        }
    ' Z# F2 F* U  l, u7 c7 s  p  p/ a  N6 N
            delete []b1;* q' v4 [# Q% @& `# Q
            delete []b2;
    ' u! t, g/ P# M) w. P8 M
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. t4 u7 y2 P9 W
    5 z/ U& F2 {* {& n
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    # s. h8 \- a6 Z+ F0 k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15& n$ S4 N' c: k5 T& `$ Y
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 ^: o0 \% [0 y% K# O/ j6 W

    0 U* }* @! N% \5 R你第二个试验里面的j在循环里面又重新定义 ...

    ) n7 A. @$ T! |* o# ]3 z9 a; M内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL, Z5 l* f, o, v4 Y. E

    # g' n$ U# X  x7 g6 s不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # f( c. F( S0 r9 `内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    % ~5 Y  v$ |# E# O( h  b, U0 U* l5 S" ?4 a( y: x
    不和它 ...

    $ X+ E5 r: V$ B  \  o
    $ m6 q. i0 ]8 ^/ Z, \9 ^不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。* _' l' Y" g. z& T7 _# \4 P% L
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    8 O  ?: E, [$ K" Gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 n2 v0 T: u) L
    {
    + M/ N% ]1 k% H# U) t0 o  a( r" g        comp temp, xtimesy;

    . |0 n8 x7 I7 @0 p7 T) d& y这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    " _7 i* S2 D$ e) U7 Q2 G, l内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?- k' [7 v" t0 i. S
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-27 05:04 , Processed in 0.072662 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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