设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    : W# X/ c! e4 d7 x: z! q8 \2 F) Y3 h4 n
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ; h: B5 ?9 ?" i! T# n, A3 Z. C% m' `# U0 o4 t6 D3 H
    速度优化问题真的很有意思啊。
    9 E) B) E( k8 o7 L; a
    & G8 |/ c* C! p* _4 ]: U2 Y欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1955 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?; B) x- x3 B0 b- {6 d# V3 X
    把代码贴上来看看?
    : D7 O6 l. C# g2 ~* X, X% I7 K: [. M
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    , m% q, S! _# |; I1 f
    数值分析 发表于 2022-9-24 23:040 e3 F: E) o: U# Q4 ?
    拉下来?拉多少?
    $ A4 |3 J) c7 G6 Y) r: @# L把代码贴上来看看?
    ; J' f9 u9 i2 S3 y, p2 G$ g
    . a  B2 b' ^) A" k
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    & ?: S/ @+ B7 Q) N{
    2 f" `5 @+ d, [7 O5 l$ q        comp temp, xtimesy;
    0 a! h& u6 u' y5 h% d/ h+ D        xtimesy.re = 0;* e" s$ q% f  @
            xtimesy.im = 0;
    % e2 G# d) M9 u& J1 {" i        int j0 = lenB - 1;
    2 H1 d' u. M8 j, P/ @7 A        int    i, j, i1, reali;
    6 }* O/ l9 \/ M: D5 j7 e- k) _* e8 z3 S        if (lenA % 2 == 1). [$ A: P7 q! b& @# t, I: ~0 j/ [. C
                    reali = lenA + 1;* Y3 M; d' T- l  g4 `3 J
            else
    ! i4 b+ [" f) X                reali = lenA;
    # j# X* O6 H4 l1 e        reali /= 2;
    # a/ ?3 k: g; i) L# [. P: M! S  ~$ f! z/ X  x
            int nconv = reali + lenB;' f9 z7 i6 p' S: T+ n5 j
            //#pragma omp parallel for
    5 }& _6 Q5 u/ Z4 ]        for (i = reali; i < nconv; i++)  r. ~* c7 [2 `8 S: o9 C+ a5 ]; o
            {- |4 P4 q5 _& p8 S
                    temp.re = 0;/ U/ M) O, H: _- \  U$ w
                    temp.im = 0;9 K8 v% g+ d& m4 Y  m, B' ?
                    i1 = i;
    3 y: g8 T( o$ U                for (j = j0; j >= 0; j--)
    % v& ^2 J2 ]7 i' E. D7 F3 Y                {
    5 j* T" N- |! S1 f                        /* floating date operation */) W' L9 ~- q' z, r8 X: w
                    }

    , L/ a' ^+ p( E2 k) Z/ [! O        }
    8 }/ S# w% j3 D! K4 `1 p% M}( L  d1 X% a% N$ f( o9 r+ \
    * Z; p& R2 V4 B; X) k% C% I" Q, m2 L. @
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样+ s9 ^3 g! q3 y" b/ P* y

    6 R% o2 E0 p2 {; W' F& [红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。! C5 X7 r8 ?0 t3 ^% ^
    现在call xcorr 100次,耗时78s.
    . }) I. @- f% J( ~; ~  O* F/ l% x7 d
    , ^4 i' N( `4 I+ A0 m如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. , R, w- I! [6 {4 ^9 ]0 K, m1 \

    , |" N0 _8 l7 }+ e# t) V
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:330 g+ m4 {; \7 X8 @6 v+ `0 Q
    Maybe Debug mode?

    8 L6 d, q3 ?8 G% L1 Y( o2 w* p. Y, j1 m, K/ x3 j/ Z
    不应该,看我上面的回复。" }' N4 ]/ v: _; e
    * `0 t% ~) u1 q  G" P
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1955 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 1 x# h" n; @8 v
    雷达 发表于 2022-9-24 23:54( }1 v5 g2 V' m- V% D' x
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)1 Z% a! m# h! @+ ?! U/ z$ G" a" _
    {5 [8 o7 F( u; ~. q  P& h" E  I
            comp temp, xtimesy;
    $ r8 V$ ?2 y& x3 E9 \: G

    # N8 T4 u3 r5 z- X# o; T. C这个不是这么比的吧。。。
      n2 M+ a* ^- ?" b; N) ~- V
    1 H" ~. p+ Z3 o0 c* B3 l+ i您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。+ C2 [0 d% W; }2 ]

    ( \! d" _5 z/ ^! T而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 - s0 g) M& t# P, g: v+ p" D5 V
    数值分析 发表于 2022-9-25 00:209 a. D8 j5 h& b5 G' P7 [- C- Y
    这个不是这么比的吧。。。
    + H. I) Q6 x/ N" M* ~1 ?/ s1 |- \+ h4 P9 A* ^
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    / f6 W8 B, G9 |5 D3 |4 M) B1 k

    2 v) K1 }- F  v7 h/ |有道理。
    ' K+ d$ O. e( S. X所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    6 N# C: F8 P5 q% Y7 C' }7 h
    2 e6 a. v0 G+ E我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    - }9 O+ j1 a" V3 q+ u有道理。. f! K, \+ q! v( V( K3 g* Q% u9 L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    6 v& }$ k7 C, Y! }你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多4 Z- |( v6 ^! }$ K! }$ o
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:202 o8 y* u. c- H& w, V) P
    这个不是这么比的吧。。。
    $ k  Q6 M% F+ x; T) l. O
    7 m9 p/ S/ p/ M- d  ?4 M1 e) D3 s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    5 }/ u5 y+ F( s# @: @/ s! f
    3 p  S7 l# ~* e# m8 Z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1955 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    - m! r+ B+ _* P$ y& M: S
    沉宝 发表于 2022-9-25 01:48
    9 E% R# X0 |3 h5 p! P现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    6 F7 {' [4 R1 w- n( \8 p/ T0 U) W! B, g  p
    是的,兄台说的对。
    6 _# C6 z! M9 ?1 L
    7 ~4 D: p; g9 [6 P4 ^2 r# g其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。9 w$ V# a8 U1 D* {+ i' j7 O
    , o6 s/ c$ k9 P9 l7 d; w8 {
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    * g6 s) P& X; F% S# P" c& @: D) A" A9 |
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。8 [5 d; {. R0 m) I9 O% e: L7 c; b

    9 q  L1 m7 B1 ], P. L$ _; d当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    0 k. _' h, N8 u2 h4 m5 n
    沉宝 发表于 2022-9-25 01:27$ [0 G( Z1 Q6 d5 F; q, J0 Y
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    + m; [; K5 F2 I! N; G1 a
    1 k0 r+ `9 [1 Y% C又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。" v' F4 g+ O8 Q3 ^& h3 s" n
    " S. `2 A: o- M" q/ s, U
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    , z/ q( X8 a5 a: H0 |$ [又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    $ k6 A. ]; k& I% u时间差一倍的结果可以接受。
    9 B3 x% C- T! t3 N& U" N$ k
    + R8 P0 s5 C. n3 G& d你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1955 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 0 x9 r0 ?% A6 r1 \# J1 l- ?
    雷达 发表于 2022-9-25 04:47
    ! {. r  y: i  `" s又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ' @1 J3 ^" P1 r8 w+ @" M
    * d4 E- M' H8 c; R7 m& T

    6 Y2 {+ L9 \, ~9 e  O1 z, B- z8 n9 l
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
      K% q+ z' V5 U8 I/ y7 {& |
    数值分析 发表于 2022-9-25 14:58
    ' i+ B- Y9 S" j- t能不能把这个也贴上来,看看和上一个有什么不同?

    + W4 x$ d$ B+ t0 C2 f' F3 L理了理思路,重新做了一个测试。
    ! N4 h4 p" O/ h8 _. }8 P7 V5 K做了两个 vector 和 两个 float *, 都长 100000
    / ^& [" X6 y3 p( G  Z$ k外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." W- v$ z/ b  z' ]% F' x+ {  o9 o( Z
    3 y% [" _0 B  X! p/ ~; g
    内循环试了4种方法,
    7 p1 u* U2 P' B4 Z/ B1. 直接调用 vector inner_product 247s
    3 j) J& c' f- N! I1 v$ I6 o2. vector 循环点乘累加 237s
    3 R* V3 [: [1 e" V8 `3. float * 循环点乘累加 204s& w* Y- O9 n, Q( U3 {
    4. 空循环 100000 次 202s
    6 {- Z$ z+ l! x$ E1 ^$ i) k, M! m/ [, L0 D# \
    不做内循环 200s
      \3 ~7 z# d2 }5 P1 l* K
    2 o, ]2 M0 D' F' H  M4 v9 T4 a你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    , X4 t% o/ y& M0 x1 y% K$ M另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    2 S' G; ^& j& x1 u3 \5 `
    ; t" I* M" h+ f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 E2 ?) y6 o4 u6 G/ ?; J
    1 p' z. w' x* [9 s$ d: P7 z! E
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    $ T8 b! ^* w$ ~3 n+ [
    3 C9 y$ K! f( m1 f
            std::vector < float > vec1(N);* C3 l- u: O/ h5 A7 N7 c% h' s/ s
            std::vector < float > vec2(N);
    : r; c5 N( f$ W& F        float* b1 = new float[N];
    $ ]( F7 s9 y7 y' q) N. d        float* b2 = new float[N];
    " W9 \& e# \' P& J3 k  ?, T. f- a7 J1 S9 u% u. w6 e
            for (int j = 0; j < 6000; j++)1 @4 h7 f' h3 n0 S4 j6 M
            {- R) V6 `& ~+ V, t& k+ c: b
                    std::generate(vec1.begin(), vec1.end(), []() {
    & Z) E7 M) F) \6 y9 O8 ~9 v                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ o4 l6 Y: U' ^/ D8 i3 e
                            });) W' e* K( K+ G* u3 O
    , |& O- X6 V7 S. Q5 L
                    std::generate(vec2.begin(), vec2.end(), []() {
    2 h9 H) ~* j2 R4 }; g; G                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 H7 }0 }4 |1 P+ Y' }: `5 Y/ I: F
                            });
    : U9 v) [% F( P$ C% z/ F/ i' [
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    # R% V& R+ ~; S" Z# l                {
    0 j* i* I8 V! \$ ?/ P                        b1[jj] = vec1[jj];
    6 _% f( ?4 U; c5 U" ^7 O2 J0 P                }
    ' i' F5 D& z6 ~; p8 R, M: H# R/ }! C5 L  C3 |/ I5 J
                    for (size_t jj = 0; jj < vec2.size(); jj++)2 S) G; G+ C9 u3 p
                    {# I  `6 g9 x/ t# Q* B  I+ v
                            b2[jj] = vec2[jj];) R" q/ \& a$ `9 a+ s5 L# h! L2 G
                    }3 v7 x- {) L1 ]& O3 R

    9 J6 g9 q- [' m8 U                //Method - 1  N=100000 247s  - o! f  B) N+ q& j
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 T- H& |- q! l+ D! A( v
                                    ( G/ ]: ^1 U2 l6 y  O1 E
                    //Method - 2  N=100000  237s$ y8 Z) s0 _  h
                    /*
    8 {  c* t) A0 f( a. F, g                for (int jj = 0; jj < N ; jj++), S3 f1 T1 |( {6 {1 x
                    {
    ( }- s/ T2 h  B, h' o. i& _1 @                        fresult += vec1[jj] * vec2[jj];
    * j# n. A. f5 h                }. ?2 }/ p: d$ Y( P( U. z4 R
                    */( U% N' Y% [3 a2 }
                                    
    * M3 X' A5 s0 r  q                //Method - 3  N=100000 204s' P$ [- {3 Z3 }" a& d  o
                    /*
    " _( ?, w' T$ r' g                for (int jj = 0; jj < N; jj++)
    8 r) y$ z8 y( t                {
    3 Y: D. p6 M* ]7 L                        fresult += b1[jj] * b2[jj];
    - ?9 L2 z% H9 t6 \                }. i* Y& h2 W. d' f4 k
                    */( k+ M- \# N2 ]# L

    3 o5 n/ ^- i, L) K                //Method - 4   202s
    / {, [5 a: x* N; \4 R; z. D" S                /*8 L9 }- b5 ]! ?' ]
                    for (int jj = 0; jj < N; jj++)
    7 Z) I9 `4 h, I" z. i                {, N* I1 @+ Q5 g$ B8 R
                            
    8 u6 H* b  E( F0 ~% {                }
    9 h7 s! I" N4 v; u6 F' b                */3 X" ]9 d' @- s+ c+ [
                    //comment out all methods, N=100000  202s                5 c( p  q8 v: {$ H) [
            }/ R# K) x1 m3 T

    2 k$ V; o) U9 k2 E, a; H        delete []b1;
    $ m$ Z" s. q5 n/ v# r        delete []b2;
    3 w5 Y9 H2 f) @! }; H$ T
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 T# b; E5 c' `+ ^+ x1 o

    ) `: r4 T) Z( Y7 i4 X你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ; r1 g- h' U. O9 O+ h! @# ~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / Q1 {3 L8 l0 h) e0 m瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( x* v/ N) C# P2 Z  j& x5 ?! a
    6 ^0 T3 I% Y' I
    你第二个试验里面的j在循环里面又重新定义 ...
    # n8 W1 o. K% x- O% ~8 U) |: ~
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    7 i% ?' v, C+ L$ `4 u, L) b; d, u
    # }+ V* ?0 K0 O# d1 {* [/ ]6 Q不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    / j% u3 c4 H* D2 `, c4 g内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & \$ `% L6 u+ g* D& a& s
    # r' L+ ~% j/ o, f  z不和它 ...
    4 n/ m0 b1 N; }& M$ J5 T

    8 |) o  k. Z! n( X; e3 I: }  }不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。0 i% O, Q% [- q! p2 E# F$ E
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:545 {4 h1 P; a1 I: ^. K
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' g" q* ^' D7 G  K3 `- W9 V
    {
    ; C* {6 X. S* R/ _# R        comp temp, xtimesy;
    . W9 |4 K  p3 S2 g7 a: D, Z
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。8 Y1 L" A9 D5 S6 h
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    4 T, r3 Y( G5 H' J+ |VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-14 11:58 , Processed in 0.085484 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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