设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?; C( A, ^* K, j5 u8 R

    ! I5 D5 r9 |3 }8 g自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    * t4 t" t9 r3 ^( q" G" S  W% c; z( [
    速度优化问题真的很有意思啊。7 i8 |3 h' g* T3 I
    ) \! R- h! {! O  v
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    8 i$ m: l9 _: z% m/ p; l把代码贴上来看看?
    " k8 c5 ~, M2 O0 [$ m
    3 U  p6 A4 d6 x+ o, ~6 y' N8 B难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    8 Q/ {, Z" h7 x2 [9 I3 f
    数值分析 发表于 2022-9-24 23:04
    6 Z+ G/ X% t) F* R" i9 x拉下来?拉多少?
    ) ^3 f( C3 m2 H% i把代码贴上来看看?
    6 b2 S6 v) F. u# r% d9 y
    ; G* `$ ~4 ~% ~8 _+ w3 Z5 p" Z4 i6 P
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    9 T/ x& b: z- r- v* Z8 K5 I{
    ; e% A3 f& w; ?- Z7 ~; v+ r+ ?        comp temp, xtimesy;4 K0 U1 u& _# }1 }
            xtimesy.re = 0;, \: m8 t8 M) H- ?) Z4 ]
            xtimesy.im = 0;5 U! m* R* t5 Z, s
            int j0 = lenB - 1;% b* ~$ m2 b+ e$ L  p  q6 W
            int    i, j, i1, reali;7 Q6 J2 }9 Q& x8 U
            if (lenA % 2 == 1)
    2 ~- N! V2 C* k# I; o( i                reali = lenA + 1;
    6 Y8 s. I) `6 x7 w8 q3 Q" O# f        else
      S4 x9 ^3 U; c! Z6 S                reali = lenA;
    ( H4 k, m; y0 E/ U# g        reali /= 2;
    2 ^# Z8 L8 \2 E3 c0 A* K( E! G8 Y3 u
            int nconv = reali + lenB;
    % H+ o9 I! \* r9 S+ T) i/ U        //#pragma omp parallel for
    + K: o4 K) Q, {" Q        for (i = reali; i < nconv; i++)' J7 h" E$ s$ t) M" w  T! b5 a
            {
    * x; z* m4 X* l                temp.re = 0;% J% K! f1 H0 C& j/ `& X' ?, ?
                    temp.im = 0;) u5 K2 J; ^- T6 \
                    i1 = i;
    ! B: P; i) C& h                for (j = j0; j >= 0; j--)
    9 `0 {- O9 p& s                {( a1 Q  b& g; G3 X: ?' P( b
                            /* floating date operation */) Z( e' U' _7 x+ x
                    }

    ( ^. }: m9 }) p0 B5 \' m        }
    3 A" Y2 _" C+ ~  D8 {}; V0 r) r8 Q1 P1 r& F, |" r

    $ P) F) l- Z& X* kxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    7 r: b8 x4 G7 J) i1 C: S! H6 J: }, y. u2 Y( U
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    4 ?" F. C; i' g9 b现在call xcorr 100次,耗时78s., @0 d, `. t& ?, {& Y# b4 k

    : s; G- ^9 m1 w% n* U如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    7 N' u5 ?4 I6 G9 L5 O6 u$ s+ f
    + p2 o4 d* a  |3 G
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    % q8 E) U0 v. xMaybe Debug mode?
    & j$ P4 w; o4 G( q% _3 a
    8 E: v" Y2 {+ n, b
    不应该,看我上面的回复。- O7 s& ?" X, d2 Y+ d  s; k

    4 i( r6 d# Y9 _" t1 y  ^$ \% f我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 7 m6 d+ e! c' E$ n( N  H/ f
    雷达 发表于 2022-9-24 23:54. U7 D, |( O! B- l; s: o
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)! Y, f* T+ w$ y4 v# M' O
    {
    5 x) r" C8 L: @        comp temp, xtimesy;
    . ]! u. u8 ~! U8 C

    ; H  s$ M2 N/ A" s这个不是这么比的吧。。。+ I) M5 v) T" j0 u
    7 ]' Z2 b9 [4 k2 ^$ i
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。" e% y# H9 B1 ^, |) ~
    * M: F) K* q" I/ {0 D$ G
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ' Y. t) s+ E6 n3 W
    数值分析 发表于 2022-9-25 00:20
    / z+ D( R/ ^9 I' n这个不是这么比的吧。。。
    ( s7 L! y* X0 O; @" e$ W, c( E" {1 g3 V( o1 Y( M
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 ^6 D# I5 G- ^* r
    % ~. e8 [" \" D' p
    有道理。
    ) W) T2 @: z" I4 S( R所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。( s7 l" S# t/ ?9 h- H

    7 K8 k( C! P  i& Y6 ~3 I我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    7 _% t* B7 \$ @+ G有道理。
    5 ?( @6 K. k) N8 Z所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    1 _6 [5 }! N4 x7 N& Q+ i
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多& @3 m. d  e% R! O3 B
    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
    1 V+ `% `5 N' j这个不是这么比的吧。。。# l% C. t5 P" W5 F
    / W. z' o$ R( O% l4 D, I
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    * Z' l2 [. J7 E0 c/ Y+ q& @0 ~+ s0 W( q) @* S+ a
    现在的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 编辑
      }/ B9 r" n+ x8 g( t. @
    沉宝 发表于 2022-9-25 01:480 o: n) G8 u3 X; b& y
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    4 A: E4 c) _# {  B8 i/ F: P
    5 K7 `4 a8 B" Q9 W" u2 ^$ j. }* }, _是的,兄台说的对。
    # f+ X2 O  J7 `6 p  n4 K: _
    / A2 ?6 G+ y' G1 ~8 x* a) i其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    % ^6 ~) o6 B3 i+ g. O& p! O  m5 B2 O/ M2 D9 r$ B0 O
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    * H# q6 V' X. h- m6 i7 _& t1 I- [. ^4 F0 ^/ F
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。. N6 {( T, c9 v4 {; U6 D. ~

    - I/ b6 _3 ^$ Z5 b1 R当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ; i% ^; n& C* H: i2 j1 O
    沉宝 发表于 2022-9-25 01:27& o% j0 r; g6 l- w9 x6 p( t
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    7 b/ Z: d/ S( m
    3 X7 E' f9 T" N* T0 I9 j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    + b0 ]2 I* l$ q* N6 q4 M" S; B
    / e; _/ \$ Z" R# E我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
      n9 X3 z8 _$ i$ C: v; R8 _又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * x* f% z' I; r# l
    时间差一倍的结果可以接受。6 i5 n; Q# W9 i9 ?; u/ i% V8 O8 F

    * U7 v* |& I- G7 _; w) z# G你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    3 P5 i' s  t+ i- B: `" f' M
    雷达 发表于 2022-9-25 04:47- K) ]) l- @4 V) U4 P% q" h9 n+ |
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    # k; R; r* B; y5 n+ m: Z& A: ?' r; }( R; O; a" R' Z4 \

    , l; O. ^+ y4 Y
    2 W. g& q) Y: h* O) D能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 & p; e# {3 ], i- a9 g! Q* V7 ^& P
    数值分析 发表于 2022-9-25 14:58- G, g% u& `; S1 U3 c% p4 Y4 }
    能不能把这个也贴上来,看看和上一个有什么不同?
    3 v( `. X" Q8 V5 Y# {; R$ R. ?
    理了理思路,重新做了一个测试。
    % B) j$ j, `8 x0 w做了两个 vector 和 两个 float *, 都长 100000, Q" M/ _; v6 z  K% f% C# D7 |
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    3 Y+ {" z2 ~- }8 k. `( L# V0 b; N" j
    内循环试了4种方法,$ k0 w+ ~$ v8 q1 h
    1. 直接调用 vector inner_product 247s 2 N8 Y6 u' T2 z: F$ I0 u' A2 N
    2. vector 循环点乘累加 237s0 L: W8 Z. P  [& a' L% w4 c
    3. float * 循环点乘累加 204s
    % h# o# U. v! a5 t6 R4. 空循环 100000 次 202s7 I% v4 q2 I7 T8 }3 K( y# j
    . z- Q# ?' t- H, f* [: y6 B
    不做内循环 200s
    ( W3 \5 q  T/ d$ W' Q" ?0 e9 \
    ! [1 F' ^- ]$ G& ~6 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    % }4 I$ t; v, H( ]6 K& ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) c  O. Y# F0 F' c0 [" z
    / n  x# S% C" L$ f
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ' d9 a0 R" R7 ^6 b
    1 B+ Z; `% @1 K. r) g(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)8 L1 C9 n% R2 U0 x

    3 ?5 N) |: C( \/ B8 q
            std::vector < float > vec1(N);) X6 m6 ^; O1 G/ K, t& a' K% M
            std::vector < float > vec2(N);* {0 P7 }9 k. L, u+ B
            float* b1 = new float[N];0 w5 m! s: W, B. L# i6 ^0 r4 E! ^
            float* b2 = new float[N];" `# T; M' x5 `/ `: d/ B
    5 i  {  O2 q  W) X
            for (int j = 0; j < 6000; j++)" j" e9 z* M0 W& Z* R9 E
            {( Q* ], F( `+ t  }4 H, s
                    std::generate(vec1.begin(), vec1.end(), []() {$ k, G% n" r- A% ]
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 i) i  K: o8 q/ ?) {
                            });* O0 t' z3 W: E0 C4 b+ l* C( y: C
    3 ]! p9 K6 _' c0 M
                    std::generate(vec2.begin(), vec2.end(), []() {1 h: r& e2 z2 L3 B7 V7 X. T, }
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, ^5 G4 Q+ Z- o) |* J, R$ j
                            });
    ; d7 O. |6 _+ N9 K3 k
    ; Y6 E3 q: O- z                for (size_t jj = 0; jj < vec1.size(); jj++)
    * H* z4 Y: P% B3 ~                {* }: e8 E( I: }' s# M6 }
                            b1[jj] = vec1[jj];
    8 s. |0 Z3 L9 ^0 e9 Y; k8 S8 A; l                }- Y  C- @/ G' x# v3 N1 ~/ X+ Z

    / R- P$ N$ Z: o% `* B- O                for (size_t jj = 0; jj < vec2.size(); jj++)
    5 j5 I; b" p7 h  z& b0 y                {
    # m  C7 Y! z$ Z+ B$ O6 P                        b2[jj] = vec2[jj];
    4 t: E, P( y, f; i                }
    , w# d5 k/ Q$ ]6 u  ]2 e3 e  a6 Z% D: B* q0 {
                    //Method - 1  N=100000 247s  ) w7 }, L# K# N  ?' }5 a& O8 T
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    / X: B. B) f( ^& H9 N/ @9 g; S                                / ?: Y% W- N; @( h1 D
                    //Method - 2  N=100000  237s
    2 s* Y$ O2 U! z0 C                /*
    ) [% M) f0 Q6 N5 m+ c+ a                for (int jj = 0; jj < N ; jj++)
    9 W6 |0 M- ?$ n4 ~* O! @7 [. N                {5 V' g" Z( ~6 B: o1 G# ^
                            fresult += vec1[jj] * vec2[jj];8 f1 Q' j* F/ B
                    }
    1 V: N3 G7 i8 U) Y$ C                */
    & @9 f, ^2 E" j9 w6 q' d                                
    # I- R) Y' ?1 ?- B8 F* I. L; u                //Method - 3  N=100000 204s
    + c% Z' Y7 F) n( I& c                /*1 G) z8 I0 n+ X6 h1 M( Q
                    for (int jj = 0; jj < N; jj++)
    ' r( p0 [5 g6 l+ l: r) k                {
    , E0 Q6 K6 e8 _0 x: f/ p5 {                        fresult += b1[jj] * b2[jj];1 m& h" K$ _$ a  p  S& A
                    }2 q5 L+ Q4 O  ~3 g; j! u  w
                    */
    ! D' y/ }/ {( i
    5 q$ }' w3 g+ W                //Method - 4   202s
    # W& Q" {$ ^- W% C+ T                /*
    4 K: x( y% [  q+ q3 B6 x: r                for (int jj = 0; jj < N; jj++)
    * a, \7 p8 o- v2 b4 S! A                {
    ( [) {0 H. J* F) n7 G! E* D                        
    ; R2 |2 o* M& j* ]                }& T) [+ j. {% `; U0 W. |3 R
                    */
    & H* S/ m6 ]# k- s# h                //comment out all methods, N=100000  202s               
    " e9 E% t- f- E0 ~        }
    6 r9 C0 K' P, k$ T" R2 c
    " u- Q6 X" D5 K# W+ @$ u2 C        delete []b1;3 |- v) N2 G- N- Q. |
            delete []b2;

    - S( }# {* G* j
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. t7 A4 l- u3 l; H6 q

    + O; H; `+ x# T1 }' ^; k你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    $ q( Z: M2 ?3 ?4 B
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:150 J+ o( W1 _$ J8 a+ D* A( i
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 B# P6 W+ x1 J$ x  P/ Y6 a
    9 n9 \- C3 `3 {8 `  M+ V
    你第二个试验里面的j在循环里面又重新定义 ...

    # J6 K5 l6 U7 N/ w: O0 ?内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
      ^( k0 x( X0 ~5 i
    0 g$ _7 r2 u% k/ l! O- y- R  C3 S1 f不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:164 [7 j" L' y( F9 z, h' @, N7 h9 C: A
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ; B1 d' h$ ^$ P) F: R5 {2 j6 }) m
    ' v4 W* G) |# {/ c) T3 I不和它 ...

    1 p7 F& z! a% F# x( ?8 M
    ! Z6 z9 i* m- [1 |% o3 _4 J6 X不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    . d. p* q" U; I0 h2 J2 K后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54  Y9 b& `/ R5 \/ k
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 j; @. M& `/ F- \" r
    {" s6 P9 N$ G/ F! s! z/ B2 n, g
            comp temp, xtimesy;

    1 N7 g8 ^$ \! H6 z  z; a' z这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    , M; l; {" w1 M5 @4 Z5 y0 k内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?7 s# T& {) C9 x3 V) F
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-6 06:41 , Processed in 0.067352 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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