设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    8 W# U; c  l: N; S6 c% J' G! C& ?
    1 C3 ^9 S( w- l" j自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。* G; A' o1 ]- U$ j: m" u

    " j1 C0 ]0 ~$ o速度优化问题真的很有意思啊。2 z) p; M; Z* P! k% p2 c

    + Q5 C% C6 R2 m! V* s/ d欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ' E3 e( o# q' f# k把代码贴上来看看?
    - F! O0 w* Q  B. J- Y
    4 H' ~! y+ c. o6 W难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 & m2 O% x4 c9 A  H. E2 V" S" e5 d
    数值分析 发表于 2022-9-24 23:047 O( M' p( Q/ ?: N/ N
    拉下来?拉多少?
    6 k- P/ g# L) v4 @8 [4 C5 F* F把代码贴上来看看?

    2 `/ l5 u5 u- L
    4 h# {# j1 L8 s1 Pvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 d1 n; A  M+ ]  c" ]5 Z: w+ }
    {; d$ F1 x5 K3 _
            comp temp, xtimesy;
    # ]* k5 ?$ ~2 ]8 j* z( _( Y        xtimesy.re = 0;
    & m( b  x0 T3 V8 H9 c% [        xtimesy.im = 0;
    4 W5 k1 d5 U$ a& I$ O$ u  H9 A        int j0 = lenB - 1;
    8 c3 j' h6 a! k' f        int    i, j, i1, reali;
    & `! B- }3 E2 c8 e- `( u& G% w        if (lenA % 2 == 1)
    1 t& @% K9 ^- r/ @, s* o' h  t                reali = lenA + 1;6 }6 _5 C- F; k7 Z- r* p: b* `' O
            else! H' ?7 n$ b! O& S; s( X
                    reali = lenA;
    ; \' L" M6 J! r% n2 Y- Y        reali /= 2;
    ! Y6 F5 i( q  M+ {! Z3 U9 n
    ' f! x& Y& x4 _' B% G5 T- q        int nconv = reali + lenB;
    * K' e3 N; F- l* i; g( B- m        //#pragma omp parallel for( `; ~- I& o- ^+ k# v  k
            for (i = reali; i < nconv; i++)
    8 S; G4 E# _) s" F  c        {
    , s2 S$ S3 f# n, R& O6 W+ N$ b                temp.re = 0;
    2 Q( J5 M4 M! \0 J; e% H1 ]0 T                temp.im = 0;
    / Q$ d$ C5 K' w. `4 N, s( u4 F                i1 = i;
    . q0 g2 l2 r" `0 b                for (j = j0; j >= 0; j--)$ q  u# h; r. A# L' \( I
                    {
    2 N6 x# M4 N* B5 l                        /* floating date operation */
    : H' Q4 a6 x9 `, b. E  \9 v, a                }
    * ?+ |$ K" Q" l" [: L
            }
    # k5 o/ L  n- H}
    & |' p' ~4 Z) i4 }+ L6 T+ d* w- k" t  H% C* T) s+ r, c4 D
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    + d5 _( r2 b9 x0 P- M) W1 ?& M& u% W+ C7 q
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    1 O, p& W+ h0 `* @8 I3 L8 P现在call xcorr 100次,耗时78s.) }) X% X0 N% Q2 W2 d( v, }
    - q& r4 N4 M+ X! R
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    . `: p  z! {- y8 u0 E/ u) N) `, |* T* M2 C% d1 g5 s( \9 [! t
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33: [0 O4 r4 A8 Z4 y- N
    Maybe Debug mode?

    & y5 G# {  [& O) L4 J. }  E/ o% J. A: h4 p! ~1 {3 M( T
    不应该,看我上面的回复。( C$ P- l2 W+ I' O8 Y. U! m/ x+ B
    " |1 p* q# G* y: _. \. t- k
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 5 o* v" h- s6 c& a: \
    雷达 发表于 2022-9-24 23:544 y2 h# h0 Y* j( x7 |7 R0 k$ A- b
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 O/ C' A  l; Z
    {
    / p! X) E+ O1 s: J        comp temp, xtimesy;
    + h1 o+ V: K; P, R' @' d
    % k3 c/ _5 h7 B4 P" ]
    这个不是这么比的吧。。。3 l/ _% p' X: E$ n% o
    - P/ q" \8 K% g  U9 w
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 \$ y9 l7 _9 [3 B. t% P) ?- Q$ R# f4 G9 \
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 : q& U) u3 `- i$ W3 m0 }. n* t
    数值分析 发表于 2022-9-25 00:20! a  f. m& s7 t! f
    这个不是这么比的吧。。。
    4 B1 _8 L3 o$ V6 X: q& Y2 Q8 _% _7 v/ B3 e$ Q: y  n6 _6 F
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    * ^5 v) L, y6 R- Q1 z" n& F( Z! V8 T( A* q7 R& \/ ?8 v0 H
    有道理。
    ! @' O! d5 }3 @4 L5 G8 X+ E所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ' v4 [3 b( W7 C
    ; j6 Y' P* k+ A; F+ ^. h% I我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46* O% J+ q' X& n5 K7 ?
    有道理。  [1 _' R/ `- L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    5 c( e% A# N) y2 G' ~2 h5 @
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    9 @: i5 V* w1 R0 f: f8 ZWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:205 \6 v& B3 P  ]" m
    这个不是这么比的吧。。。
    ' g% b9 O/ U, Q. B, {& x
    & i! ^% c0 ?9 {您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    % j. V3 e4 T: X8 y
    5 G% ^1 S9 F) W% F
    现在的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 编辑
    4 X/ Z: a* i1 N. V6 m: g
    沉宝 发表于 2022-9-25 01:48* {7 D6 r2 {- j/ q$ r
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    3 k: J; g  @* C8 l8 n8 X8 Y8 a
    , w* N* ]2 ?9 x2 E4 ^) V* T
    是的,兄台说的对。/ N: Z: E4 x8 `7 z/ c

    0 w; \- G8 t5 Y1 ~7 C其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    9 |" v& u% a  H$ B% k5 n3 k4 b3 s0 w. t3 _
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。4 [0 C9 N1 u! v1 g# o

    ' u- m8 O. w" L比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    , h& ]7 p* e$ ]# _# T" Y' h9 g, Q  @' `  f; a# A0 s
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
      @4 d9 W9 O, @6 e" i
    沉宝 发表于 2022-9-25 01:27* z/ A* Q& x( p/ c' K
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    3 d+ Z6 Q5 E; Y6 ^2 }% D
    , I3 N: ]8 g2 F& O+ F+ `又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。7 H$ M4 X2 t8 C7 ?

    4 R0 {# l2 {. _我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    ; F0 s4 i" A. k) Z时间差一倍的结果可以接受。" D$ I; y; [- J$ C: Q0 ^
    : F2 r8 \: V. w' v8 `
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    * e8 t4 j0 c( u- ^
    雷达 发表于 2022-9-25 04:47
    * ]- Q# P0 v: l* X又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 C4 X3 f' }, @; l! k+ p# K4 M
    * d2 Y% ^. o- t* X4 g6 n: n1 Y
    ! G& c5 D! F! l- c
    ' Y7 X* A% L; L5 u
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    3 |7 g) E7 B, g) T) ^: ~! F/ P
    数值分析 发表于 2022-9-25 14:58, _4 ~) {8 ]8 _: m
    能不能把这个也贴上来,看看和上一个有什么不同?
    7 A+ {* R  b9 h2 |, E* t) r
    理了理思路,重新做了一个测试。- y# f, f$ @0 w! V; r6 ~# f$ ]
    做了两个 vector 和 两个 float *, 都长 100000
    ; L1 f0 a) s$ l/ `6 p外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 v' o  Q4 {" X& d. h
    , J- a# M7 V9 ^7 X8 X3 i
    内循环试了4种方法,
    : ?( m' Q9 T2 j# v1. 直接调用 vector inner_product 247s
    0 m6 a# B1 D' \: k+ u+ v) C8 V2. vector 循环点乘累加 237s# L, a  n. f: y2 o: O* X
    3. float * 循环点乘累加 204s+ L  n# y! O" i. V+ R
    4. 空循环 100000 次 202s
    , J: s/ v8 v* X* w  W0 {1 X# M# w/ t4 J7 I) m
    不做内循环 200s
    5 S( A1 Y7 ^0 b
    - k+ u/ _+ n" Z/ {8 @+ ^! S$ U你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ' V7 U  X# @& H% a  S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* K9 |$ \5 A( V: _+ x) n* R1 e& T
    , Z: I, v# w& {2 A7 v" W
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    3 \- H4 G( P2 `/ E# V- H$ [& E
    $ d1 r- B5 n& S0 w, [/ t5 O(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)$ i2 `% a  y+ W
    1 H* t1 ]  ^& m
            std::vector < float > vec1(N);
    - s$ C9 m8 R3 H5 e7 J        std::vector < float > vec2(N);
    * t) W8 j2 c' R' f8 p1 d) I6 [        float* b1 = new float[N];  T" G# n: R. V
            float* b2 = new float[N];& I: B7 I1 C/ g; E8 [* w) F

    4 M7 v% S$ v. z        for (int j = 0; j < 6000; j++)& h; H! z* B% ~. Q; P7 v
            {8 c; N5 J/ t: M6 N9 j
                    std::generate(vec1.begin(), vec1.end(), []() {% q; B4 \9 N; I! t4 L+ Q6 I
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' c9 @- S( T. F3 ?) v
                            });$ x6 R. R; N8 h3 ~- y: r6 b$ ?

    + E& }) v& P: P& S; f                std::generate(vec2.begin(), vec2.end(), []() {
    " M- F7 t8 o6 A- y, W1 o                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; @# P8 R- n' o9 I* i
                            });) b2 g9 L; l$ b: b, s. p

    * f0 ?1 H* W- Y- s                for (size_t jj = 0; jj < vec1.size(); jj++)$ W7 Z& ^6 x5 [0 Y3 e1 \
                    {
    % ~! Y+ V( @* I                        b1[jj] = vec1[jj];  M: J6 M( q/ e' ]/ Q
                    }# a: S- l; g+ L; M7 h7 v' U

    / w. G2 g/ i% H/ p! S; N                for (size_t jj = 0; jj < vec2.size(); jj++). w: y3 X6 L4 v% a+ {/ ]
                    {, r( E# ^# {' Y+ ?/ d& I3 `& l
                            b2[jj] = vec2[jj];$ D9 h1 O' f' L
                    }7 V6 `2 L. B5 |& w" s& y* }5 I
    # Q6 z$ J% g, W( \9 ^
                    //Method - 1  N=100000 247s  
    3 X' M7 h3 S8 m" F% r5 k                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    7 _; ], Y& o$ @( w                                ' ]$ G7 m. k& ^4 v/ b. W, v
                    //Method - 2  N=100000  237s
    1 T/ [1 T; A$ {; g                /*
    % k  V7 n3 v; i3 E7 A2 j                for (int jj = 0; jj < N ; jj++)
    7 C6 |1 j0 n% p                {
    6 _/ C# @- S4 j( e$ Y; {$ ^0 f                        fresult += vec1[jj] * vec2[jj];
    4 v" [5 O4 K8 ~4 S2 b                }
    0 I$ V3 Q$ S+ b                */# l4 o( n+ Y5 d. b) M: V
                                    2 K0 `( q7 C" r( u
                    //Method - 3  N=100000 204s! t, s  ]* p; B# w9 j
                    /*& g- _/ f7 j6 a
                    for (int jj = 0; jj < N; jj++)
    / _* w. R% M6 C+ G4 @& j                {$ P4 F7 U2 E0 t- p# ]
                            fresult += b1[jj] * b2[jj];
    , \8 u" }; a6 O1 s' B                }
    & z" ?+ m: z. }/ |2 f9 _                */
    & w: g# n' w1 }( `% M  t8 i2 E0 x! V
    1 R+ q$ v- x" d9 t: F' C$ O# Q                //Method - 4   202s
    % i; W8 b( q0 _, V2 C/ M                /*
    7 j0 `- d" D% V; R' ]                for (int jj = 0; jj < N; jj++)$ s  p* P$ X; {
                    {
    ( \2 A/ |7 l9 e' a2 I9 g                        
    : x' b9 G/ t  j- j  u                }
    . Q$ t$ A) s. }2 t' e                */
    7 v2 Z2 s' B3 p! ]                //comment out all methods, N=100000  202s               
    ; i3 w+ G3 ^8 t7 v        }5 _7 B8 }/ g# k9 h8 X
    & y& F- N: E  S  G+ K
            delete []b1;
    $ T4 a. t0 a: H/ r  D        delete []b2;
    ! W1 f- r! l3 t( m/ C. m' [- f/ f
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?- w( B$ F% l/ ^/ r& s6 Z3 T
    ( H2 G8 B: ?8 g
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    0 P3 J5 }$ g4 d
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:152 v* f1 u5 E. O4 y' x& I3 c, |/ B
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 ~& s$ D$ d% }0 u  a: b! v9 G* I# T+ [& ]$ V
    你第二个试验里面的j在循环里面又重新定义 ...
    7 h" J# w! P$ [/ W) [
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL* S* {+ [, Q' ?5 X; C, t2 V, p' i
    & b0 Z! i4 S. @
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    # U: c2 L4 l( x1 B7 k  M- ^内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    7 Z# x, {6 U- q7 R4 a# {1 Z
    / F+ o* d' x  O! k4 e7 q& n! e不和它 ...
    " ]2 k6 m9 O0 j; m/ O3 o; I
    0 N" G+ l0 C* l; a
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。. s) Q7 e3 q8 w6 p6 x5 n) c
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54( `0 p) e$ m6 d0 p4 ~
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 f/ \% z: q) Q% V' k( a( O
    {/ f+ e6 \4 I9 Y- i2 ?4 }9 E
            comp temp, xtimesy;
    7 D$ D3 h' d2 H$ b" X% R- J! j
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    6 n# K1 X$ p2 f- Z! y2 {  y内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    + |* [% T/ k1 W* QVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-18 04:03 , Processed in 0.066884 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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