设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    : e5 X0 f/ `; ~) H5 ~# D& e3 W) A. U5 R) Y1 T, k
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ x8 F( k1 t" u, q: O& I
    1 o$ I4 g0 Y0 @0 j: R6 D
    速度优化问题真的很有意思啊。" z7 `, I9 Q; n% }& G
    3 N9 [% Y1 ]" ], Q% @. g
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    " K3 |- x8 a( y6 @! a' g( {把代码贴上来看看?+ o5 }8 k9 ~# y, j% P

    ! ~* I- p0 K7 X! h3 V难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    ! V0 g- x& H$ z0 I/ @9 _5 @
    数值分析 发表于 2022-9-24 23:04
    ' {% @% p6 W6 D) U' C. K4 O$ s拉下来?拉多少?
    ( D% `- L8 f( I3 b把代码贴上来看看?
      m7 X$ f/ m" V5 H2 S

    $ q' {) h+ P; h8 r' u" I1 l$ @void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 W' B, w" f! K5 R* U{* d( Z7 }7 h$ M% R, N; f
            comp temp, xtimesy;
    " A1 ]: |/ m  o$ u5 H+ }( J        xtimesy.re = 0;
    , I% W) C  ?* J, c. _6 z# K        xtimesy.im = 0;
    6 d" ~4 R& }9 ]4 z& g3 ]        int j0 = lenB - 1;3 {1 e; x7 @. F
            int    i, j, i1, reali;4 V; p8 N! s7 o9 R8 s
            if (lenA % 2 == 1)2 O4 f# \% I( ]
                    reali = lenA + 1;  j7 M% H% D- j$ z. S% Q3 h) c
            else
    3 L8 U$ ^* i  \  \$ C. q- e" ?. n3 Z5 d                reali = lenA;: x9 \9 z$ c0 M* |1 n4 j$ E. `
            reali /= 2;# [$ f2 |7 X5 z! I6 n

    / _" H( D- }+ U        int nconv = reali + lenB;
    ! `  w) N* V. g6 e+ h& J        //#pragma omp parallel for1 T9 z8 P8 o6 W) P( f
            for (i = reali; i < nconv; i++)
    " U3 h  V& O% i2 I, V        {, d( `6 F- u5 Y
                    temp.re = 0;
    ' K3 o: G: F+ U+ w                temp.im = 0;; Y) \# r' d$ s
                    i1 = i;
    8 p' @4 {. G# K0 I                for (j = j0; j >= 0; j--)
    + `4 D; e7 \( Y8 h2 I, I  Z6 W                {5 S) F0 U: I# k
                            /* floating date operation */
    ; G7 I/ c7 n1 V2 i0 h                }
    $ n3 P0 _5 u) z+ f1 Q
            }/ _8 q# C( U( b, G* L! J; g
    }0 z2 E) w* y( z, A' }- X6 Q

    ' c* U$ W# l1 B; t5 i5 xxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样, d( G) j+ R, i( f
    , g, U; `$ h% I
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. ~( V, Y9 v9 M( d0 E
    现在call xcorr 100次,耗时78s.# ^2 Z2 d+ L" y5 b! j
    / \8 C5 a4 ^, r" l8 m! _  T4 ^: W
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    $ r  O% \+ F0 @, J5 }/ i, n
    ; r* l2 N+ ~8 v: V6 q2 [7 H
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ( [6 V1 l9 K5 @9 h4 X$ s0 S* lMaybe Debug mode?

    4 _8 @, L6 G' N, F7 h/ H
    3 L. I" X* q# N, u不应该,看我上面的回复。
    0 B% P1 [( r9 O. A% k: W3 S% A# s
    ) m& h, Z! U- x9 R, D# r5 t! b我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
      \2 p3 g' l# {9 u
    雷达 发表于 2022-9-24 23:54
    1 `/ V; l4 A2 C0 v  |1 A7 _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)  e! m* S7 _1 w+ A# j
    {
    6 F1 H1 ~7 Q' u+ n" {" [6 n        comp temp, xtimesy;

    5 H4 \0 B3 V" E. O' L) R4 w4 e; E- S
    这个不是这么比的吧。。。
      d3 O; t7 I0 a1 E4 V3 f# C( ^) U! }0 f
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    3 w- a+ W. L: C1 J# h! r0 z. L4 ^# U" p' @' R6 |$ ?: C
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑   i3 j  X3 G, O% p
    数值分析 发表于 2022-9-25 00:20
    % y/ [+ r7 q% z0 R, R* e, l这个不是这么比的吧。。。
    ' a* ?- g4 `- _) O# B
    5 S6 `* }  x5 |" i您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    " g% q0 v2 Z0 T# p& t: \% _& |2 S$ E* _4 ]+ ~3 O, [! [
    有道理。; o/ Z, {  O7 |# C/ {5 [2 X
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。! u2 K) }3 \) A8 m: Q9 V0 ?
    3 u! B8 |* S- `
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:461 t+ R2 ?1 w( \' ^
    有道理。
    % ]3 Z! s+ O; _6 w" {% Z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    5 Q/ x/ ?) e" S& \, _* x
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ; Y4 |6 ]7 S7 a- F5 b; S; qWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    9 y9 R7 f. }8 N" L/ E1 H1 E这个不是这么比的吧。。。" s/ k9 m  o. w0 k7 b, c
    " _: p* ]( c5 x" p9 }2 w! p4 n& I
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    % A5 w4 Z7 e. P: h4 N0 c

      s& z' a9 G! H7 o现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    : I4 ^/ O! U. B; u- A
    沉宝 发表于 2022-9-25 01:48: w( Z7 l$ o: L8 d! o4 _* K
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    $ F. l9 R1 l0 N8 j
    , e& N! m8 t' t, G是的,兄台说的对。% j9 A4 F3 k4 V' j5 k4 ^

    4 X% x8 g- |7 G. b9 r' r+ h: f其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。) I& _8 A9 j! t( t0 W1 c% a4 H! k( p

    $ `: j4 [5 d  R! z; e雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    8 Q& u/ k$ R0 y- e- k" {; J1 p0 o9 W4 M3 X
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ; U0 L3 L; [  Q# w& D7 C2 ]2 y; s6 |8 u- k7 W, T  _
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 $ e: C/ Q% B3 L# o
    沉宝 发表于 2022-9-25 01:27
    # I  _4 X6 E4 k+ \# ?0 U% I你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    * k; e6 C+ I9 }  X4 i* m
    6 j0 w- l" N' I( A& ?! |: H
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    7 z0 @6 c& G$ }- A
    7 g9 d' z/ y6 @: T; h; ^我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47# {8 T; Y( e/ X1 `  K: U( g  q2 \; G
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    4 g, c: f6 s* v. ?0 T时间差一倍的结果可以接受。! c0 U( j( a* N% H' D
    ' r/ Q" ~: O, ?& g
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 1928 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    * Q! ]# H; N5 E& O! x; o8 k
    雷达 发表于 2022-9-25 04:47
    6 P3 A. z: v# `: I" O. s5 s7 B: K' D又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % s+ d  S( w. r. h* c  u0 R2 ~8 W. _6 D* O' A

    0 a1 i5 ^) n$ @1 ]
    . J9 B% J$ a5 H2 a5 f% y能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 E; p0 z, l* X: N4 ]' b
    数值分析 发表于 2022-9-25 14:58
    ) }9 s1 O, i: V, z" k能不能把这个也贴上来,看看和上一个有什么不同?

    9 o: f9 M& N, M  r* w% C理了理思路,重新做了一个测试。; @0 H; s( q+ r, _
    做了两个 vector 和 两个 float *, 都长 100000
    * g: V' F# J0 ~7 W0 F$ [1 O外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 B. X- u* E8 Y

      R% G; C+ Q! @6 F7 e内循环试了4种方法,
    ( q- D- L) c! Z4 @2 U1. 直接调用 vector inner_product 247s
      ^  a$ ]6 p' Q. l6 d2. vector 循环点乘累加 237s7 Q4 [( F8 k% M+ L7 p6 ?. W
    3. float * 循环点乘累加 204s
    5 w  q: C* w7 ^" r" T4. 空循环 100000 次 202s+ G* I9 O) V3 R0 B. v

    / [' k" ]! Q' i" l不做内循环 200s, m5 i9 Z* C9 G
    ' |( |6 `  Y5 }; g3 d
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ) z' }1 @1 F8 L4 H7 X另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 k" S" U# b8 J0 a  I- \. I% I
      d. j& O2 K" o2 v
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    : i) @2 t6 J( N4 q6 s2 R
    ; ^& i4 C" W# k4 J9 t! _(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)5 a7 ?4 r4 n$ j) ]8 B0 _: z8 ?
    2 N8 x1 U* `4 T: z! u" ~6 z  W
            std::vector < float > vec1(N);
    ( G* \( L6 K4 P2 @        std::vector < float > vec2(N);; e. F9 [% m, H1 H1 P2 q# A; \5 g* o0 D
            float* b1 = new float[N];
    ( f/ x1 I- g) G/ R% y( U        float* b2 = new float[N];9 D0 a( }- g5 I# o
    1 g8 a. y, Q% |! s
            for (int j = 0; j < 6000; j++)
    + F9 Y- P8 K2 |3 I' j; |        {
    + n, x4 p# _2 }3 }1 [) W* `                std::generate(vec1.begin(), vec1.end(), []() {8 Q* h$ m0 N- `. ?7 H, w+ S+ s; N6 C
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    9 |8 e5 k, K, A+ b" Z                        });
    & ^+ c) S+ J. _
    : s& |" Z+ c% T7 ]" t                std::generate(vec2.begin(), vec2.end(), []() {
    ; {8 C: C/ ~0 R' z# J                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    0 L# w$ B3 d) V8 o" Y) e                        });
    ( ^( ^( [( R! Q& ~# d( `1 Y3 M3 m; Q- r' B# I' I* l2 b2 f$ e
                    for (size_t jj = 0; jj < vec1.size(); jj++)% S2 n2 z9 k  g9 P
                    {9 e: t3 |3 a* L; R: ?9 B
                            b1[jj] = vec1[jj];) \2 z, i0 F$ I" I6 v
                    }
    4 m, L, j8 t1 I- K! `5 a( r0 \
    6 e+ k; d  j7 x! l& p- g                for (size_t jj = 0; jj < vec2.size(); jj++)
    ( n& g0 r* \6 W# _' |& n$ O) U                {; R2 f0 w3 S. n9 G4 c6 B' A
                            b2[jj] = vec2[jj];  K7 u7 x8 K6 I0 Z3 i  r& d
                    }) \" I% A  N0 ?7 o
    2 c; C3 F' h! |# K
                    //Method - 1  N=100000 247s  8 M! Q- |  E. ~- U, K
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    / Y3 X; g  r  A' l                                
    ; x; }( x* Z' m. r/ x                //Method - 2  N=100000  237s0 g  S* }3 R4 ^, K
                    /*
    & M& k4 U, G- t5 g) i                for (int jj = 0; jj < N ; jj++)
      I4 _5 {/ I7 Q3 c7 Z) L                {
    0 _( R3 j' [2 B$ G3 i                        fresult += vec1[jj] * vec2[jj];, H* w  z0 P# Y5 v) U
                    }
    " q! K) t/ }/ q& k$ B                */1 n" p6 C5 @; F! _( H
                                    
    4 p  l3 s  g7 v7 q                //Method - 3  N=100000 204s
    ; L6 f9 ^5 |. @) V6 @4 d  M                /*+ _1 _; H0 X$ g, D- o
                    for (int jj = 0; jj < N; jj++)
    % r- F6 i% _* d# q* m                {
    : i1 u, R( `) L) A) b: I                        fresult += b1[jj] * b2[jj];. z( M, u0 g! W* Q" r+ Z) {9 g
                    }
    3 c, ]+ V+ r1 D  X. ~                */6 g6 i3 s% W3 f; t; d3 P# E* x$ `2 W* \
    & I+ r2 ~( ~9 Q# t* Y
                    //Method - 4   202s
    1 r5 X' [3 D' {/ M; O# u                /*
    1 q. b2 t8 p2 ~/ W& M; b) t" V                for (int jj = 0; jj < N; jj++)# O. w! e0 K+ j% M- y( }
                    {
    ( M; ?; E7 S- H8 y! u3 _                        
    6 |( j9 P( A  I& D; P8 c: u                }; w5 a  A& b- _
                    */
    : `! C. y9 j. b$ {6 J                //comment out all methods, N=100000  202s                ! t/ M( P6 \' g% A4 N
            }
    / K: z( m# d/ Q, Z  h$ c7 ]- S  n, i: c$ i# U9 A+ J, a
            delete []b1;
    , r& a9 P' \5 j1 O8 y- ]        delete []b2;

    , x. u. Z' M7 G! F
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , F' ^" `- ?: _5 e8 C+ G
    " e. R6 D& ?- \/ L* F, u2 D; U5 O8 m: F你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?6 g1 m8 j4 e6 n% u* I! k* L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    : Q5 g: c1 @& F. A. i9 Y瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?* D! P# s5 W$ G! Z6 j6 |/ ~& k" U! F

    / n! }2 @" u) }* ]你第二个试验里面的j在循环里面又重新定义 ...
    4 m6 C0 R; w* q/ w( q$ V! ^+ \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL  Y4 M+ t- t( V) m( V2 r
    6 C- y2 O' _/ A
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ! m1 o0 E' }) l! {6 |# A6 G内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 y2 [7 A8 F' q5 r- M
    / ?( E" W: ]3 i9 w
    不和它 ...

    $ Y2 N4 R2 L2 C; c; w
    ) n6 V4 Y0 a/ |' I不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    * R( t* j* r2 b+ a& ]9 Q+ o后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54) J3 J+ b. v5 l6 m6 K" D& v( Y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 c9 U( a1 l' o8 ^9 V{9 Q5 W7 `" S/ r( G0 Y( Q
            comp temp, xtimesy;

    " u. s& g3 Y/ d4 j0 k% c这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    % g* h6 U% f6 Y; v& c内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?4 @( }: V: I3 u; c; u: O# D4 z
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-6 13:15 , Processed in 0.050644 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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