设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?4 s4 j  Q0 q8 B; g

    7 w9 h* u! f: P0 m" H自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。7 t, G( @3 H5 d
    2 h$ L3 J; p7 |# S
    速度优化问题真的很有意思啊。
    ( `- K/ E2 A3 E" A3 U" Z1 M0 R5 }# D( Q# H; E/ a% K/ z
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?# r1 t& ]- q" H& O$ ?: M, \
    把代码贴上来看看?# Y( R6 D  a4 Z; K
    % k1 Y& Q) v$ B8 R$ ~
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 , C7 X# p" e, H: p
    数值分析 发表于 2022-9-24 23:04
    ; e+ p/ k6 _' T+ K& r% O拉下来?拉多少?
    " m3 J' `3 `. z9 i* v把代码贴上来看看?
    . h2 t. M+ o  E3 T2 t
    2 o* g/ v+ j) U+ s
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : B' T) ~9 V" |1 S5 P5 r{' t0 L9 I- Q+ ^6 x
            comp temp, xtimesy;
    , m5 F/ [' G4 Q. }: ^        xtimesy.re = 0;
    5 V" R. ], z) t! K& W) L5 j        xtimesy.im = 0;6 c* V9 w1 {* l' `8 l: E3 _7 J% b9 g
            int j0 = lenB - 1;7 J/ f( Q' I. l7 \* `
            int    i, j, i1, reali;
    ' J, b/ S, Y3 \' a. @, t  ]( K        if (lenA % 2 == 1)
    3 a2 x* q9 [' k; `9 m# A' s                reali = lenA + 1;
    * s/ E" Y# s5 p        else* X% p8 F! Z; p8 ?( b) p, X
                    reali = lenA;
    ! t! k$ N- I7 [$ P        reali /= 2;5 ^3 Q2 e8 U- z6 k4 C  w8 V- h

    ; V- d0 {& K  \' E1 X        int nconv = reali + lenB;
    # J' ]! _4 }9 ~, B* M        //#pragma omp parallel for
    : }/ I7 b2 i& k1 I: T# S        for (i = reali; i < nconv; i++)( {1 R) C" a8 |7 C3 F
            {
    4 b) N% \* E1 ]( ~                temp.re = 0;  \1 }, n2 A+ H- n* V+ d- |$ `
                    temp.im = 0;- d8 V( Y, ]3 Y  {8 f( b
                    i1 = i;( O- Q1 r4 t" i1 L' k
                    for (j = j0; j >= 0; j--)
    + B0 l/ g" R- F& \7 M                {
      y1 a/ O( f* b6 ?! A' o8 Z) v                        /* floating date operation */! z7 u1 V* j: a7 h5 K9 z, ^, h
                    }

    - ~' }+ d3 l* k6 B$ E        }" p# Y* ?* m1 F8 l9 v  }0 B; U
    }
      O' X& t7 b- t7 @5 \% [
    5 p$ N1 U7 Y1 i5 v; w7 X: h0 Sxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样& d3 E% s- c, I& H7 m" ]

    : B5 M; l! d3 L; Q红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    3 l0 N: e: n7 }3 \! M! u- ]现在call xcorr 100次,耗时78s.
    9 S! ^5 O( |: a, s7 a7 }) z% H! m2 O4 i. w& @4 H
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 9 S% }, H  ~4 U+ C2 ?. f

    5 W4 \" U3 X7 Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ' l$ T' F# _+ @6 v; Q8 GMaybe Debug mode?
    + k7 H# X4 C0 G8 m: c3 W7 C& ~, y
    , S$ p* ]) f  d0 Y) ?
    不应该,看我上面的回复。
    # c! A* c( t5 g2 K8 V/ t  u3 C7 @" `
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    - M) l( `. v. |: s
    雷达 发表于 2022-9-24 23:542 L) [. b! w# r2 Z2 c
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 v  s/ a) y/ d. L1 O2 ~7 M
    {5 m, u% G* @; [: \6 Q0 I2 A. v
            comp temp, xtimesy;
    8 m/ w4 v4 F1 C. ?5 B7 P+ F

    - F3 j  g5 A* F: g( H7 T& A这个不是这么比的吧。。。
    . @: M; @: _( S! i' q3 y; u9 R( q
    & e$ u2 ?# R6 S; @( @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! A/ x3 f' i0 X  K" Z* d% Q3 {& H" V( q7 P$ \
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 6 ~# i6 A0 w4 |
    数值分析 发表于 2022-9-25 00:20$ r( i7 e9 J3 V" J9 F% }1 G) a
    这个不是这么比的吧。。。9 e% w+ R7 j- J, y- U% ^

    + \9 T5 V9 C; U" r( l; Q- t! o您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    , l8 }' o* u9 G2 ~
    9 |! z* e$ O7 G9 t& @9 V有道理。
    ' q8 o! X0 Z0 ~所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。7 G! S: m  U" x8 Z
    7 F' g- _* t$ F
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    5 d/ v  {4 j6 C, E有道理。2 x, O6 G6 y8 i5 m/ Z
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    % W/ ]$ g6 o' r2 M, f
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多2 r8 b8 ?: |/ L; R
    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" e% |4 W7 Q- M+ |6 H2 p" B! M
    这个不是这么比的吧。。。* T9 i% ?6 D) W/ w. b
    . `; q8 X7 f* H5 ?+ h" \' j
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    6 h2 j3 O. d# `: i* f, u# @

    * i! g' q9 g1 l% r2 X; Z7 N" 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 编辑
    ) ]) g  W9 p( Q" a' {! X
    沉宝 发表于 2022-9-25 01:48& `- Z: M3 c. A1 b5 m# R
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ; E  v1 s3 J0 \: `! \" O
    % F1 t; d, O4 _9 G是的,兄台说的对。  M; G# r8 n" i4 L/ E

    1 x- J; L2 o' N4 a5 i其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ! N- ?  l  H* Y' B% d: K3 n
    % A, n! l- g* F. N5 t雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。! `9 ~$ A% S/ {1 x" x
    ! h8 e3 N: p" @! x5 O
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    * q9 T6 Z/ k! [
    + G3 f1 z) u' Y8 F" A当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    5 r, v3 |; y. V' r& ~+ ~: C
    沉宝 发表于 2022-9-25 01:279 K. c  e5 W* o5 w
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      _" M2 z, J, \. D3 x

    1 }2 e: n2 H: w3 [: B又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。3 E- X6 ?- L6 ~

    ) t: x3 H) M& w$ J我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:479 ^% l; @$ C4 w; s
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . c; Q3 {" g8 v0 g
    时间差一倍的结果可以接受。, V" a! x) i$ s, U5 @  ]- u- M

    7 a% ?: B& W- J& h9 V  S$ S你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    " T, C$ o  ]8 m7 d, w$ l) A
    雷达 发表于 2022-9-25 04:47! H! z* u) L4 h! k; ]
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    # f) v, Y* P8 r1 G( k
    # K1 Z! L! m! j7 m% g9 Q5 W
      F5 W/ x/ F4 c/ Y  e# t
    / q; s1 y7 G" i/ V4 e能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    , |: G9 Y$ \  ]7 ~) y6 j' P
    数值分析 发表于 2022-9-25 14:58
    ( K( W! C( k" p能不能把这个也贴上来,看看和上一个有什么不同?
    % I4 j4 X( c& N' X3 V& r" o* b
    理了理思路,重新做了一个测试。
    / g' Y# X  Z9 y  F* p2 Q做了两个 vector 和 两个 float *, 都长 1000007 C% \) m2 a. p& o( q" ?
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 N/ ]9 t1 y+ p+ R. r* X+ A$ h

    * E- H" Q$ ^' v) o% {' J' Z. A! h内循环试了4种方法,
    % U) O. t( s7 x1. 直接调用 vector inner_product 247s
    : p: l4 Z- {2 p  M/ T. H  ], F2. vector 循环点乘累加 237s
    ) P# a( @5 Y: T- T$ Q4 P3. float * 循环点乘累加 204s
    " G) _  v: d' A1 x1 g, r$ n$ p4. 空循环 100000 次 202s3 B% D( ]& s- T  [# b7 k# N2 M
    * [, H/ b3 m# C. `& O
    不做内循环 200s( ?5 F+ Y0 Q6 J* Z
    8 v6 I- n3 x. ~: F& z/ Y* {
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。  l$ T+ \9 P) |1 Y* j
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 ]7 a3 M* z( e5 J) z
      K, s# r8 j  m3 a
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ [; J8 w, ^1 f  J9 D9 u% Y
    5 }" k1 u/ Z. N; A, ]
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
      _  q, y* C9 H2 H% g3 i: n8 o* b( a6 W) D6 d9 c7 h0 h
            std::vector < float > vec1(N);
    5 ~' ^8 G, w8 q        std::vector < float > vec2(N);( j5 L( i# f! V# h; I) p9 h
            float* b1 = new float[N];
    $ m6 M: o2 F# Q6 _7 T( H5 H        float* b2 = new float[N];2 F2 o! r1 E) `" `
    2 m6 l3 s5 V4 f, n
            for (int j = 0; j < 6000; j++)
    " A+ {! Y7 x$ d, b- f9 \        {" n$ c5 d, S0 }4 ^. L! J0 a! Z
                    std::generate(vec1.begin(), vec1.end(), []() {  y( T& Z% g, d* P4 M
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;& W& `& @& J. U, Y% C  a* m0 q/ i" L* @
                            });% ~2 @/ B5 q) e- h; p: s
    9 r8 d. e0 r0 l, s+ ]$ ^
                    std::generate(vec2.begin(), vec2.end(), []() {$ E; ?9 c* J% R+ D
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 c' w6 K+ H' J$ M3 U! U: R' m5 @
                            });
    : B8 N" R0 i! P2 }  X: ?* j
    1 }9 q0 s$ I( }% E                for (size_t jj = 0; jj < vec1.size(); jj++)( ~6 q6 J% M/ F4 F7 n' Q  x# W" x# `5 P
                    {
    7 n9 \3 t1 Q0 M, p                        b1[jj] = vec1[jj];
    1 D; p( _- }: f1 N# x+ ~                }
    " z( T" u) F; r" J( a) Q5 U, S" G4 F; o, k
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    1 {- [3 P% a  r% h# U, \0 i' r                {
    " V; T5 K: V& a" K                        b2[jj] = vec2[jj];/ b, o! b/ f$ o1 o# E& p) g
                    }
    ( ~; B# ^4 y1 e& y& f9 G( }) }; C' L8 I; F4 J2 _8 ?
                    //Method - 1  N=100000 247s  
    + Y3 u' |3 ]+ f$ n                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    3 D7 [6 C+ h( L9 C+ {* N                                
      \1 X- B3 H% g' v) m                //Method - 2  N=100000  237s
    + n7 D: L& z3 d; E                /*; N- P; a5 O0 R4 }( |2 m$ l
                    for (int jj = 0; jj < N ; jj++)5 r! v& `/ e1 ?. q1 }9 `( H
                    {
    - N3 j# c# B, R! E" H  `                        fresult += vec1[jj] * vec2[jj];$ Z. P: K7 m- b2 Y. w
                    }4 m( C4 Y( u% q& q0 E+ q8 M! U
                    */
    3 O0 n' B1 x) H4 y* ?5 R- j  {                                
    ) k- [, t! f+ M                //Method - 3  N=100000 204s- ~' e& n4 ]8 P1 ]8 k; `6 ^+ b/ o
                    /*
    0 `6 R" e2 j3 Z" ?6 ^* [                for (int jj = 0; jj < N; jj++)9 X  v1 Z- `' D+ d
                    {
      H& B6 x2 s1 }9 B; b                        fresult += b1[jj] * b2[jj];' C& Q/ v: o2 h
                    }
    0 U' Z3 g& G7 v% `, n9 Q                */, g+ Z( e* N4 m* ~4 g. G$ g' I
      s* Q( s- ~$ i8 _. G
                    //Method - 4   202s
    6 P4 p, g; d) n                /*
    ( `4 ]5 y% _8 q7 C7 x  E2 t                for (int jj = 0; jj < N; jj++)9 e1 U, E* k( R$ i; X- U
                    {
    4 C: Q8 R* G. J: ^8 G6 Z8 T& k! V1 _                        6 f6 ^9 V3 ~  {8 d
                    }4 f. G/ ?6 i; ~1 ~1 S. X
                    */
    1 {' X' f4 o3 L4 n" Q  ]* I                //comment out all methods, N=100000  202s               
    - T+ _+ c+ M  |        }$ o6 y& ?* U+ |1 R2 |

    ; I0 q  ~' E0 X        delete []b1;3 ]! |1 t2 x6 `1 }
            delete []b2;

    7 o/ r8 p3 ~3 g% B* @
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?3 `1 Q! Z; m- g4 K# `% {

    $ ~' B8 n8 a& A( I/ ~你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?! i8 j# v& M3 q, n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:156 X; _" l: M9 H5 Q' y( t+ K9 ]
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 }$ d* [8 U7 S. f/ d, H, q+ f- E# [
    你第二个试验里面的j在循环里面又重新定义 ...
    - W$ a  l) ^" I
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
      F/ L7 F) v0 p, W+ }0 ~% W0 U6 b4 R4 H+ V  v; f, u7 b  s
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16, r, @7 @) ^0 ?4 M" o9 c7 V
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    . i3 H0 w2 u+ ?8 i3 l( l& j+ z' h4 k
    ) \" t. |0 [2 \( e: W; f: ?不和它 ...

    - c/ @* }" N4 R  [: `+ C1 F7 p' j7 J* g0 ]- o5 m; d
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    , G% J: C: j1 R* j8 ^后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54& H7 A: O! E( Z$ y8 f' ?( u
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# X/ l7 j1 r( l0 A% @: C
    {
    $ Q" x- ?7 Z! B( l        comp temp, xtimesy;

    6 k$ {- ~! g; j8 R这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ( s. O; v: R% y) m+ a% w3 t! B6 B, L内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?! n$ |) u. A4 _) m4 O2 u) F8 j
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-15 09:06 , Processed in 0.074718 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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