设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?0 F% D5 |2 }9 ]- Z) [
    6 [0 e6 U) P+ Y0 f+ q
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    5 n8 {* e6 W4 T- s9 Y+ ?8 g$ _' f. m8 t! F3 S  _6 J( p
    速度优化问题真的很有意思啊。1 @' \) A  |4 T. Z% x! K

    # z( z& N+ ~' c* H欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?0 c# Y3 @* f5 j6 U
    把代码贴上来看看?
    . \* m( B7 _# i8 O& G* V( S3 {2 s2 p) ~: }% k& k
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    & U+ b8 p: X! e- E) R! s
    数值分析 发表于 2022-9-24 23:047 O. p1 p3 q' j* N
    拉下来?拉多少?
    7 b$ O/ v, `& w8 N把代码贴上来看看?
    , r& e, q( h7 F+ ]* Z
    ) z7 U- Y8 k4 m0 f, a6 y% k
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) d" g: Q/ H! Z- R{4 ]' j1 X7 w8 h
            comp temp, xtimesy;7 B9 R. ]( B2 M  M/ ^; S& J! Q
            xtimesy.re = 0;$ L+ i& l( K2 h8 ?' f
            xtimesy.im = 0;$ t$ D' |* \  ]% G) a. I
            int j0 = lenB - 1;
    3 @. O! T4 N% r" w7 ^6 Q; y        int    i, j, i1, reali;
    3 t. @1 H7 f$ d3 z0 X        if (lenA % 2 == 1)! W" F8 m9 a) P2 H5 p! |" ~
                    reali = lenA + 1;5 o8 X$ h# G7 i% l! Z1 V
            else7 o# ]( f; t3 [* M0 |3 Y- U
                    reali = lenA;, T6 C- J) F# H7 c! C8 A% m' n
            reali /= 2;/ @) _9 I$ C1 w" s( n7 a2 m
    8 c! H2 K5 v; L6 T  M+ m! i9 z
            int nconv = reali + lenB;
    / p* H. B. {9 ?! e9 R  }+ [+ D2 C        //#pragma omp parallel for
    , l2 D" `6 b6 f& h        for (i = reali; i < nconv; i++)
    4 Q+ W0 E6 x- J3 |# c! {/ a- ^        {
    ( c5 z; v4 T; b2 b# ^0 S                temp.re = 0;
    & L. E3 t$ V3 \! m                temp.im = 0;
    7 @5 l$ i& c! b2 B! k                i1 = i;  X) G9 b0 T, J$ n
                    for (j = j0; j >= 0; j--)
    7 ]. A- m. C+ |) Q                {
    , y) n: O# s! e# d& o3 V7 f% [* _                        /* floating date operation */3 K7 a" a+ g/ Q$ X$ o' w" @
                    }

    2 S$ f0 c4 N3 U        }
    ( c! s2 s% k' v9 A  g}2 t. k1 M. N* j0 b1 [/ z

    $ J& U+ w9 s+ h5 `xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样9 t+ d8 O# C! [- B
    6 ~0 J$ U% c% f" c: Y0 o, M
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    8 x0 j$ G# C( G0 B& K现在call xcorr 100次,耗时78s.
    . f" Z/ _; v1 k  }* n9 g. a. Z- |9 y* J3 O& d
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. . Z% q0 Y" s) d$ |  |
    / r6 ~6 w! G3 A  e
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33& I1 V* g( [6 ^
    Maybe Debug mode?
    ) E% V& t/ {( ^( f/ O

    8 z5 r8 `9 R  L, h+ L+ }. w不应该,看我上面的回复。
    % B+ R9 M9 A- C1 _" @7 }" D
    : U8 X* x' e$ O& N' e( r我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 % [( i: I/ x* v% Q( v7 {* l
    雷达 发表于 2022-9-24 23:54
    8 p: a' m5 m# u( Ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; E9 |: x9 Z# O" z{2 j1 [) @2 Y2 }& f0 M4 K
            comp temp, xtimesy;
    6 ~! n3 y$ U7 N2 b. O
    : h- s9 a+ W% b7 C& u# v% }
    这个不是这么比的吧。。。7 H- q- Y* A5 l5 e0 k0 i0 ?
    / j: N) p* |6 ~' \* b* E7 x' \
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。8 ~: g7 a1 H+ B

    & F! L: d- }# l9 @  o' i5 b2 |, L+ ]而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 ( h+ d/ S3 f( c
    数值分析 发表于 2022-9-25 00:207 A' w" n6 \  f. p% ?
    这个不是这么比的吧。。。- j! r/ g. L5 g/ w& S

    & i* O! H3 `+ M- j' w( d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      g4 Q4 G6 [, S* _5 `0 y4 T
    : j  Z% k0 y3 }3 Q' C8 t: o+ _- e$ |
    有道理。
    ( J3 M1 l0 G7 n- V( h4 n所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    + y) W) M+ G1 |; t2 |( Q. Y; M- ]3 ?* U7 y& Y$ s6 @5 T* W5 Z1 L1 c
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:462 [& _. }0 y+ g- r% Q  K0 s
    有道理。
    & w" U+ g# e7 d8 ?所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    0 d+ x6 x" R% L; s7 j( f: c你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多& J& @# P2 O& Y! [8 m
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:206 S/ c( O7 V/ e- L  H
    这个不是这么比的吧。。。
    + |5 K9 F6 _4 e' Y; R5 T3 f; `$ F' X2 a5 J2 t; h$ I
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    + d' Z6 N& K1 D6 V- I; m
    ) N# M; z  v1 Z" J0 E9 u; q现在的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 编辑
    ! F- {  C4 Q; J& S
    沉宝 发表于 2022-9-25 01:48
    / t& ^. K0 L7 a  O7 B1 W现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    , A7 ]0 D# h" M: G" a. Y5 X
    * N" b0 d+ r' _  @# @是的,兄台说的对。( I: U) ^& h# s' b

    $ X3 O9 w1 M, k$ \9 _9 H% n$ d# d其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% D; S& s8 H% i8 Z
    ; A1 f! D' p. s% h4 L
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    % M1 [# f# F# i: g' d
    8 y# _, a" M/ M3 k7 o! V% l9 O比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。# o; T7 J& t7 k; z# a

    / a" \/ B/ }* a" @" [; B当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 + w+ t% c: `& g
    沉宝 发表于 2022-9-25 01:279 |$ D/ K& X3 V* V, g7 A
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    . W2 `8 ^0 K; ?" ^" `# o) I& [: Y& f' w. Y2 e# @7 f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    5 R: T3 D( z. R5 T: Y7 ?2 G2 }) x/ N- I/ [: V% M
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    0 b1 S" l, G) {' d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ b# B5 Z7 o% Z3 Q2 J# O9 f* ?" Y, L
    时间差一倍的结果可以接受。
    , L+ u7 f) J: d9 a- G5 f
    ; g+ M5 K; |; h" r" E$ s9 q. u你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 0 Q6 k: Q+ E( Q6 e+ e- |
    雷达 发表于 2022-9-25 04:475 P2 ^- ]9 u4 \7 `) B
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
      b( }1 K: n( o2 g- H; y

      i6 }) X( E/ [$ D) P  F& v
    ! v: K- t- s* _4 z( e
    : M" T+ W- T* W能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 C% e$ `* V. z- G3 L2 I, @
    数值分析 发表于 2022-9-25 14:58
    , l4 a' r9 ]0 w$ Z能不能把这个也贴上来,看看和上一个有什么不同?

    : e& P7 m, c& q2 I- \" T1 o7 M理了理思路,重新做了一个测试。
    * n- G6 V/ a  [& G+ }" a做了两个 vector 和 两个 float *, 都长 100000
    " v, x0 ], }6 l, B' \: L# G外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.5 x* I+ y5 C. `/ c+ D6 a. w& N
    ! \( i6 [! @, ~; j: Y
    内循环试了4种方法,& S. b8 C# T8 ?+ W1 E0 S
    1. 直接调用 vector inner_product 247s . l" L/ h8 Y# ~( [
    2. vector 循环点乘累加 237s2 {5 l0 _8 }' K- O% s
    3. float * 循环点乘累加 204s
    6 `$ b' i! f4 j! O6 A+ L! g4. 空循环 100000 次 202s
    , |0 k1 C4 t+ H5 |2 n1 @1 {3 _5 o! s1 [8 x0 T( {. a
    不做内循环 200s
    1 Z7 `: R2 G$ D8 w4 e7 X6 u9 ]2 w' b. }7 v
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。, `2 S1 j: j0 E+ k# ~$ C3 k( R! t: c9 m
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. }$ q: y' N% y5 x

    # @7 P7 T' e' D. Y6 r至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 ^: [$ x( M( P3 i# G5 p
    8 u: H* Y0 r. i; L
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)* ?, R- q' N6 o, P' h+ c- @
    5 D. _6 \' V( K3 d
            std::vector < float > vec1(N);. T2 L- ]; _: ~, j, e" Z# y0 p
            std::vector < float > vec2(N);
    ; ^! W, U5 z# m4 j7 x# O3 f        float* b1 = new float[N];) c7 ?! g$ T, c
            float* b2 = new float[N];
    6 h+ j& m- ~, R* }1 ]( u$ r- @, n4 u9 z$ Z
            for (int j = 0; j < 6000; j++)2 _* ]/ X" v9 K" E) S
            {
    ' E. f- T& R- B+ i. |* J( N9 y( z                std::generate(vec1.begin(), vec1.end(), []() {# ~* B2 x# R# a) @& h
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 X$ A! P5 k4 B
                            });6 {& W# }- H7 D  _) X3 E

    & F7 T2 I5 s$ e, i: ^                std::generate(vec2.begin(), vec2.end(), []() {3 X3 l0 z& D8 q# M1 A( E& ~2 a
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    % [( N* @2 ~, W# `: d' S2 E                        });0 G  ]* C) ~5 L* q" e: x
    7 b' M+ T/ i# K6 j5 }4 d2 K
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ) b+ E% m/ ^9 {" i7 {                {: f, J1 D' H* C$ i) f
                            b1[jj] = vec1[jj];
    ( g- Q, R) i4 z$ g) Y                }
    5 E: x4 g! r# B! {: O* }+ w$ e+ q
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    0 o% g; L" b2 L4 I& z                {
    6 ?+ X  C, Q  f" @; I                        b2[jj] = vec2[jj];  c9 O* Y$ y1 V1 {5 a& X" u9 A
                    }) u3 B# v0 ?: L' a% `5 g% g

    " ^% \" c- N8 V- k( \                //Method - 1  N=100000 247s  
    ; i% T+ E: l# @1 D# F                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    , @( N  P7 H$ o                                
    . t# V! _+ E6 |! `' |% [" M                //Method - 2  N=100000  237s
    , ?5 T- U/ K  d9 Z! D                /*4 k# i* `5 W" G
                    for (int jj = 0; jj < N ; jj++)
    ! B* K# n! |" b8 |$ l                {0 L/ s8 R  T( u5 c( t
                            fresult += vec1[jj] * vec2[jj];3 g7 A1 b5 ?; H& S+ b* }+ Y7 V
                    }& o; f6 G3 s3 p' [
                    */9 J8 r$ c! Z( w9 s9 q
                                    6 n, X) ^' i; h9 L' q2 x
                    //Method - 3  N=100000 204s7 C. ]; w7 J# @" V
                    /*& i5 k+ B' A3 I& {& Y4 j8 W2 Y; P- f; J+ I
                    for (int jj = 0; jj < N; jj++)
    0 r2 K3 H2 q$ l* y                {
    ! ?8 K% c. S0 l6 J# `3 I) [# S) y                        fresult += b1[jj] * b2[jj];
    $ H3 \* T+ S, l6 O                }2 u1 C) D) }. }; n
                    */7 _1 P5 L9 J5 F  L8 q
    4 ]/ ^2 |' [' b' a9 n( |( d
                    //Method - 4   202s
    5 h# h$ [, _" b5 h0 X* Z& M                /*% p6 B2 I- G7 F# o( `6 R
                    for (int jj = 0; jj < N; jj++)
    ) e( [3 E! b+ F  a                {
    0 O# k  q( @8 `, _% I# b                        ; o. r/ U. d* T; x% L9 h% G
                    }
    % i# _# E3 |! P, K. `% a% m                */0 r1 i. _6 s4 M' j$ Y: Q  |
                    //comment out all methods, N=100000  202s                # l# g: t4 h& t9 u
            }6 o; N6 k+ e; U8 ^3 s+ t) I) i3 ?+ S

    3 A& M8 l9 ]6 A6 H  O        delete []b1;
    + H2 ^' r! S& e8 c" q4 Y: P: l        delete []b2;
    5 }3 |% p+ F; }7 O
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. l' b- A- e' Q2 S
    & `/ v0 q, o. ^. @( o8 R- C
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?2 e& t: j2 r8 _9 o+ P( O4 g
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:150 i/ K8 w- n- V9 w. m) I5 m
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?+ g  L/ s2 e2 @1 }2 K

    ' h& h. V2 g5 t5 T' w1 Z. V你第二个试验里面的j在循环里面又重新定义 ...
    , R& M* z$ L  R# Y
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 {9 k# l  |& S1 j2 x7 o

    + Q' C7 F% @8 B0 Z7 ^3 C不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16# i$ n! X* t+ x- c+ g
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    % i, e* _' P* E5 m; A. D) c# V( c! l/ \
    不和它 ...
    , x4 t0 f# H6 P- X
    5 q# [; I+ r* B5 t3 p$ t/ g
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    9 ]5 z2 W' [0 y; t' T1 L6 n后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    & e7 _$ T; |& k& g8 Vvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* W  S8 r7 ?! w0 D4 i9 [
    {: `+ |$ q0 p# g: {0 w# j& s0 J1 q
            comp temp, xtimesy;
    , N6 G/ \1 R+ t: l( `7 Y- B& B
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。6 C7 i- `7 y/ `( e$ L8 A5 n! T; D- i
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    8 L9 G- [' X1 {: i8 sVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-12 13:43 , Processed in 0.073529 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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