设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    1 F0 U. ?6 i* F  b6 p3 ?: @+ r$ f0 o0 K) x# e* k
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ' |: o8 g8 t( W" o
    0 M: |) X; t: H' b速度优化问题真的很有意思啊。
    ; R+ @) w: X7 {/ C4 G) m* y& w; s4 h; _/ d
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?' Z% l" W, p/ ^: b  {+ [" M+ ?
    把代码贴上来看看?. l. B' x6 W% ]* ~

    7 c/ Q1 Q1 s6 J3 W: ~0 \难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    & z' z- K1 D6 S
    数值分析 发表于 2022-9-24 23:04
    2 l( [9 D1 ]* T7 w拉下来?拉多少?" s. @9 T" J5 b& A3 S7 E  G
    把代码贴上来看看?

    ; t" x' r' R& O' a5 Y. r& @, @* z" U
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ t* h6 G. _0 v: T, j; \7 M
    {- j" r+ n- G/ X& y- \
            comp temp, xtimesy;
    % |+ i5 Y- G6 ^        xtimesy.re = 0;/ N" b) q1 P; n* v/ M
            xtimesy.im = 0;
    " i, d) i# J- ?        int j0 = lenB - 1;
    / i$ f- _6 @! }        int    i, j, i1, reali;
    8 E. i7 q8 _- ]) g) l        if (lenA % 2 == 1)
    / _; p( U( f: v; i7 q6 `" ?: b$ }                reali = lenA + 1;
    ! q& m$ {9 i7 N4 E$ H- x8 y- z/ H        else
    " H% k5 g* F) }: h  g1 e                reali = lenA;' x1 k  r9 P6 [. D  h2 _
            reali /= 2;
    ( {5 X3 A% w: l; T; V9 l1 L
    3 |, B( E/ q! ^- R' O        int nconv = reali + lenB;
    3 }3 d5 N3 y  ]4 ]8 s( q% ]" f        //#pragma omp parallel for4 \8 t, q4 G5 i' J/ l8 T; V
            for (i = reali; i < nconv; i++): j3 @  \( m1 S1 Z* x2 ?
            {
    & [; U) X- A4 q                temp.re = 0;' R# Y, y2 O4 [/ g3 s, U
                    temp.im = 0;
      T$ N, N. X" j9 V* x$ ?/ a8 o                i1 = i;
    # y9 G5 |: M8 K4 m0 K9 x+ T1 O) r                for (j = j0; j >= 0; j--)6 Y5 |) f/ J6 {! |; R1 m  ~
                    {2 v9 j2 t/ e- o" y3 y6 }
                            /* floating date operation */
    . ]9 _! b- D4 C, `  ~8 }7 f                }
    . ?, h  G& W1 y
            }5 C8 ^4 g( W$ M* [) v. n/ v8 C5 R
    }
    , i8 W1 ^1 Y& c4 r
    8 L7 q+ H7 V9 fxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样0 K% X* ^' L' r# `
    / \/ y& ], f7 ?, [7 F
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    * s9 P- d% D" y1 p现在call xcorr 100次,耗时78s.% p6 s& e9 [0 q/ J

    1 R1 c! g. G" n2 ^1 x1 D" n如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    8 n2 @  T1 V, Z
    6 S1 k4 r, x( l( ]) z2 P8 X
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:332 ^( P5 U1 G* M
    Maybe Debug mode?

    ; P; K" v3 C! v3 z, r4 ]
    1 C& `4 E1 k6 a不应该,看我上面的回复。" Q( h3 E, C. c4 w$ v
    % ^$ f7 p: x6 f& ^/ k$ d
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 2 x8 [- x6 y* {0 T
    雷达 发表于 2022-9-24 23:54
    6 i8 z, |3 ~7 T8 s, F8 K/ pvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % M2 C) }6 {9 L# |- g{
    8 c5 o, q+ V1 J, ^) k& ^) S        comp temp, xtimesy;
    " b% v  f6 [- x$ s# B- v4 O* ?

    ! S: \" q7 n2 S. C! D% w, b这个不是这么比的吧。。。; s6 W. Z/ }, i6 e9 D+ L% Q

    - \# D' J4 h( w  x$ u; L' m$ z/ ]您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。$ a7 e; h, D# E  G) O6 e

    ' f; D) \  X; p. W5 F) m8 T而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    - r5 U6 S# U/ s* ~9 k7 M6 Q
    数值分析 发表于 2022-9-25 00:20
    1 W; z: U* n8 H- f这个不是这么比的吧。。。
    8 j: P3 J  U/ N! O& ]2 @, y
    ! p/ ?  K' p5 q. m您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ( F) P& n  E) M' m9 T1 [
    + m& |( m" I' i! c. l
    有道理。, n* m3 K; ^1 R5 \
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。$ n7 b: t) _6 m( t# p4 p

    . R4 k( W  E+ T8 d. S) ~0 O# w9 U, i我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    . z+ Z( c* R2 T2 A有道理。$ j( u  X( P* c
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    / {9 B, x8 {$ n2 }* |. e& R
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多, n0 x( i) ~4 Z
    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
    8 P5 g4 L, F+ G! J1 o6 b7 c这个不是这么比的吧。。。, }+ R. ^% s2 H% n$ o

    * N3 x/ s5 v# i# g您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    6 C! Q& B3 E. u1 Y: f; L
    * m' X0 d5 V. ^3 d" v! Y' 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 编辑
    1 o5 l8 g# L. H. v
    沉宝 发表于 2022-9-25 01:48( @' g8 [$ d$ u# c
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    6 K- Y5 U/ g/ D3 v) Y+ q, B

    / L7 ^" e9 U. @  k. v7 K是的,兄台说的对。
    9 {0 U6 V$ R3 u1 M* M5 m
    & b& e( e$ n# A7 z其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    . I3 s: |$ u+ H& b  b' t8 a5 q; j% V0 O; w
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    % h$ i: e; d! A8 w5 S5 v8 [" L) E) L# G( ^& w* O0 c6 e( G# D
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    7 I8 r2 q0 R( _3 n
    & L5 {- m- j8 g+ Y当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ' P& w/ y4 V! e  w, z
    沉宝 发表于 2022-9-25 01:277 M6 t( Z2 X1 W* O; m2 X* x
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    * j, |2 `- A" l4 ]& ]1 R; H2 C& _" x- Q" a$ }# z
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。0 _1 {  m: G+ l' V8 Q
    8 ?4 P) o. f8 l7 V
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47$ |# t6 G7 C/ L  B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    9 B1 I3 K! }; y, d, o/ J4 D
    时间差一倍的结果可以接受。
    " X0 e4 f' V( d; ]: z
    , @# f4 i  M# u& c你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 + ?4 u1 C) j$ o$ E) l
    雷达 发表于 2022-9-25 04:47
    ) Q% `8 D% k% @# k8 Q7 d0 }6 e0 B. E又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : J* P/ h' n1 X5 i/ _
    : A! q' I3 _% A3 A& Z- `
    5 |$ O; a6 o0 a! M' r! G7 a1 E
    * U3 S5 E  ^$ n8 D  a; M能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 : w( o1 }' J& e2 ?% O% x: g$ O6 K: f. h
    数值分析 发表于 2022-9-25 14:58
    3 m  S$ e4 ^3 ]! g3 ~2 J能不能把这个也贴上来,看看和上一个有什么不同?
    & t0 H- `' ]: J) ]/ |7 \* A- k% h0 X& c! ~
    理了理思路,重新做了一个测试。' S" ~+ Z3 |* X* V
    做了两个 vector 和 两个 float *, 都长 100000- |! R% S8 T# _( }
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 V& w$ a7 ?2 R$ D  y: b, U" I

    7 v- u& F4 [) S. Y  ~内循环试了4种方法,7 W- e9 W2 M4 m: [+ }
    1. 直接调用 vector inner_product 247s
    6 `: _! A* L( \8 O, b6 }  P2. vector 循环点乘累加 237s* j* K% ^6 f) [" Q' ~; l
    3. float * 循环点乘累加 204s
    5 _' C3 O5 R% \& B. E4. 空循环 100000 次 202s8 b. U& v4 q. O- T, _% g4 R

    , ^/ y) o; V( J: v$ l. r5 ~不做内循环 200s
    5 m- Y6 v& D+ r3 X3 w  }* h5 H
    ! a4 V, c9 n$ Z8 n* C你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    + r. z, c1 `; a! y! w6 d" r( s: c另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 B) ~8 E/ N5 t1 v7 \- n/ ]9 z
    0 i; k/ C( h0 x" z
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 H( W/ m% K1 S/ W
    / W! ?8 N4 m8 t' l/ K& |6 N
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    1 V! [3 O& N: y3 X) P* |. e2 @# ^% d) g0 |
            std::vector < float > vec1(N);
    & O; g3 ~5 i# q0 n        std::vector < float > vec2(N);
    0 H4 R0 \8 \- E$ t8 Z        float* b1 = new float[N];
    + o/ d- |( r6 K* ~  a3 m# d) @, P! j        float* b2 = new float[N];1 y% r6 U" K" S; R5 L$ L
    * n3 c0 B7 N( ?- M# k/ `4 U3 ~
            for (int j = 0; j < 6000; j++)3 F6 T% d7 A9 G1 R
            {
    ! @) T. r5 G9 U2 o# D                std::generate(vec1.begin(), vec1.end(), []() {
    : n$ w! D+ P0 h0 {+ h/ e$ Y: e                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    5 J: N) H$ [! |! Q+ k+ i  K% w+ k+ S                        });+ B+ R7 I! [) z2 P" ^. u# j, f
    9 R) f; f& o2 W8 [8 ~# H8 G
                    std::generate(vec2.begin(), vec2.end(), []() {
    * ^  H6 `7 t  [6 k% G                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 b" h' N; ?0 A, ?
                            });# y9 I+ T9 W5 ]1 s  O# H
    5 O$ I3 \" S" q
                    for (size_t jj = 0; jj < vec1.size(); jj++)* z0 k) |/ t7 Z( e" M* V6 |
                    {
    # F5 `/ A: q% G4 k% a6 S- a                        b1[jj] = vec1[jj];( D, I$ Y1 e( u
                    }
    & J) T3 A. B) Y& t, E& e1 A$ {! t/ u1 r- Y0 k5 s5 ^, Z
                    for (size_t jj = 0; jj < vec2.size(); jj++)6 R9 J. ~* B  M
                    {
    1 B8 l! d  `4 D) U% }8 k. ^: b4 [' d                        b2[jj] = vec2[jj];
    % F; n; K. P% [+ b3 S                }8 t$ D2 m6 J/ G8 X/ W4 T% }) o

    5 N+ r5 {9 l: o  h0 [# E                //Method - 1  N=100000 247s  
    9 Z5 D+ X2 ]4 n4 g2 M  t                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    " N8 O- ]$ {6 N6 U                                
    0 }1 w* J6 E0 n, Z0 ?3 f                //Method - 2  N=100000  237s- ]5 W. G# w; [3 I0 Q
                    /*
    - }" ]; M1 Z0 b. ^; I: _$ S# x                for (int jj = 0; jj < N ; jj++)$ |9 Z( \) F: |% c6 w; P) x
                    {
    - N4 G0 e& _4 L                        fresult += vec1[jj] * vec2[jj];8 F. p% s" `/ ~0 _, |2 t. o/ q9 v
                    }) |  N/ [% s9 X% U, v8 g) ~- Z
                    */$ @9 T" a" G( ~5 O9 f( y, T0 f
                                    
    6 A3 h( V  U8 |* u- q* `4 U                //Method - 3  N=100000 204s4 j8 V# Z4 K! m1 d! k- n, m0 L9 V$ z' u' Z
                    /*9 }) M6 S- X3 C4 j1 f1 y1 O
                    for (int jj = 0; jj < N; jj++), Z+ R2 C6 F+ I' T1 f  R
                    {% U; f+ z; d8 O% V/ V; d& i5 u
                            fresult += b1[jj] * b2[jj];
    $ L) _$ A) N" |2 v                }
    7 U+ @+ P" t4 {# e$ u: U                */
    0 |, q+ Q2 n' X7 }0 S) ?3 S: b0 H2 `, p9 Y1 ]7 s
                    //Method - 4   202s
    ; x0 K$ O7 L$ r3 S: |6 H& i                /*/ e4 w2 ^7 _: n" U8 \8 D& I
                    for (int jj = 0; jj < N; jj++)
    6 s! R  h- K6 ?                {9 d8 |7 s* |2 k2 n
                            % G0 p$ `) h8 R) {& z$ i
                    }
    3 P4 `* K/ U, d- n( x7 G; K9 o                */  ~, c7 J* L# V6 O" ~5 [
                    //comment out all methods, N=100000  202s                & U/ v  x3 x4 A: w& N
            }
    1 i) y0 _: @7 y, s7 b1 A5 v/ I3 Q2 t0 k& r& P; k
            delete []b1;, `; G0 z. w* L5 l  _0 B
            delete []b2;

    0 d6 W/ I& C+ _. L4 ?5 a8 I& Y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    " I6 O/ ^/ z- t: Q' f8 m) y* s. Y" d1 h" @% p1 i! }/ H# N. K
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?3 R/ W/ ]3 c1 H6 B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:159 k6 B. P2 H/ }* J
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?! {4 c6 r& I1 y( u

    + V# ]: `5 t8 o) ^% u你第二个试验里面的j在循环里面又重新定义 ...

    / S. p( O$ L  U! w. t: X内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL8 W" g/ z$ r* _# A

    9 I- ~' y$ q$ {! F9 Q不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    : E( O$ d6 o; _4 Q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    : s: k, n: C8 T' I5 K3 w* q, K' A, l" A, ~+ j$ b
    不和它 ...

    & ]) \4 b6 I( B# O: A8 D% K. J* w# d# i5 R9 A
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。; K. J* M9 Z$ ~% v! S7 y. V
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:546 z! G* Q. C. V2 _+ _6 h
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    . i! |6 ]# Q! V, K, r{
    ) N$ b5 W! }% J        comp temp, xtimesy;

    . D9 v3 V' g+ }6 z6 Q这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    # v8 p  K  G5 {: V0 {; v内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    6 i7 m; b$ e: k6 u2 P+ YVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-6 19:22 , Processed in 0.064417 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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