设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    , a" P. ^( N1 o5 R
    0 v4 c9 r5 E- E, C3 A: T: X自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。& F- m% ^1 H& u3 z

    " s0 ?* F! U' u+ i/ F" k速度优化问题真的很有意思啊。
    : Z7 J% D! F* O8 T+ }0 a4 N/ w  d: _. x( k8 _( q& z
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    . X4 y. F! h% M2 q- ?把代码贴上来看看?
    3 ?' e5 s# y2 C: V8 b% k& ^
    * u2 O* V" r/ h0 ^1 M难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    4 m1 |7 ^* v  a6 y) w4 F8 t- z5 b5 K6 C
    数值分析 发表于 2022-9-24 23:04. _! R( k% `% S" z
    拉下来?拉多少?+ i, e7 D1 s2 a. H# i/ Q
    把代码贴上来看看?
    ! Y5 p/ m- V% T/ C

    3 L, I/ m+ c" y5 tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 K! r8 c( V3 r/ Q4 d! r
    {: z. _; d/ ?2 i6 j) i
            comp temp, xtimesy;5 Y# |* {  L" L9 W# v
            xtimesy.re = 0;
    # c+ a! t5 w4 K        xtimesy.im = 0;, x1 g( G( A" a7 ?9 w
            int j0 = lenB - 1;6 k: h: b) |9 Q# j0 T( m% M
            int    i, j, i1, reali;* s6 z1 q+ u# v7 l
            if (lenA % 2 == 1)
    - ?. q' o7 U$ P, K; v- N                reali = lenA + 1;* Q: ~- N: N5 ^2 @" g# r
            else
      ], t  m. [0 r                reali = lenA;/ t1 A7 ]. E6 N9 k" z
            reali /= 2;
    $ }0 _! r% g' J5 i( P6 Q
    & P  k. F  z8 |( H0 ~# j" g  G% m        int nconv = reali + lenB;3 t+ q9 r* r4 r4 ]6 o7 b
            //#pragma omp parallel for
    ( e5 X" L/ J# V7 e. _        for (i = reali; i < nconv; i++)& z; x% h6 @$ l1 e$ `
            {' I% `- N+ i' d' n" @% G
                    temp.re = 0;
    . x' n0 p+ |' l                temp.im = 0;
    & q0 u# v: @: c; L) T                i1 = i;/ g$ v0 L# _6 R
                    for (j = j0; j >= 0; j--)
    7 l2 }4 {/ D% X5 M6 v. ?4 a                {" ?5 t, I* e( ~
                            /* floating date operation */: ^( s0 n# Z0 U+ ?" c- h
                    }
    5 C: ]2 u: u8 @2 u
            }' T  Q3 M& ]/ q9 j
    }- F1 o5 j4 F  G7 M, Z2 o

    4 |; q; n( E2 M5 excorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样/ x! \& L0 |4 Z* ^6 C8 k0 Z! K4 i

    $ k0 w9 ~; ]" m红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    7 k5 o  o5 z, U; w; U9 @* I! f现在call xcorr 100次,耗时78s.- G3 ?! e# [9 Y) V
    6 j* a1 o  [2 G  y( u7 |1 P
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 1 c' g6 K- p4 L- r- b$ X

    4 g8 x! ^, w) B5 O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33" i* Y" @( W4 |% g$ S
    Maybe Debug mode?

    & t, Z3 q, G, s! N" r) B
    4 `' n, g7 _1 a8 n不应该,看我上面的回复。
    $ r. a; m, X1 j$ a: `$ r* l& H3 q
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    # r# Z3 R7 Y7 V- V) s4 H8 q$ J
    雷达 发表于 2022-9-24 23:54
    8 W2 s" I8 K# I- }3 Y& ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    - c3 [& ], q$ y{( J" Y4 {+ J! Y( V9 H
            comp temp, xtimesy;

    : H( n7 w, g- s3 F* k2 C1 H
    ; h+ M  s' N% D- L" m8 c4 e3 j( y+ j这个不是这么比的吧。。。
    : a. }7 {' l, L0 c* o, ^% L: z5 J1 }1 Y* q% q0 K
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      w4 t' A. @8 U( n  c8 ~
    $ {; T/ E: t, A$ z' n2 B而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    8 c- N5 g# b2 }  n- B# l+ F) d# ^$ ~- w
    数值分析 发表于 2022-9-25 00:20
    , z8 J# p5 E# b# P这个不是这么比的吧。。。
    ! H. _  ~; V: `, R
    $ Q  s! ]5 G8 a8 }您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ) Z, S3 A/ Y& B6 t& y
    , |* z+ ^" R& h" u+ y5 C6 i" s
    有道理。/ {: e, M. M3 l$ C. ^
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    * h& }; F4 D& ]
    $ J# x1 u" A8 k我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    7 D- Q3 G9 E# D. p有道理。
    ( X2 K& s! U1 l5 e8 x, `所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    " y# p- q. j" a2 h! E3 D你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多" t3 D9 e/ Q7 x; i3 u
    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- M& H8 E& V; }' d
    这个不是这么比的吧。。。; H0 v0 f# K- E6 {, {. L* u9 B
    # E. k2 Q; `( v6 t
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    5 S# c, H6 z. X" ~( G9 x5 o8 @  u2 u0 a

    1 e/ q( @8 p2 J2 T5 j9 w现在的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 编辑
    - }& t' p" Y& u7 [% S1 ?% O
    沉宝 发表于 2022-9-25 01:48; |" w; m2 A* Y$ O
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    4 O- B0 u: J0 `' b0 H+ Y9 G6 a1 a
    / f! v0 u+ e- K# U8 {
    是的,兄台说的对。; d: g8 r+ b5 c( Y! I
    * i( |  w, @, L4 L" X
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。- C$ i: {2 J; n9 s
    ' Z! U* N* c9 z8 ?
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。$ l; z% |+ t' Z$ y4 E3 C% E
    1 U: Q, A" A- W3 V; y" \. I3 w8 P# c
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    4 i! c! [" U1 {# t
    # M7 Z5 B4 e' j, `, s* z当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑   {4 S/ D% [: B- t8 e) Q* Q* Y
    沉宝 发表于 2022-9-25 01:276 J; O  E  ^7 D- N4 j: p/ z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 J4 @. _7 g" l% `" n. L' o8 I+ L
      j! r& A5 b* r3 O! l1 o又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。/ L1 I( s9 ~. Y7 p9 w+ l+ I( F
    0 \. v: Z" O3 G3 z: ]
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:475 v  y2 N( V' y  C9 g
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    & N2 v9 `% F' o, }, A" P9 @
    时间差一倍的结果可以接受。
    4 ^: O1 q" ^, g* X2 b/ ?9 f# ^
    : }9 ^1 Q1 `* A" b$ k/ [" O# r' x你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    4 Z9 n; l4 f7 M1 k+ B
    雷达 发表于 2022-9-25 04:47
    + t& Z7 B7 A7 g  y$ g  H又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / I3 `+ }" Q8 X( x6 l' y% u/ y; e9 }7 `

    + f4 D3 V! n" u( I
    1 j5 a# n* I# s5 ]7 b能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    , r- s1 m3 H$ o& U
    数值分析 发表于 2022-9-25 14:589 p) [5 b7 l2 G3 W$ ^3 W$ E/ g
    能不能把这个也贴上来,看看和上一个有什么不同?

    * W. w" K1 d3 j# X7 b) e. c5 l+ R7 x& y理了理思路,重新做了一个测试。, p9 b1 u- R# y# v4 O' D+ D
    做了两个 vector 和 两个 float *, 都长 100000
    ! b6 t. |: N0 b9 J3 \外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., u- g% I7 V( ]' m7 c$ n+ b, Q' h  R# P

    ) K' P& R* Y9 r& |7 H内循环试了4种方法,
    % g' v- j# e# n! o1. 直接调用 vector inner_product 247s ( E6 Y' z$ @) o: w$ M
    2. vector 循环点乘累加 237s
    # T% F( `4 x. w" c& y3. float * 循环点乘累加 204s
    * [' ?( _0 h8 z9 N" O5 W' V4. 空循环 100000 次 202s) x; L8 `2 C+ j) u2 Q9 j. [) y/ @8 I
    2 h( q7 O8 P' a8 }* C
    不做内循环 200s: M7 D+ J2 m2 D) |

    7 f, |0 T! K- E; N# ]$ L* K你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 e% J1 l* l3 \( K$ w
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    6 U$ o# b) e; ^2 Y7 _  H+ ]$ u" D
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" v' P9 ~4 ?2 Z
    ( X" ]$ t  t; I+ i& a
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    9 E' j7 h7 \" V2 f/ B$ ]7 e
    : V( x, C& s6 E
            std::vector < float > vec1(N);
      J& A# |( `1 V        std::vector < float > vec2(N);
    8 P6 g- w( H  V$ i        float* b1 = new float[N];6 Q7 ~% N$ J2 R) Y4 F2 W
            float* b2 = new float[N];
    ( a7 D+ g( z* N* e2 i/ I+ A' @' p- C) v# Q3 g( p& z- }
            for (int j = 0; j < 6000; j++)/ Y9 K: h5 n! v- G" S8 Y- O. R: v
            {
    8 M5 q& d+ i( f9 B- j( ^                std::generate(vec1.begin(), vec1.end(), []() {" |' n; i1 W8 L* s9 X, e% k
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 m6 X$ v5 C9 Y" t/ j) F' M
                            });! n! D* a) p! A
    ; l+ s. W. P. w$ c3 v+ m
                    std::generate(vec2.begin(), vec2.end(), []() {
    0 a6 S& V2 p# m: l                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    1 Z( K3 f! p# Y: e                        });
    7 y. e: L$ g+ M& p7 d* u: O3 o' R# r$ A. q+ |$ w& C( A
                    for (size_t jj = 0; jj < vec1.size(); jj++), [0 i5 L% q+ g" A) G- U0 n
                    {
    & Y4 }5 f4 ~3 C( Y                        b1[jj] = vec1[jj];
    : {! S' I; k6 U$ o  B' {                }, ~% H3 k- c- V/ a1 \/ R; q

    $ r9 o7 t5 d  k                for (size_t jj = 0; jj < vec2.size(); jj++)
    1 H/ O# i6 G; m+ l) l                {
    ) L( K" F$ p0 m! x4 B5 U" U. K+ ?                        b2[jj] = vec2[jj];% x3 h4 R0 E7 l0 U
                    }
    ) t+ T: C( B5 O8 @" D. B. U
    0 g% m3 a$ a' R) ?- i* i9 C                //Method - 1  N=100000 247s    g) I7 f$ Z9 ~! |5 }
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);  D3 e9 e( |. e6 }( U
                                    
    , {, O* A5 A5 S$ E2 Y: }  h5 d8 @                //Method - 2  N=100000  237s
    7 q$ L7 q# g2 U$ a/ i% _6 S                /*0 g! ?/ J5 l" |/ j2 F* B
                    for (int jj = 0; jj < N ; jj++)
    0 n' M7 a3 r2 N+ U& d+ X1 U                {
    ) `' @0 i. [! M2 n  J" m                        fresult += vec1[jj] * vec2[jj];7 i1 M: W7 s: G9 t# ^4 P) ]
                    }
    " c4 G: T# D) c; [                */9 p' \9 H+ C8 y$ ]
                                    
    - S/ c8 S( }5 |0 _% @                //Method - 3  N=100000 204s* _, X5 `- D! x9 T
                    /*
    ' k7 W" |% V; ^/ ]' T                for (int jj = 0; jj < N; jj++)0 V& j6 R8 F6 p" X
                    {% K/ U% `! c- E4 C
                            fresult += b1[jj] * b2[jj];4 F- ~6 V% `) ~; W; K' B$ @
                    }( V! I: r! O3 }3 a( g4 V
                    */- O  {1 z$ V1 Y' ~( A0 W
      K$ I" [6 _4 p0 p0 n: `9 P% e
                    //Method - 4   202s
    4 S# \% P* _4 G$ @$ C# `* z                /*
    ' M$ F( }8 ~6 r; t% d! Z                for (int jj = 0; jj < N; jj++), i# T  r1 I0 r0 s
                    {& ?! a& m9 Q2 R4 y5 s9 b3 ~! f$ @
                            
    ! }$ i2 Z* O) p+ Y                }
    # b( ~/ {, w3 M" u/ [                */* R# {; P1 Z6 C: X' J3 {
                    //comment out all methods, N=100000  202s                : N! A: S) W3 v, E- L
            }
    & i! \& }4 @, F' g8 ~6 x
    * B; W, S) Y$ A$ f1 Q        delete []b1;
    / i( f# J8 P- ~0 G1 t. n) |        delete []b2;
    : @$ G: L' B) T: R) \' W: w# U1 ^! [
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 [6 ]# b+ A: {/ C( p5 |* i
    / O5 G4 T7 S! L% d: q9 f
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    + L" E; q$ b! m( P
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    + j, P. z2 M9 c! f* J7 U瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    * p: \; o9 V% n- ?1 I5 I# ~
    . k2 ]/ k/ O* I' S! R! E# m5 |2 }: l你第二个试验里面的j在循环里面又重新定义 ...
    2 M7 r: w8 b4 @
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL# M7 l. \5 v5 W. z
    ! v! l! Y& c. N9 p
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16- H! {7 _$ g' b4 C' A! L! d! H6 V
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    * `# ^) {9 x* m8 z) V/ ^4 ]$ |4 C/ R  u- G8 ?% C- ]
    不和它 ...

    # ^3 z: S6 i8 R3 i% r* \+ m- `% N* ]+ k" V5 ]$ h& T' S) \3 E& J
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ! _0 Q3 P6 `9 @* K后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54: R6 |" t& M' N; c) N$ }" M
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ W6 Y$ i/ d; N. J' r/ h
    {
      x, O6 O2 x# W# Q5 c7 ^        comp temp, xtimesy;

    6 ]! P6 v% G; D+ o这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。. M  O! F+ t+ e0 b) ~( R4 P( M
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    $ F* ?  O9 ^) K% s( bVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-25 08:28 , Processed in 0.069882 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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