设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! w% M" o6 N6 X7 y" \
    & }5 x1 b! y0 O9 S8 M自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。. L4 b) {3 P( w! H! H/ j/ \
    1 M; C6 Y& Q( D) R
    速度优化问题真的很有意思啊。* g) ?/ T( c9 c2 l6 Y& i+ _# ?

      x" `0 ?: c% x% {- J; \+ L. o- F欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    " ]& Y, W' F! C) K+ E( Z: V把代码贴上来看看?; Z+ D3 v7 r0 k) |4 Z2 G
    1 H4 g  l9 K, K6 o  X% O
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [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 编辑 5 V' `* e0 \. X9 S& a8 Y! k# Q6 [  C
    数值分析 发表于 2022-9-24 23:04
    ; o: {  O& y8 D" b1 n! l* d: G拉下来?拉多少?
    * U: ~, w) @! d9 F/ z把代码贴上来看看?

    ) u1 d8 h- }/ r. d0 V; r3 K
    ( s& g- [3 O! Z0 @1 A3 M* A/ x: U: ]void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- F* S6 t+ s% m- \3 E
    {
    8 J- e! i. _3 o. X9 n5 x        comp temp, xtimesy;: t/ H1 j4 ~+ S8 `( n7 g* W+ c3 g
            xtimesy.re = 0;
    9 n* b- f) \! B) o8 w        xtimesy.im = 0;
    ' m  r1 r+ V9 K# q& _5 K- [; ?5 W& n$ F        int j0 = lenB - 1;
    8 f% K) L6 M  X        int    i, j, i1, reali;# \0 `+ R# J; p2 k3 k( u
            if (lenA % 2 == 1)
    : ?) {2 J+ G. L6 v* l8 w+ l4 g7 H                reali = lenA + 1;
    ; @+ n: `5 ~5 k' B( s' V        else/ T' r* A/ K) q
                    reali = lenA;
    ( N/ j" M5 A5 \( N3 W% ~- v        reali /= 2;
    7 q4 P# w4 ?3 V) U0 l
    # ~$ H2 |6 j! I+ ]3 `1 L        int nconv = reali + lenB;
    1 O* ?9 M6 W! k  N! T        //#pragma omp parallel for
    9 G$ D: S  ^2 Z% {: u( Q        for (i = reali; i < nconv; i++)  e) o# E! W( t3 d- U  X6 j
            {
    4 k$ U$ y- |  L& V: P9 j) _" A                temp.re = 0;
    $ k1 B* _3 y( v9 \7 a) A3 I                temp.im = 0;6 E. `. X  b6 Q
                    i1 = i;0 O) @# b% y1 [8 Y
                    for (j = j0; j >= 0; j--)
    , X# D% X, I7 ?+ q                {% N$ `0 {# r) C; A  X, V3 c  Y' ^
                            /* floating date operation */
    2 J) X4 ~7 y! n5 w1 M                }
    9 f- G. @2 S! z3 r* [
            }
    1 p; b& r# T; v! G% i$ J}0 y8 B7 T( Z0 s# y1 r; a4 P

    $ j3 a( e, b( c2 V) |9 ?xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    $ n6 q. Y' m  ^7 [5 S
    6 t  `% @" j& v/ s: ]7 s红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。0 t  B% M& T' S1 k5 O. z
    现在call xcorr 100次,耗时78s.
    7 ?& [  \' d0 T; O9 M- t# }+ @$ L) o* N
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    1 D( r0 l( t; P7 r9 p) e8 x% b6 W
    ! ]% \- l: b: Y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    , ^9 P: ~/ Z' @5 `4 dMaybe Debug mode?
    . _0 v) e8 x$ S. J

    # Q* E1 i4 }9 h不应该,看我上面的回复。
    ! F! q& T0 G  M9 u9 F8 ?: T7 b/ l. y  E# U
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 " J" F& i/ D, q% K, F5 w
    雷达 发表于 2022-9-24 23:54
    6 F0 k+ D8 t) X' S/ b& I/ W( e# v, qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)- s7 |3 p  P4 k
    {+ Q1 f; D! E- {! s/ b" {
            comp temp, xtimesy;

    ) m' m8 U: D5 l  L7 {0 S: ]- t6 t$ X4 y, q- v9 B: _/ p4 K
    这个不是这么比的吧。。。9 I. }0 X5 E' I2 _
      R1 H2 Q2 F! D; X2 ~8 g# a9 o
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。' R5 b% ~* C4 r- G
    & L' S) @% j2 c4 N# V& E) L- S/ e/ ?; i
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    " P" @: f/ ^/ Q/ e
    数值分析 发表于 2022-9-25 00:200 b/ @: ?7 Z1 y! ~" R' |( l, v
    这个不是这么比的吧。。。
    0 @/ ]7 I; o  A9 r( d' \8 O
    $ }" K" x2 R3 q9 b, U# z. G. f您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 g3 s! ]7 ?) U7 J6 F& b

    5 K+ ~$ l( m) I0 K  t有道理。
    1 ]( U! O/ J) T. M5 Z( ~所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。+ o1 o( V3 S& X9 R4 T: W; h7 b
    ; S8 |# R( i2 _; i
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46+ ^+ o8 F$ M5 U7 T, K/ d
    有道理。
    " [) F; r" l( b- g. P/ p所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    * _. C$ f$ h  Y6 j* `4 R; \你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ c" C8 L" I7 s! {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, O- x, ~( Q% ^2 ]+ g8 u8 m- z9 _
    这个不是这么比的吧。。。: i: o! C, l6 x: K
    6 R! j* e7 m; r, H6 w
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    " Z/ E7 H0 X" O; {. ]+ j2 q; N6 I4 a' y1 b3 j% H, `  {
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 5 W$ D8 |1 D5 a+ T; b0 J$ e
    沉宝 发表于 2022-9-25 01:489 n% n$ M! O3 [' w5 ~  S3 N
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    - `* m: t; E. [* y$ o
      u% ?7 J+ l( x8 ]. c0 s
    是的,兄台说的对。
    9 R- _3 K! h4 q9 U0 A5 r3 k7 I- U7 b4 g" Z* h
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。3 i3 s5 e+ ~* n) n$ t
    / m9 U, Z8 a% j, M
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。6 O6 _! E+ N3 X+ b
    6 r2 Y( K7 q& H& w: e
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    9 N3 n/ S1 E7 I2 t1 Z8 u  s
    + Q* B  h: B+ z2 v+ T当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 9 e: r/ K5 T0 }9 A' Z
    沉宝 发表于 2022-9-25 01:270 e, e6 j8 Z3 [+ P1 [
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    " m: t7 I# q% K; q- T/ V) @& Q" \8 b' `' B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    % q' P3 t7 K  a
    " W8 r+ s) y* v# O' u" y8 X  J我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    0 q6 d: [& g4 f* n又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    . l- U' I3 S: Q/ x时间差一倍的结果可以接受。
    $ J/ m9 d3 ^$ K  }) A2 A
    + S. _" e+ B. D7 j$ R+ @( x: Q7 T你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    - W3 ]* b9 y1 K
    雷达 发表于 2022-9-25 04:47
    / Q0 k+ n: n9 l1 z* _, u" w又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / p7 q. u) j" K5 g7 w* B% t1 A
      M0 {% e+ ]& J! u- a$ _8 \7 V& g
    0 |. k) W  C6 O8 o9 a! B5 T9 ~$ n4 J. w6 ?$ \; X$ t' j; j
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 - \: I3 {  r6 A
    数值分析 发表于 2022-9-25 14:587 u. }  Y, _# D
    能不能把这个也贴上来,看看和上一个有什么不同?

    5 z+ @; }! B. A% f1 M理了理思路,重新做了一个测试。
    , m0 z, C4 Y. i' a做了两个 vector 和 两个 float *, 都长 100000
    : c5 i3 i. L: {1 i0 i外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    # |$ c5 p4 R/ i& N! S
    2 s) r  {* a/ _6 n# w内循环试了4种方法,9 N; P  P9 l$ K1 G8 l
    1. 直接调用 vector inner_product 247s
    + C2 f) T; b/ ]9 Z, \2. vector 循环点乘累加 237s
    * D' v0 }+ {% P2 r" F0 z/ t2 {3. float * 循环点乘累加 204s
    : p3 C) K4 E2 k/ f" J& T5 A3 W: }4. 空循环 100000 次 202s; V# l/ C$ U4 `8 t1 f
    $ L* F1 G  D% L9 m+ F
    不做内循环 200s
    3 H) A  e2 Y8 D) S  [& V0 W$ d. z2 z" Q; O7 R: k  g
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ) }7 ?- j* B* u. i另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    $ t" Z4 Y5 O0 V% H% l* T0 t  n4 v$ K4 `! \8 }
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    1 H0 ?6 ~" J% O* \, ?
    1 ?; \2 }5 S! X' u$ O2 F(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    5 v" O% e  Y& i6 Y5 m0 u
    0 s. d7 e! ]6 g1 [
            std::vector < float > vec1(N);( V' a4 f! k# _$ F
            std::vector < float > vec2(N);
    3 A8 Q: p* v$ L$ `4 K        float* b1 = new float[N];
    ; v7 [$ |1 {+ V* L        float* b2 = new float[N];0 s. y9 W& }  \( v; `

    6 P7 s, F' T( F* j/ b        for (int j = 0; j < 6000; j++); V8 W9 i- D9 h" N' }
            {
    ) h0 R# S, D" ^                std::generate(vec1.begin(), vec1.end(), []() {$ Y' Z8 `8 M$ }6 n! D
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    8 `8 E1 w' i- j7 }& ^" h                        });4 }  p, L4 D% |1 ~- h6 V1 y

    0 c+ r- R( C- t0 U  a4 }) m9 v                std::generate(vec2.begin(), vec2.end(), []() {! E  B$ m+ I6 J9 Z% ?- l' O
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    0 ?/ j# ]& k) }                        });
    - i- V% V# T6 P+ C( z9 q
    0 [- m- S& R* @                for (size_t jj = 0; jj < vec1.size(); jj++), D  z4 j, B! V, e4 k" S4 Z
                    {
    - {, Z2 k; N( u                        b1[jj] = vec1[jj];
    ! v* K/ J0 `! m/ I5 R! k3 c# e' M: N/ K' h                }  F( m! f( b# w; L3 j
    8 X; f& {' r2 }5 R
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    3 B" I$ w( l' @                {5 i6 m2 j" K; N2 X2 w
                            b2[jj] = vec2[jj];
    & E2 A6 Y$ h8 i- M                }
    4 V8 w8 N3 J9 m4 i% b* h4 m2 L
    : n4 u. L) J" l6 N) q                //Method - 1  N=100000 247s  
    8 C- z. L4 U+ T' {1 u+ i                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    4 I  [0 R* H1 b: j5 K                                
    7 ^1 w1 p* z4 [                //Method - 2  N=100000  237s
    3 S. R( L: [8 x8 n2 A& {                /*7 F0 K; {6 r& z; E7 o* z
                    for (int jj = 0; jj < N ; jj++)
    / A% `  J8 I6 P                {
    ( L; w% Z, y3 D                        fresult += vec1[jj] * vec2[jj];
    9 w! n! q2 d- T0 |                }' P0 A' w" [8 O$ M
                    */, o4 q( T" |6 q: m
                                    + N8 V2 j9 W; }: N3 q8 c
                    //Method - 3  N=100000 204s
    5 Y: J. S. N: i2 ]: N. X! ?8 q                /*
    1 I3 s  N6 ]8 v+ z8 J                for (int jj = 0; jj < N; jj++)
    ! ~+ F7 M# _" D+ H+ c                {8 N8 c8 v. w& U* q+ ^) Y5 U1 r
                            fresult += b1[jj] * b2[jj];
    . F! o  j, J9 b; d$ H                }
    * x" ^8 k+ x4 U+ C  l% q+ r                */
    " E* N9 ^- a) m8 x& W( t
    ( q: M4 b- N" O9 U, }/ u; G                //Method - 4   202s1 G' `3 ?+ J" X
                    /*' g- @+ R5 c" P! Z' |
                    for (int jj = 0; jj < N; jj++)( `/ n: S! x# K  X; @6 T. k; i
                    {- j; c9 `( H, D! D; r/ ~$ ~7 \
                            
    5 y7 I* D1 r0 o4 P                }
    4 k0 p: s- d& w( H                */
    2 _- j, N* X- g% b  Y5 T! y                //comment out all methods, N=100000  202s               
    ' c2 v6 P' O1 A0 Y8 U' ]) P3 s5 ]        }
    3 P% R4 \/ u9 l7 V( F
    $ b3 R( p5 m% d        delete []b1;
    2 h- _4 W; g8 @6 W3 a( m4 S        delete []b2;

    : t, d7 c8 l! }4 A, Z
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    4 X8 S2 F- E7 U0 x" r$ W" K% k9 P3 |; N" r
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    3 T4 n+ ]7 E+ T$ i1 }$ W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ; ~9 T* P8 M3 e( x2 y  H9 j! S8 T  U瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    3 `, `+ s, ^+ Z' j/ q9 y$ r% i' r1 j1 u
    你第二个试验里面的j在循环里面又重新定义 ...
    , r: Q7 R8 P" {7 y8 _
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL% ~* ?4 P  s7 \0 t7 Z

    8 l7 p# T9 g% H. D9 g不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    % m2 r# ?' F& P7 f  o8 P5 k6 x1 E内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL, s; J; R" C, x" t: w3 [( ~
    ; y- h: Y* P. ~3 n' f) n! {
    不和它 ...
    ! J+ {4 S/ m) j$ `$ b' j+ i
    . u( a7 B6 @& g# F' g4 @7 b8 T
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。; l2 d( I! g8 B
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ( x" O- R+ m! n9 R% T! k4 Q' s  I. _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 [) B2 p' l2 ]% V" d0 F0 g8 q; [; k1 Q
    {/ d& h5 G" d# A+ R" f
            comp temp, xtimesy;

    9 w7 h8 y$ K8 }2 X这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    + u. S% c0 v' U: C内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    5 p4 x  d' t3 S+ f7 D- z* R" H' zVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-12 03:01 , Processed in 0.038334 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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