设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?  o9 A$ p% `. ]

    . ]2 n  j7 B8 m& U: f* M9 k自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    7 F3 _3 A& a8 J% L( M+ s+ @6 ~
    3 w* v0 C! B7 P( v) A# A速度优化问题真的很有意思啊。
    3 {3 i7 e" _% X* @9 k: ?/ v
    8 ]% w% _7 \3 `) J6 i+ N( |欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?' [0 ]& i! p: z
    把代码贴上来看看?
    , p- H: R& g7 X9 J* I2 A+ r
      }$ u0 z$ m* G' L8 P0 ^难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 ; A8 g! c- k: x
    数值分析 发表于 2022-9-24 23:04; E0 C- j9 H9 G+ S7 A2 Q1 m  c
    拉下来?拉多少?
    * w; W" j2 m6 P% O把代码贴上来看看?

    6 O) @" k) l1 D6 F- [/ [
      R, `8 o; ~/ R! p- _' Nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , j  C' F. V( S! _{
    . W9 `0 z, D: Y, l' Q  J+ Z& g0 K        comp temp, xtimesy;
    / ^! h# h# S. Z8 f5 V9 m. m- u        xtimesy.re = 0;; z9 K# a& o9 Z/ S% C# J
            xtimesy.im = 0;
    + [* G6 D+ u- n        int j0 = lenB - 1;
    + z% Q, z7 f2 D* B        int    i, j, i1, reali;  e2 @! K/ K! t% Q' v; L! x6 }
            if (lenA % 2 == 1), ^, t* m/ N& e& N
                    reali = lenA + 1;
    ( ]' Y+ L4 \! y: r. @& U7 Q6 Y& m        else
    ) H' E; Y, Y+ H+ L" B                reali = lenA;$ E7 O- v' `! S. f! W5 t
            reali /= 2;  X6 B9 O# [* ]

    9 [" N) \0 y  S* Q; W        int nconv = reali + lenB;
    ( n& G- C8 {$ B5 ?0 S1 g9 W% a        //#pragma omp parallel for
    ( t' m+ u2 |+ C8 i7 k0 p        for (i = reali; i < nconv; i++)
    5 ~' R0 q" Y2 d; }& y        {2 s) q$ n/ O3 u; `) V
                    temp.re = 0;! J8 A0 d4 s3 U0 n' a
                    temp.im = 0;1 Y; ?4 M$ @( b+ j0 u
                    i1 = i;
    4 Q3 G* C, p5 K) R                for (j = j0; j >= 0; j--)
    : P; Z  X3 \; J" p6 \8 a# N1 @                {+ K! c( f+ y2 `' C0 n7 w
                            /* floating date operation */, k6 c" R  S+ G, w
                    }
    2 I2 l" R" {9 c; C# w' D2 U
            }. V6 @- W4 U6 v# W! X+ m
    }
    3 A% Y% m" t) D4 `+ s
    ( @; r* E: P% {7 q4 Bxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    5 L. G9 p, K% \" _7 {) w- z4 E5 R
    . k# F- S; h# C  Y% j6 z红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    8 v+ T/ J; }. r现在call xcorr 100次,耗时78s.
    ) l0 f9 t: M! x" ^" s( c. c+ p4 _# _3 V) @" K
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    ( \/ a3 O5 `! f; M& J4 B9 n& F4 U0 A1 t3 `0 r
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33# v, L; b4 x" [" u, F
    Maybe Debug mode?
    ; j$ |& D- F  u: W
    8 }8 ^9 x% B0 V2 i1 y" B& ?
    不应该,看我上面的回复。4 ~: X" }1 m& n* h7 e7 i, b! ?
    ) v' U$ S' ^$ w2 }! p: [, j0 v
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 2 D/ P+ T' _. H( m
    雷达 发表于 2022-9-24 23:54
    : @7 J5 P6 U! O4 J" A3 Xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 ~1 |6 e* a" R8 g& |
    {
    1 L+ V/ a5 v/ Y1 ^3 C3 K) K( z        comp temp, xtimesy;

    5 r' B& \" F( k' N8 P
    + l( i9 H4 q+ o  T这个不是这么比的吧。。。2 U, K* v8 P& S; @' I2 a' _

    4 }% t  Y. B# w5 ~. D您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , t5 G) m% k' a" a
    : @3 o; w2 H0 ~而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    5 K$ N9 |& E! T& ]! U2 C: Z
    数值分析 发表于 2022-9-25 00:20. M+ o3 {0 x, x/ G) L
    这个不是这么比的吧。。。. M& M! y8 k6 h0 y% h
    . C' o% ^- Z5 s# _" v5 Y! }
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    " q+ y  A/ n  ~3 k: P

    0 p) n% V$ W2 d" z+ y% r6 c) x  K4 k有道理。% p, ~9 I3 b# [
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    + w5 n; a+ S7 u1 A' e' V" c4 B
    % f9 c1 T' j  B  ]# V& a我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    . H9 d; V7 I  p有道理。
    3 o6 l; o- [/ }所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    1 @* A9 ~' m; ^! m* @
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ' g7 d$ V2 [+ J2 ^3 AWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20& a6 A9 j& c$ f8 {/ U% ^
    这个不是这么比的吧。。。
    , q6 d$ {; H- n. @, J1 H% o8 Z: A8 H4 W) }; U6 y) k) R( K3 m
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - k- I* ]! _/ u
    ( ?& j* V5 E$ n: q. O7 J% W% m$ u3 g
    现在的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 编辑
    + M" s9 X: C* W
    沉宝 发表于 2022-9-25 01:48
    . a1 z, o6 }. J现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    4 I+ @4 G1 ]3 u* O* J* i7 \; y" ~8 }1 x: L; i
    是的,兄台说的对。
    - L) r9 z$ l/ |6 v* J# l8 b! i
    , U% c: ^7 I4 Y9 z其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。) }: g+ `  D8 W
    # p8 i2 F7 |6 B: G0 B
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    % f3 r: q  c1 q/ N% M0 [8 O) [; J; I8 b* V9 f
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    $ M5 L* A1 H5 Q  _- s! V1 ?3 `: X% l9 b! g  y2 V0 l
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

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

    6 M. J# @9 d% g6 I
    " a3 x# V& }, y又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    9 u3 i5 d3 d: ~  m) K8 [  x" \
    + m' ]" ~2 [4 X7 C我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    & ?- Y) @/ ^$ \又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    / {8 B$ S* o/ J5 E' V7 [
    时间差一倍的结果可以接受。
    0 h% {1 b9 c9 P6 Z/ k1 G7 W, n
      p) d8 k# K0 C9 U  L你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    0 n8 E. D0 S$ u$ |/ D7 v
    雷达 发表于 2022-9-25 04:47
    9 {/ Q! N+ i3 `. E; A又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    # d, C8 ?8 S& ?0 S" X& f3 K- R
    7 o. ^% S9 c" j! d. K1 n+ A  E9 S8 q' x2 z* K4 S
    / B; A  C3 t  r
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 U  p. G1 H4 p* I; d6 ?2 ?
    数值分析 发表于 2022-9-25 14:586 H+ E7 c, j9 l5 ?
    能不能把这个也贴上来,看看和上一个有什么不同?

    3 G- x# O1 A; E$ V: }) ]- X理了理思路,重新做了一个测试。
    $ u) p) t" q& ]9 W做了两个 vector 和 两个 float *, 都长 100000) k/ a7 r& H9 {* R
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
      H% Z8 U/ {5 W9 t1 m
    5 B  \  m1 c. W) N0 i* R) z0 E, {内循环试了4种方法,( u- I1 ]. a# @9 h4 Z* @0 Y
    1. 直接调用 vector inner_product 247s 6 a2 ?- x8 T$ w0 Q- H% P+ @1 c
    2. vector 循环点乘累加 237s
    6 F! ~* u; i; s$ p( ]3 W3. float * 循环点乘累加 204s, h7 B- q2 @8 ~' A% |+ I! e; C
    4. 空循环 100000 次 202s- o3 P* q. Y0 P1 Q2 v( W

    ) {) S8 z: P7 H& f; L% G, g1 w不做内循环 200s
    & {' `) {: K) f( _/ b+ J$ C% B7 ^$ i7 S
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    2 h3 q3 B+ M) x' m6 K( L另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。  C  `( P+ o0 ]

      A6 @) u( ~7 n% F4 u/ Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    - `/ d" K! E1 }! F8 U' V7 p1 N9 k5 P1 G' x# Y
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    # M3 O  D: y- u% A  l+ t8 f5 C6 {  L& R  j
            std::vector < float > vec1(N);
    1 _2 ?9 D) J; ~6 j% s( L        std::vector < float > vec2(N);
    9 S" K$ H$ r9 w8 @% `        float* b1 = new float[N];
    ; B- n5 ^( f# F3 \* Z5 ^4 S        float* b2 = new float[N];
      p; U9 i. L  v9 G# U9 e3 P' X, T2 e5 P4 r  g+ v6 y' s8 A
            for (int j = 0; j < 6000; j++)
    ! [9 [. v) O8 D" ?        {$ F; y2 U4 i; H/ J& Q1 Y* K
                    std::generate(vec1.begin(), vec1.end(), []() {& Q# G* P$ S2 S: y, n6 ^) A. P
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    % @* j( z: B, ?( S. d                        });! t% R7 M& S3 Q+ ~

    - g! L$ U# V+ E0 F) s( r  q, s9 l                std::generate(vec2.begin(), vec2.end(), []() {/ N( F7 q7 b4 K" x' A. K
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ) r6 Z: r/ i2 h5 r3 B                        });0 V# D+ j+ e: }" k) F

    4 q) C$ N: a- f$ j2 q, T0 d1 Z                for (size_t jj = 0; jj < vec1.size(); jj++); B# Q8 h/ |" b7 R
                    {$ _  I1 y: ]/ }; p4 M5 U  G
                            b1[jj] = vec1[jj];
    % H! |6 r5 Q( D; N. i                }
    0 c2 H: I" |/ M; I5 Z
    5 Q; m+ ~7 v3 g" g  K                for (size_t jj = 0; jj < vec2.size(); jj++)
    $ G( V. [  Y/ X0 V                {* h5 d% Y( U2 o" }. N/ Q0 o
                            b2[jj] = vec2[jj];
    ' @4 B7 V. S7 @' h5 u                }
    $ r7 ^% M: B3 h) ?+ \  u. I8 w8 A+ _* P' J
                    //Method - 1  N=100000 247s  
    ( X  Y) w$ k2 T/ I% a6 j0 h                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    0 D' f5 e5 K7 }3 Y, \                                & e, V+ V; [: |
                    //Method - 2  N=100000  237s
    3 Z, h* ?6 M5 u+ k" H                /*1 E! F. \& f" C0 K
                    for (int jj = 0; jj < N ; jj++)- h$ d8 ?5 \5 b& n& s* L8 G
                    {
    + r1 R3 E: ~) ]( `8 y) g                        fresult += vec1[jj] * vec2[jj];
    0 G& h9 q: S' x- l( T1 j# \+ C' ?# p                }, T" c( D1 q( ]' P) q
                    */
    8 ~7 p" \/ E7 t                                
    - A2 E& P" `! q: G" a8 w$ P                //Method - 3  N=100000 204s
    # I' d9 G& H3 S7 W) k0 z7 R                /*
    0 k: S: B+ g& Z; h" b                for (int jj = 0; jj < N; jj++)
    6 F, z: S# J# C7 d7 J3 W0 e# |; J                {
    5 O/ @$ k: }# d                        fresult += b1[jj] * b2[jj];
    % v; e" d3 N- W& l                }: V; _8 Q6 X2 L
                    */
    0 u$ ]0 z: p  L7 X. j' f9 L3 `' o6 G6 X
                    //Method - 4   202s
    ! ~1 g8 o% O* [+ {) T! ~8 h                /*" D, W% T& ]8 `4 R8 v6 ?5 H0 a
                    for (int jj = 0; jj < N; jj++)
    7 g+ T5 p4 H# h9 x, c1 L8 x                {# L& y; D3 {# q
                            
    / w1 K0 {5 e9 j$ C                }8 C8 s8 J; _% U: u( Z
                    */  \. Q5 n; x) k9 E; m7 j/ K) M
                    //comment out all methods, N=100000  202s               
    5 b7 h+ b' g6 u1 ?5 s8 j& y. ?5 g        }
    ( [! w( Y9 w) R. F% z
    % h2 w/ W9 R: }  |/ F# u2 x0 ?* G# j        delete []b1;) U7 Z) Y. @+ p  k. X1 M; N
            delete []b2;
    ) n6 ]  t% ]+ L' c9 p7 u9 t  Y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?$ _, c& n$ W; N( {6 [& l( t* e% _
    0 H( N, Y' W2 m# x
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ( d2 H! @* \% Z1 f6 D) X( M4 x( x$ H
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    3 j+ r8 s# y6 t9 w: D; P瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 p, ?7 P: j; Y$ T. ~( ]6 c# a. U( `/ ~$ [" N( L5 a
    你第二个试验里面的j在循环里面又重新定义 ...

    9 [( Q  J( H$ V6 C% ]内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL/ U  ^4 V+ w& ]6 ?
    ' S1 X/ f: |7 D& m0 ]8 U
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    5 w! x6 L% y! m; {6 L内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ( v! m, [, \( T3 D/ u' m
    ; U4 e) F0 |. c. t; L# a不和它 ...

    * \8 m$ p: F& R) ]' z5 {  T7 j9 ]: f6 X
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    6 w% q5 k: O' j& [- c8 V4 d4 y后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:542 H, ^5 a" U  T8 G3 r; B
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% E: V' m& a2 ]! t, \. \" }
    {/ M& p: u2 X) {2 z* t
            comp temp, xtimesy;

    . u2 v- Y  b3 P% h这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。# U- q4 W! B8 _# B! Y. c
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?$ c( ^, J- S0 N" X
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-5 15:02 , Processed in 0.102665 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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