设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?% R5 v6 H: x) F
    2 v6 K9 O; x( r2 K! z% n. r, Y
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。3 d7 V7 ]# n5 y$ V) J8 I6 N0 g
    5 R" S2 P7 x3 E; }8 Z% `/ u: j
    速度优化问题真的很有意思啊。
    # n8 J* N$ B, h7 h( Y* b% a
    6 a; L* X4 \' |. ^, w4 a8 U欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    - `( J% F! o/ p( c/ {# O把代码贴上来看看?, V7 Z' }2 V6 a2 m9 V$ z7 e
    % z6 e: o0 K: Y6 [2 M' ?9 j
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    - k  f# v: H8 f; ~
    数值分析 发表于 2022-9-24 23:04
    / V: f% u  f1 d拉下来?拉多少?
    2 y0 C- M" _, p2 a# ?3 }把代码贴上来看看?

    $ @5 p: K" a8 D' R' t+ w* d0 @/ y7 d$ F& |, y; o# R0 c
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    * `/ _/ I! l9 n4 _& j( Q, q2 o{
    + a. x0 x0 F: i9 b        comp temp, xtimesy;
    8 ?0 E7 I' B7 K$ f% J7 B) ]        xtimesy.re = 0;# j; d! s5 g2 D. Q: l% X
            xtimesy.im = 0;
    * a: u9 @9 H9 R        int j0 = lenB - 1;
    : R) n- i+ L( f" `! k5 `. W' P        int    i, j, i1, reali;* }) P' Y/ K+ D* ?. U: w
            if (lenA % 2 == 1)) a/ B1 u; K& G0 q+ h" y) K* o
                    reali = lenA + 1;5 B$ U- S% x. X
            else
    0 ~& }" l1 w4 Q1 H" F9 x: D& l: `                reali = lenA;/ z- c/ [' \% I6 |, a
            reali /= 2;+ ?- N" k( \4 P) A- |5 v! C$ I
    : k/ Q2 u/ K9 l% t1 k
            int nconv = reali + lenB;/ c% z* Z; \9 I* Q
            //#pragma omp parallel for# R! B  k% \0 M& e/ d
            for (i = reali; i < nconv; i++)
    " B, Z' z, s, w' Y        {
      U3 @( y+ o, o0 ~                temp.re = 0;
    1 [9 o- r0 ?  d0 h1 G! b3 W3 D                temp.im = 0;
    ) s% D) s1 ~' F$ F+ r- c, ]4 q                i1 = i;4 g1 Z7 w7 s; V: r
                    for (j = j0; j >= 0; j--)
    : \# u. x' X2 _/ o9 f9 v' i: c7 x                {
    2 X6 @" K7 t, F" V$ M' A                        /* floating date operation */
    , a9 X) m* r& Q  I) k6 l4 r                }

    : Q; [% S( K0 t* @2 z        }
    ! |0 s( _; o/ j3 [: R}
    ) R2 U1 s, o  Q7 c4 P# R" ]0 E* Z8 {- L! T/ u" J( A
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    1 ?7 F+ j" T: S: `  j) L  m9 o2 ^$ C' l+ ~' d  M9 x9 g
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ; O) F/ Z" B  B5 M/ \( [  ]! }现在call xcorr 100次,耗时78s.; {0 u/ ?" b  w  s: @3 ?  J
    5 C0 }4 X: S/ G7 W
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    2 q/ {  D) q2 k
    ! B/ C! |+ P2 V/ u! o
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:338 I: ]2 v% h8 }
    Maybe Debug mode?

    0 z$ `/ G( n% S& `0 l$ d  f, [" D9 t1 I" Q4 r* o2 K+ r( J
    不应该,看我上面的回复。
    ) P6 F, w: H& i6 p  h  R# n  ?( \. i0 L( ?- N$ E: u
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ' `: z/ [5 ?$ [& k9 B5 N" R
    雷达 发表于 2022-9-24 23:547 s$ N! D9 L; V5 ]( R
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ N8 l8 n, B5 y( ~% X' K
    {
    3 E+ j0 G4 @# l" K& j# ~        comp temp, xtimesy;
    + k2 U  \5 L% y& o' B: A& D

    " a) G$ M" d4 y这个不是这么比的吧。。。0 p' f7 K" r( @0 ^) M
    . o- B' g4 u( y4 T/ X* u  o5 W0 q  m
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。' G1 O, L/ W2 U5 m% t- Z
    $ d6 ?* \' X9 S1 N
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
      e& v! G2 p( @4 Z: m) j
    数值分析 发表于 2022-9-25 00:20
    # w1 i- m. w& T0 Q8 o, S( }+ U这个不是这么比的吧。。。$ H8 _' _3 U6 \% W" q9 ~/ S
    / E8 Z1 _6 M1 f: r* j+ s
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    : Q6 M( N. ]! L8 @" v4 @+ s
    * f! N, m) F4 A4 B% s" L, Y有道理。' Z9 h5 J2 Z1 h3 M* v9 q5 Q
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    , d% b6 u+ ?+ A' Y' k8 F7 g7 O. k, i# v: v
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46% u$ }9 k4 z, h4 F
    有道理。6 z6 h! r5 C2 n" Y; Y- A
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    7 u- [* n/ n3 H  ?; B4 I$ ^
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    3 B3 @5 C3 u7 u4 l" m1 NWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    " {$ U( ]  x  ~% V这个不是这么比的吧。。。0 ?& c5 A# n& G9 _0 L% ~3 n
    1 a& X7 l! \( J: |. n5 ]
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ) q9 A5 s! D8 I
    . a+ f# K' k7 X# y现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    2 a& ?# L3 K1 F
    沉宝 发表于 2022-9-25 01:489 U! Y+ r$ Z. W  |: j  W
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    - y! J4 [$ q9 {1 g9 [5 r. b
    # J, g4 I2 t, J5 i. i  G, E
    是的,兄台说的对。8 U$ d2 G3 E' W

    : o9 k* R) ^: i9 C2 T" F其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。; _+ k2 n6 H! p$ \& Y
    * t  b, \6 k0 K; a
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    3 K' I: V- B& |- v! \" G0 v& a. y, ~
    ' C$ f$ S# O& `; c比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。3 w' ^* F/ y; O5 G& |

    ! U' n5 N6 ]  f* u2 D& r/ U当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    / l4 I, C: C" L& W
    沉宝 发表于 2022-9-25 01:27
    , X4 z% J  J5 _8 c" b' L你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    3 e1 V) ?% ]7 ?0 K. z! [9 N

    + k0 }! H4 s% u0 G$ `6 p- x又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    : A4 B% J  k( ^( z, X
    $ S; V6 V# A: r5 b% N我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    * G, C; e+ w& U4 a$ P时间差一倍的结果可以接受。( z( M) ~2 D% z( b! l
    7 N5 E0 e! x& Q. ]" e
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 " O6 I6 e& S/ `
    雷达 发表于 2022-9-25 04:47" f4 Y, u# H. a- ^9 z0 Z  ?9 {5 L) W
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) N# N# l2 Q  K
    7 a$ @2 ?/ r; r4 K( g( }5 i# M: H

    % ^- U; d& t9 L4 ?
    ! T3 A0 i& C3 E1 g0 D能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    5 W, `1 i( p! f1 L
    数值分析 发表于 2022-9-25 14:58
    8 |1 r+ I! O4 `+ V& L# g4 k, S能不能把这个也贴上来,看看和上一个有什么不同?

    ' u+ c: h% w5 a  b& s- C! L理了理思路,重新做了一个测试。" x" r# B2 J2 s2 W6 h) _  V
    做了两个 vector 和 两个 float *, 都长 100000
    + v6 y1 |7 A% s) [  \" p外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    6 R1 y% o. T; ?3 t+ r# ~+ o
    % P, v0 k" d$ Z内循环试了4种方法,8 C# {" Y% U- C* Z- E0 n
    1. 直接调用 vector inner_product 247s 6 z) i& |, N* |4 U' ~
    2. vector 循环点乘累加 237s
    , k4 D& ^) ^5 Y# {) ]% x3. float * 循环点乘累加 204s+ T; Z& W# J6 \8 l) P7 Z1 [
    4. 空循环 100000 次 202s
    % \" }. [* S( @, I  ?! v  M' H7 E7 i) h5 T0 {$ S& _4 D6 Q$ s
    不做内循环 200s# y* d% v0 ?1 B% v$ n. f! j
    ; f, d6 u: m0 c8 @! O0 `
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 l" @) v; ^. z, q/ s4 X' p' Y; j
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ; S$ l0 y+ _: b) i! l* S/ z
    ! V; l9 T% o+ r1 B, J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): ^, @; M; D$ x" ^# T( y
    8 v; J$ |% X4 C' y' q( r, Y/ h
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 n/ z9 A% ~8 m0 Z- g/ z
    + {. b" K  X' d' d2 g
            std::vector < float > vec1(N);& t" v4 {$ k1 n" e8 F$ i
            std::vector < float > vec2(N);% \) v6 s# d4 i  x; a. c3 Q+ B
            float* b1 = new float[N];
    * U" S1 u( R6 ~; |        float* b2 = new float[N];0 I" K# U" C; K  T/ B0 [+ K; q, m5 h

    / L. B' z* h) r. {) e        for (int j = 0; j < 6000; j++)' o3 }3 V$ B6 u' `' |
            {* N6 B& |! T. M! P  t! c9 x
                    std::generate(vec1.begin(), vec1.end(), []() {- g' D$ l, M; b0 E! \
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    3 i! R0 N* ~- G2 H- \                        });
    % x5 {( g' e( o
    5 B4 Y' s1 f( n4 T  A. y1 G& p                std::generate(vec2.begin(), vec2.end(), []() {" V2 u4 c0 c% e7 y# N) {' G# }
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ) c5 e6 ]  B% T4 I+ g) I, O2 ^' E                        });1 |6 M3 Z; m, v$ E- `2 _# a

    * f( c' ^+ {) h  r9 O% O: ]                for (size_t jj = 0; jj < vec1.size(); jj++)7 e5 O) K- K/ S1 a9 n& U* e0 O
                    {
    % c: M) g; d4 X                        b1[jj] = vec1[jj];
    ; B1 \8 I6 G2 \: Q                }% F  |/ s% P/ e6 }! ~! j4 u3 p

    * V* M/ l; l, M3 H' |% \$ y" @) e5 `                for (size_t jj = 0; jj < vec2.size(); jj++)
    4 `4 ~; ]: C& z7 f5 [5 d                {/ ^/ v- @0 B/ ^1 C, f8 n' u
                            b2[jj] = vec2[jj];+ [7 K  c' w, i$ f& M' e
                    }
    & b* _5 H- T' @1 b% L. w
    % n8 k5 i! f! d. ]/ [                //Method - 1  N=100000 247s  . E& a# f6 Q! L+ \8 B$ h: D! F- p3 l
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- @. t, O3 L6 b( n0 i, U
                                    
    ' Y4 p) f* B+ w                //Method - 2  N=100000  237s* {" x( H; J5 L" ^0 Q
                    /*
    0 N4 E3 C4 k" K  A                for (int jj = 0; jj < N ; jj++)& A6 t% J- z3 c+ W6 K
                    {1 W+ {! R3 o2 ~* V+ O3 u6 E- C( ?
                            fresult += vec1[jj] * vec2[jj];
    5 e, p: n, B. O6 J$ {6 R" d                }* k8 s! a2 H* T! G( Y  b- T
                    */
    % U7 b9 G  i8 Y. U8 f" {! \                                ' P8 |" G+ c* c2 C0 ?  t! S& y* K
                    //Method - 3  N=100000 204s
    $ V1 F2 b. R* h                /** |& s! W& k4 Z+ g
                    for (int jj = 0; jj < N; jj++)" U6 N4 c2 a1 Y. O9 h: S1 u
                    {' J/ K0 v  y5 y+ z
                            fresult += b1[jj] * b2[jj];  Q" d4 _+ A/ R# W# D  p
                    }0 z$ ~2 ?$ q2 L2 s  u
                    */) s5 h  Y: ?0 X

      |1 ?0 k, j3 H: b: |) `                //Method - 4   202s
    4 G4 R4 E) t) D" X5 ]                /*$ k  s& W* R9 w% h9 x/ S
                    for (int jj = 0; jj < N; jj++)
    9 j& n$ I& w6 j7 {, b3 {                {( I4 E% `" t. @, W' \6 @6 d/ \
                            
    ; s* o" l' m5 [' a1 M- ~                }
    : `; Q7 a: L4 s1 o5 f* d                */
    , Y: p+ B' N& Q                //comment out all methods, N=100000  202s                $ R" ~" `' R7 L' h  E: C
            }  F& }# {/ J$ p

    * q# m! W; W& q: i' a1 \        delete []b1;
    & G  C; m; o2 v( u        delete []b2;

    . W" ]. h  i6 L, n: X
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 I- Z& f1 s6 t% a" C1 I% n
    . E5 p9 u/ X5 I' p$ {8 ^( W
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?- s1 x  w/ k. k/ }5 b
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:150 [& u1 J( T. Z3 a
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( Z7 ]# E6 u+ y: f' j7 L

    1 O" ?! y& [$ C" C你第二个试验里面的j在循环里面又重新定义 ...
    * m* Z; H8 ?  F6 m0 G' Z8 I
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 d8 b; O% m" `& z6 i- I* e' N+ E8 X8 i6 Z/ q. ?0 ^. N% l
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    / a- J' p: U; h9 F* e+ K内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& L2 {, i0 w: N4 ]( E

    9 q( M  @6 t( j% R, Z  z: o0 x不和它 ...
    - d: h. A0 |5 w( ?$ G0 J
    % U1 @5 |# }* j- w" n$ L
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。9 n0 h2 p; W; d# E. t
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    1 s0 \/ n5 t$ t' [( y3 ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) c; ]" t* Y7 C6 y" u9 t
    {9 s  x  x9 ~. t+ ]. H% X0 S
            comp temp, xtimesy;
    & S8 V! h( ^( O6 Z8 J- U
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。# B5 q. A# f8 n# m4 z! K
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?! o1 q7 Z- [/ e# i( r
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-4 05:45 , Processed in 0.059123 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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