设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?! L% r& S3 \" y2 _( @
    ; t% Z2 {# G9 Z- Q) m
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ `# d( p4 L5 W: l- B
    ) Z8 Y+ ^# j: e7 ^
    速度优化问题真的很有意思啊。' u# k' R2 D3 Z; S5 Z) }) {

    8 x+ b9 G& F8 k4 F8 r+ a欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    0 v8 @1 k. b9 _把代码贴上来看看?
    7 C( V4 ^, T) p. c  f7 E' a3 S' Q0 t3 e9 F9 g. P9 A
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 : [: b: D' @6 q9 c
    数值分析 发表于 2022-9-24 23:04$ L- Y, A' P0 L' W+ V4 C
    拉下来?拉多少?; B- i5 Y$ K, y3 k& v/ y
    把代码贴上来看看?

    2 ?( u6 F2 X4 \! U+ k+ \3 Y
    : A2 ?) }* U1 r! Vvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + q- ?0 G+ e2 L$ Q% G% L2 Q{( u1 F# [9 `6 N$ A& i: ?
            comp temp, xtimesy;8 K+ M) j! R4 x" C
            xtimesy.re = 0;3 ~, h- K1 v1 z( _$ w6 h/ W4 M/ a
            xtimesy.im = 0;" k$ K0 g/ o6 B& |+ I
            int j0 = lenB - 1;9 S& Y4 L! ?' Z* f9 f' r; O
            int    i, j, i1, reali;# y& ~* d: B3 v9 z5 y- z
            if (lenA % 2 == 1)( K& _3 h' u1 l& I- ?" }% \) K
                    reali = lenA + 1;, e) A% G: [3 O- ]: G4 n
            else
    $ Q8 U* [* v% N; E/ }                reali = lenA;
    - n0 a3 Z5 ~% f" Q- M. S        reali /= 2;5 }7 r6 R( l9 u: |
    " B" f" R- e. X& T3 i/ l8 m0 @
            int nconv = reali + lenB;
    7 @$ o# `7 K: M, ^8 f        //#pragma omp parallel for' E/ r$ F; E7 m" x, ~
            for (i = reali; i < nconv; i++)* B* o8 Z+ U' l  U
            {
    1 w' [6 ^4 t& r9 J7 w/ K- ^7 m                temp.re = 0;+ c6 x) _% [8 [5 k% U) E8 |
                    temp.im = 0;
    2 l* e- u) z9 Z5 G' O                i1 = i;" }; f6 l5 s- v0 F
                    for (j = j0; j >= 0; j--)) ?/ @& x% |/ _; o
                    {# {, Q7 R0 W/ V
                            /* floating date operation */
    ' G$ `/ g$ _. O/ D7 I6 C# G& G0 D                }
    ! H) J1 F" I$ s; v% g' [% Z
            }
    / t# b/ y+ w  V2 |; L& g" Y! d}
    ; ?' K& \$ c7 V' c3 @4 g* l) ?4 W0 J1 k$ ~0 F' M$ y
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    1 [( n7 V- J+ K1 n$ U& l  ^% ~. R! w6 x8 A
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。* x; B: ~! \6 k! k
    现在call xcorr 100次,耗时78s.
    . I! b) p, P- L8 T( F) c; ?7 Z; A/ y& g+ z3 t
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. & e  p# T5 y5 d' t( D9 X

    ) C' ]. O, x' _  M/ [; o$ w& @
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:331 s- z9 l8 A' m/ y6 T$ V
    Maybe Debug mode?
    # ]7 Z: L& G  l- N# m7 d5 T
    " r* g$ }+ Y6 x2 l5 m$ N; t
    不应该,看我上面的回复。
    * V! w" ?9 Z! m) V* W
    8 G9 ?& o  ]% J4 g& z我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 / o8 ^4 w7 L, I
    雷达 发表于 2022-9-24 23:542 e4 ?3 u% F5 T6 r2 ~% X& }8 q
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 z# p5 {/ F- D& Q{
    . h; H3 @  R  B2 z        comp temp, xtimesy;

    8 O! f7 D% o/ i
    7 V$ W2 H: `9 @: A; D# z! h8 ^这个不是这么比的吧。。。& s, q( j# _, `# h
    % d" u7 A0 m9 m8 n+ v/ E
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。2 C" @7 T! a$ v; h2 q# h1 k
    / o! q# @, m5 x+ `! y( ?
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    0 S5 S# W4 N2 u
    数值分析 发表于 2022-9-25 00:20
    , D1 P, G6 {. H: \9 c: q这个不是这么比的吧。。。
    - v" W) s( M6 s' R
    : p: S+ X, h4 V4 Q1 d9 P# N您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    , ]* X. o! [3 D  D1 Z5 ?: R" J, {3 d( p0 r7 B0 N, I6 X* E( M
    有道理。
    & f8 U  R! e0 ?4 Y  V+ N& ?所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    0 q( z1 r" P8 w! k
    9 n7 \$ q! r0 o" v1 B我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    / i" b0 k. N4 q2 t4 L% C7 {) G有道理。
    7 C# ?) {5 I4 l, z; ~6 V/ {所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    # f5 m3 p4 d7 q* D
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    5 e; X, T- R1 \& u& o$ |7 CWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20  I2 I" {" @2 i- A3 s
    这个不是这么比的吧。。。
    & x" a9 l) Y2 d6 j$ {
    ' p2 G9 i) f7 L9 z$ ]; o您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ' C0 j5 |/ x& }. Y9 u

    : E1 ^$ ]2 ^; {5 _现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 ' L; ], N8 [: o% Z4 e" I
    沉宝 发表于 2022-9-25 01:48: P  H) A, y/ ^; g  ~/ S
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ' [# T# j. v6 i; w# T' L
    ' T5 m) X! Z9 n* H+ \
    是的,兄台说的对。
    9 h( [/ p2 g& I9 C  L+ Q7 d& y6 }! m
    / x6 ]- S6 S- U2 F1 m# F: o! Z其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    8 M: L* s4 k9 c$ E4 c6 n* H7 N( o0 q6 o- ?
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ! v  s, B' l; n; _) D. L
      U  q8 B) i+ x比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。2 ]  m# `" `( o' l
    7 N/ u! M2 h$ u$ Z
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 3 {6 Z* }: k  \
    沉宝 发表于 2022-9-25 01:27
    % F1 N$ \& t+ L# U, S1 C3 }$ i你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

      V1 l# m  ^- N1 R( m+ V$ ~9 }' g2 Y  R
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    * V5 v9 G& [  F% q6 s' C& A
    5 _0 N$ t3 j2 D+ P( Q我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    3 m9 F3 h+ K8 x3 f1 |( x- b又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    0 Q6 I* @7 H9 ~/ `
    时间差一倍的结果可以接受。, w5 ]* @8 B1 x( A9 w

    4 C3 a% D! a% {; i你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    4 z6 P& R) X( D' e9 B
    雷达 发表于 2022-9-25 04:47
    1 V. D& w- s: z- Y% T又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    - }0 I6 A, Q7 p# ~6 R& M, t
    * ^/ r7 V' L& V, G' r
    1 u- q" U% I7 E' U1 G  v
    2 {5 r' a6 P% Y4 H  B
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ' _; \- K" c0 m
    数值分析 发表于 2022-9-25 14:582 K9 Z) D- ^$ P: H+ U! k, T
    能不能把这个也贴上来,看看和上一个有什么不同?

    ! e! c2 N8 @' c( _2 Q理了理思路,重新做了一个测试。
    7 f1 Q3 }  R8 m" g/ J5 l5 H1 C9 ^1 L/ Q做了两个 vector 和 两个 float *, 都长 100000' l5 f" w7 t- ?; w5 b+ p
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    ' X- n1 C2 C) i0 T; W" n( H, I, X
    , t' h; w+ \! d% C5 C4 ~内循环试了4种方法,3 }, ?9 Z7 j. m8 R- g
    1. 直接调用 vector inner_product 247s . X# b, A) V8 O* C! F; i* w
    2. vector 循环点乘累加 237s5 a) |; r2 B( B- S# L1 S& \* V
    3. float * 循环点乘累加 204s  X( _% e9 _( K& w" G
    4. 空循环 100000 次 202s
    & v2 n( A" P5 Q6 ~
      }0 ?$ ?: C/ M$ j" _9 s" T8 K" K不做内循环 200s
    7 G. V2 O1 H/ O- u# @: a+ \, z4 a5 a8 N) ?' g% C0 D, J
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    * f+ J+ L+ q/ G4 |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    / W3 k3 h  ^3 x# \: F6 N6 H; V  |8 F) I( {% _: I+ ]
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ' s0 l! C2 ~5 S! |- W- `% M) O& c% ^! O" Y% H! `3 }/ {. L
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)7 W) J& b  `+ C
    6 M% B, u: K/ T
            std::vector < float > vec1(N);8 c# E% F- m2 N  C$ _
            std::vector < float > vec2(N);; c5 z& e2 ]) ]+ e; s$ ~1 Y
            float* b1 = new float[N];
    % C1 M2 y* t9 t/ U4 g* h        float* b2 = new float[N];
    ) n# P1 O* q: X3 m
    2 F2 g* {7 x; V6 l        for (int j = 0; j < 6000; j++)" `; b7 k2 I6 v& r; ~
            {4 ~* R4 v9 ?3 G' T8 z' j) \  Q+ I
                    std::generate(vec1.begin(), vec1.end(), []() {. |% T0 [" ~& @* p& R- \
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    * M+ _- ^" V( O$ Q6 H% p                        });+ c5 p+ b2 ^2 N( n  e) v
    ( G8 K- j8 q' P! W0 {
                    std::generate(vec2.begin(), vec2.end(), []() {. F8 R+ R6 Q6 F# k6 z  j, ?8 S
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 Q* j1 T1 h0 p0 X. |
                            });! U4 M- k! u0 f5 W$ r& m- n
    * _0 c8 B/ b* N( i8 H
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    : q( o8 K0 j+ \9 |# x- ?* u8 e% M                {
    5 ^9 x* j0 R( {3 V                        b1[jj] = vec1[jj];
    ( K4 t+ ^' C1 c" V6 F: j) ]1 G                }9 o2 w' O! J  h
    8 T/ H7 [! v! e9 O: G0 C! I
                    for (size_t jj = 0; jj < vec2.size(); jj++)8 b8 K" T4 q2 T+ x. j
                    {! ]! c, m3 P) U$ {/ k3 b' T# ^) G
                            b2[jj] = vec2[jj];6 S5 Q. U* R& Y9 ?- Z& Y( {* `% B
                    }
    ! D* I5 w; l  T6 Z; J: i+ T" z* s' y
                    //Method - 1  N=100000 247s  
    & K2 f4 |1 K, P9 W. V7 X6 m5 \' j                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);- c# I' `+ L3 P& o
                                    
    4 q4 h; `8 U, J+ ^# c% b                //Method - 2  N=100000  237s
    ' N2 t2 W+ B4 F3 O' L8 ]                /*
    5 `) G. C; f. M5 _2 V                for (int jj = 0; jj < N ; jj++)
    % C6 \0 Y+ C2 v                {
    6 A0 d) s2 d5 \' q% l2 }                        fresult += vec1[jj] * vec2[jj];; J# h: M4 I- q: Z) v& P1 x' d
                    }! _3 W: I+ u8 o( G" @/ q
                    */
    " W4 Y' g& c) }, N" T0 C' _                                % n2 f- P1 |" X2 Z. v$ E% K
                    //Method - 3  N=100000 204s9 u+ l$ @' z+ x
                    /*( W$ i  j3 N& Z1 D# W3 v( R, l
                    for (int jj = 0; jj < N; jj++)$ ?/ ?1 b1 v0 w$ Y) C
                    {  w* C; e; K% N1 F- O
                            fresult += b1[jj] * b2[jj];
    6 e3 v( E( G% q5 ?6 a/ Z% {+ L                }
    . @3 V; O9 l; r8 |+ d6 ]. a                */
    + j7 h( \+ l6 g) o: b7 S/ J4 [; z' O2 M3 I
                    //Method - 4   202s" E" V( w; k% O, Q
                    /*5 |8 G/ g) e" K  {' M) @
                    for (int jj = 0; jj < N; jj++)
    3 x' }& R  S: `% G4 G                {
    ( \% W# @6 [0 h4 Q  x                        
    / n1 Q5 K. D1 X: ]8 `- Q                }: `0 v& [& _8 J" g  O
                    */
    9 ^% j9 B# N# I5 b8 q- S; |                //comment out all methods, N=100000  202s               
    4 z  [9 q) {6 S. b        }( I! Z& }, x) p) p$ r
    + U7 y0 c0 \9 I; p
            delete []b1;
    5 `' h9 p8 _! o! {7 S1 z. c        delete []b2;
    1 W9 j$ l9 v. p7 A, |& @
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. C( o5 l: x" d. X/ S  h, z

    8 V$ S) @8 d9 |5 a; i- o8 }. _你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 d; c' }: D1 M9 J, @; T  S
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15$ L  ^5 K* q0 v5 g. t2 C& n* ~  K
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?: D# ~6 e7 r5 h3 i! y, f4 i/ r

    4 j. ]4 O- e+ X1 L! D' ~你第二个试验里面的j在循环里面又重新定义 ...
    ( n- C  u- I: E2 S1 n
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ g( t; ^- \) v& L4 H' }

    8 H% X0 a9 ]: r不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16! A7 ^* Y% i: f
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    % d7 a. h8 c( z7 u$ _. V& J3 {5 j
    不和它 ...
    * [5 A, V# t4 F

    , Y) _& ^# q2 o: m( X不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。) ]# z% m0 k3 H6 s( }+ V
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    9 i- s- f+ K! Z6 `$ w( rvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 ~  b) t# [: ~/ r- X7 D{
    " Q: `- P7 r( ]5 c# H. X        comp temp, xtimesy;
    - U# @2 L6 R) H$ D1 k/ Q& G
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。6 f+ L) B# ~" w, T2 J9 t
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?! |- Q4 d& d+ {1 p) @
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-8-22 04:16 , Processed in 0.062676 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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