设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
      l: o- X7 y" j+ g% ]& {  O- j* d
    : m7 ^+ ~' U% ?+ L自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。0 k* N- o* b) J) B

    + u3 Z! _& z) e3 C; X' u1 ?9 [8 d速度优化问题真的很有意思啊。
    & o7 i7 r+ e0 K4 R% K5 @6 j! M3 o1 r  `
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?+ A. l  e+ X  n5 g# [
    把代码贴上来看看?
    ; `- Z1 q* i+ f: \% f$ A
    7 e' f" F, l( N. q1 G3 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 ' V2 g0 H/ [" i, d! _2 g3 q
    数值分析 发表于 2022-9-24 23:040 N# ~7 ~2 K/ ~9 w% u
    拉下来?拉多少?
    # w/ R/ U$ |* S( R7 F& j' L把代码贴上来看看?

    7 w: @% G, X1 G  |4 Z" h3 t0 ?1 x8 K, n+ d
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% S3 n7 d/ d' t7 x6 r
    {. ]; O6 J2 e4 d9 |1 k
            comp temp, xtimesy;
    8 ?) L$ X- i" @: u1 W        xtimesy.re = 0;1 |. s1 T: Z$ N" T
            xtimesy.im = 0;
    % z- o" t) }/ _4 D4 W* o2 ^        int j0 = lenB - 1;+ G8 F- d9 @# E7 {' b8 h$ L8 ?
            int    i, j, i1, reali;- I; ~% s6 L' f7 d3 d# s
            if (lenA % 2 == 1)
    9 b7 ~- R  n9 G" R4 u2 B" j  C                reali = lenA + 1;+ B/ \# |, I  Q' l, M
            else
    " X- x: V) l, m, \" k4 a/ O                reali = lenA;
      ~$ A! ?* A+ K- Q' d, [( [1 g+ N        reali /= 2;
    2 k4 A. a# V2 a( k* ]5 ?' q4 W  N8 D1 }6 L/ m/ [) a4 n: @4 h
            int nconv = reali + lenB;
    " \) a. J) ]* D/ B6 o+ E  }        //#pragma omp parallel for7 E3 z& ?: N/ v- D. B0 |5 v
            for (i = reali; i < nconv; i++)
    * X# k7 d% j; f* E2 I- u        {3 M! S, E; K* F8 M9 b
                    temp.re = 0;
    : N. q( l& i& f8 i                temp.im = 0;
    " i5 O- |8 A* g- ^0 K                i1 = i;
    1 Z& }  c0 B" ?- M                for (j = j0; j >= 0; j--)2 E0 Y$ t1 \; h6 e9 z
                    {+ v. b- l- H; ]$ i" m  r
                            /* floating date operation */
    9 ]1 Z! D0 Z) ]" M9 k8 x                }
    ! I( T0 P/ @$ O) J
            }
    ; \* O9 G0 K) ]$ y}, j: }! |$ n0 O7 A* X

    9 O- t: k9 V6 B" }xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样9 J3 N( z2 Y/ u0 b( w0 T# j: e

    # O. \6 Y# c) l8 X0 u红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。3 r" x+ V3 z* e4 j1 O* m& U7 E. M
    现在call xcorr 100次,耗时78s.( G9 V  v" M/ E8 W

    5 x, R1 ], j$ ^( [$ f3 H* Q如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    6 W; D+ c0 W- F% ]0 [  t
    2 E* Z2 @7 n2 S3 p
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ' w! H! [: l0 w" yMaybe Debug mode?

    . Z! ~# k7 K( v$ f8 q# H
    5 a/ G+ B9 s8 r. c9 d# l不应该,看我上面的回复。
    ' }9 @! n: }$ [0 }8 {
    0 g& ?1 w2 r( f. S, T: W: b" E我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    . v7 G# _6 w8 e, ]- D- o& X/ B1 R
    雷达 发表于 2022-9-24 23:54
    2 v0 W: r! {6 ?$ ^0 o0 r0 s) L/ avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB), A' z, A, h/ T. r' s; O% E9 I
    {9 x% c  A+ I1 [, |- }9 ?
            comp temp, xtimesy;
    ; g  I4 b- W# p, s
    9 }4 ?' d6 J- q. B. H
    这个不是这么比的吧。。。, O0 U# r5 k$ r! J5 {7 x6 V

    , ~! f0 @+ d6 b7 Z您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。* ]. ~6 @' N$ ^6 H' a, B, P2 t

      R8 G; S7 l" }( Y6 k4 ]7 U: s/ V而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    & p2 E6 s: W* @
    数值分析 发表于 2022-9-25 00:20
    4 _9 l- a" ^3 G8 M9 u6 l这个不是这么比的吧。。。% a7 h4 V0 i# o- z1 ?/ [

    4 g( O, z& G- |( {- y6 ~, f您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    * b* _% X- ], S/ L7 a7 G
    2 ?! f4 I# c6 y$ X  a有道理。: O" k& I1 X0 ~6 K+ V" |
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ( P3 h/ j2 i% I
    % O8 M7 M. C& K9 N2 Q( l我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46$ `5 n- e1 F( Y: o+ _% n  Y
    有道理。
    0 A. J7 q( P' ]. _% |5 `3 g所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ! m$ s; [) A$ _你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    - ?, f0 z% D% p: B9 \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
    & W8 j3 P: t# ~2 i% ^% ^1 N这个不是这么比的吧。。。
    ' i6 \. i& f/ R- m0 t( t( l: q% l3 I  n7 l: \) X! u6 V4 j# j8 d
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ! n# a) j2 o5 z4 w4 s# z
    . _0 T0 p$ B0 a- D现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
      V4 {, J+ Y( n
    沉宝 发表于 2022-9-25 01:48
    : m% h) A6 L* y  y9 s现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ' ]) f' E0 A6 y4 I3 K! N
    5 O8 C) e+ X* P' T; Y$ t
    是的,兄台说的对。
    / ~- P. c' l3 D- N7 l" {- M$ }) B: k  ]0 u0 |5 a$ D
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% u# t& a. g- D) d

    % U8 a7 a7 \( v4 p7 G雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    1 c5 e# l( h! P
    % G% {6 j( k" n/ D( R+ q比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    - G) u0 b2 T0 P% Y9 Q6 ^7 _& F* v
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 4 H, V8 }/ [9 q, d
    沉宝 发表于 2022-9-25 01:27
    * e" Y5 P8 S/ g你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    % n% |# |: C* |5 z( o) C' l% O
    2 z& A  t: U* c  G7 r又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    : i* W" S+ j( o9 ~4 T! l
    : j: e4 F  e% L* _7 m6 G/ C# x我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47, H6 q3 ^0 D1 C; g) h
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    , R, f2 e6 q8 K) n7 V时间差一倍的结果可以接受。: z0 t6 c: d# W
    " S6 H$ S9 s3 {+ e) K; W# Q. |7 E& N
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 04:43
  • 签到天数: 1942 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 6 w. q5 \& a) @: L! {; h
    雷达 发表于 2022-9-25 04:47
    - I2 p2 [) T9 ]2 H* |6 ~$ z) i( ?又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    - E2 o( K- J% I$ p" T, P6 d
    6 ?3 ]7 d! D1 B; a- L7 Y9 g( M

    / I+ m- p2 ~; x9 T! B3 `' P/ W) I能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    0 N: T6 p: x9 Z2 e5 ^
    数值分析 发表于 2022-9-25 14:58! b8 N* g. J$ o2 j5 P& |+ q8 m0 g
    能不能把这个也贴上来,看看和上一个有什么不同?

    : u" a7 R& ?! C$ t# l6 q理了理思路,重新做了一个测试。) y' x5 F* Y% L3 g
    做了两个 vector 和 两个 float *, 都长 100000
    $ K' f$ X0 ^  q外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 x$ M4 {& M- K  s6 l- d$ A" m7 ~" c

    * ?' L1 B, k3 n2 G( i$ o; l; \4 f内循环试了4种方法,
    9 c, t1 L8 {; d. c1 z1. 直接调用 vector inner_product 247s
    & [* U% L& `8 l6 J) m3 h2. vector 循环点乘累加 237s
    # s! {9 ~% g  d* c+ j3. float * 循环点乘累加 204s, {3 s9 K4 L1 T% g) p/ a- x0 v
    4. 空循环 100000 次 202s
    # x- O$ w% t8 e7 F" D& X; d7 ~$ z1 T
    ( w5 \" c! n  d4 D5 c- W' C: H不做内循环 200s
      {( _( Y: `# }) @% y
      f+ |- ]: r$ p2 @* z; a你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 O* ^% B6 Q5 p9 U3 W- o0 ^
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    & p' k* m/ Q6 m3 Z: K, e/ d8 x, Q7 w  m
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), `: K( W! z: U9 d8 |' M- T

    3 l) @7 W1 Y6 U( n8 g(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)2 M; Z  h$ j3 _- v

    + z/ e( n' n  r0 _
            std::vector < float > vec1(N);$ s5 @7 ~: _+ B% q' i$ y/ K1 _; H& e, a
            std::vector < float > vec2(N);
    3 Z" b. o- b. |8 `        float* b1 = new float[N];: }. F( r, ?$ q4 e9 s. L5 Z
            float* b2 = new float[N];
    ) @% s. a. A6 m8 M1 u- i8 u2 q$ O7 N! _1 d( F% e
            for (int j = 0; j < 6000; j++)5 U7 W  Y  v* @5 d/ [$ q
            {. b5 }* T7 S& v$ T' l4 {2 ?, L
                    std::generate(vec1.begin(), vec1.end(), []() {; r& |  E" H6 `5 Y7 F
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    2 @  t+ W% I* e; b; h  d7 ?$ H, y                        });" R* F- C$ x1 t( P
    - f$ Q8 Y$ v; N: u
                    std::generate(vec2.begin(), vec2.end(), []() {
    . H7 Q1 Q: s2 H9 i7 |8 }                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 y  D6 q5 F4 p8 n                        });
    % ]: L9 D# a- h! u8 d- R6 u) \3 k/ q- v# B
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    : n- p7 S, M* x8 p                {
    ' `3 T' B1 @5 P3 W( A                        b1[jj] = vec1[jj];
    ! p0 P- q! z1 ~; S% B1 D6 p/ e( Q                }
    7 L' F; h$ u  K! @& s# B4 |
    2 X! G- X. B- d% n( b. o$ a  l                for (size_t jj = 0; jj < vec2.size(); jj++)
    - y* g4 d# V2 O; V; ~9 H( v$ ?                {
    4 T5 o! Y( C. b0 g4 i1 d                        b2[jj] = vec2[jj];
    5 V/ x& x& h- ^  Z/ g                }
    + f3 [3 s' U2 G  i/ Y% m
    0 t. X8 n$ _0 m4 ?* P                //Method - 1  N=100000 247s  4 K( P( i0 f* Z; K8 W# T
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    + m1 u/ c  k  @, |2 X7 O$ X                                
    , N7 x2 p. k6 z% U, |                //Method - 2  N=100000  237s- ~, c7 G' s( n
                    /** r! r+ V$ [8 W# |  h5 U8 l
                    for (int jj = 0; jj < N ; jj++)7 {% i' e6 C$ N6 [
                    {
    0 X8 I' t9 [' B5 N' m& D3 r                        fresult += vec1[jj] * vec2[jj];8 ]9 a4 I% m- E4 E
                    }
    5 q6 }1 F6 q0 Q6 |5 P                */2 K8 w* |4 I! |  W8 T
                                    7 V- a* ]% Z3 c! }- J6 l% u
                    //Method - 3  N=100000 204s
    4 d% m* j+ |! E                /*" T, H6 Y! f& z" D  Q6 W
                    for (int jj = 0; jj < N; jj++)
    ) |* u6 s9 C8 D- P                {0 K) y( V* {) ?2 H' v
                            fresult += b1[jj] * b2[jj];
    $ _7 T) ?$ a$ X( x4 }                }% T, S# X4 B! Z" z+ m  r- z) u1 k
                    */
    % |8 s6 i7 r( ]4 c* D2 @& T5 e
    8 Z; I- a! ^# F$ D, S                //Method - 4   202s9 y( m" {7 S1 G3 `+ o( ~2 ]; S
                    /*
    & f2 Y& [- X; b, {7 h! C                for (int jj = 0; jj < N; jj++)
    * k* B8 ?. Q* L5 ?; _                {
    6 f! [6 R# l5 l1 f+ J5 a7 M% e0 m7 k                        : j' R9 C9 C# B
                    }: V& @) w/ |3 o3 p6 _( T. S
                    */
    4 @6 s1 r, q2 t6 m' u- D" P, w                //comment out all methods, N=100000  202s               
    , ^/ I7 T" W" z        }
    ) `+ |8 l6 A( x5 R' E" d* T/ w' L/ e$ u0 e- m" i
            delete []b1;
    # e- |7 C8 Q9 g, P; N! U3 p        delete []b2;

    ) H9 Q0 M- b# |9 c  }# Z
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( q( x1 Q6 Z; s$ e
    0 }& r: ~8 N% r- n7 _你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?4 G9 J4 v8 h/ J" S" G
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:153 [- S" M* K  j9 j# W
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , S' G$ `( s: m7 k; {6 N/ a& A( E: V+ D
    你第二个试验里面的j在循环里面又重新定义 ...

    5 f' ^# V9 S- o! P8 x( i内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL* \  \  d; c. ]. q
    ( V5 _) M! x0 S; |# P
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16% }7 O  D0 y4 @6 m% q# I
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 I- J5 `5 _9 A6 S/ u1 t

    ' B7 O7 ^- _( q, i1 Z不和它 ...
    + B; l) |* `% @( o+ F$ p

    ! {2 c$ {* |" K, M- }7 u不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。6 {% J4 W# E* W! F' _
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 n9 l4 d$ g1 E: F: J9 W7 wvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 `* A) S" @9 K4 w{
    ; u# l  y" ^# C% j6 A& S        comp temp, xtimesy;
    $ L- H( A" g; C& ]4 Z& Q
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。' X; K1 E' X2 q3 ^, k
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
      D& A$ Y) G" B. f; q( |* R) wVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-9-19 08:46 , Processed in 0.060143 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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