设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    & b0 O5 D+ \: F! G) V( ^# Y5 f# R2 d0 q- n5 a" F+ ^5 v3 r
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    + A3 \. [0 L3 Z1 A% x, q' S5 C" o$ N& K. k: l. I. `2 M
    速度优化问题真的很有意思啊。
    / I0 }6 d# V1 `2 f5 @1 j) ~5 n* G
    / \1 \& Z9 G( Y1 ?. b欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?% M: B, S- q( u: `8 g& a
    把代码贴上来看看?
    % b6 s7 D, O1 V0 o: a. M/ }3 p( d1 X" w7 t' s
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    ) G1 p& n7 R; @" z7 ]/ V" X
    数值分析 发表于 2022-9-24 23:04
    7 _7 N1 Q2 G. D2 T拉下来?拉多少?
    3 h! r/ D* F& V" H$ E把代码贴上来看看?

    % g: m9 D  }! A# u2 Q3 }4 z
    6 t7 @: l$ I0 Z! u( e( T% B' avoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    / W" m" G+ c4 b9 }; q( H( s6 M8 T, L& E2 l{
    9 v2 ^8 P) N# w0 R! _$ z+ S        comp temp, xtimesy;
    , c, z6 ?; Q6 n" x        xtimesy.re = 0;; }& ]- f; Q5 n3 @7 g
            xtimesy.im = 0;6 s9 r  |/ l7 J( C, v
            int j0 = lenB - 1;  a  O. M' _9 }& A! \; H
            int    i, j, i1, reali;
    3 {% k. W! b6 [4 T4 I% [3 C- G        if (lenA % 2 == 1)
    , e4 b/ Q2 a0 }" u                reali = lenA + 1;9 O2 O. `, Z4 i+ I
            else: o* z. w# |- `6 E$ k4 R" y
                    reali = lenA;% u0 y( X% x; m/ b: S
            reali /= 2;% t7 a  J, n: D7 n; v9 O
    9 g; Y6 A  o3 P5 X2 K
            int nconv = reali + lenB;
    9 A, X# Y2 [: z+ X3 D        //#pragma omp parallel for
    ( y+ C8 T0 w$ q" |2 ?        for (i = reali; i < nconv; i++)7 W1 z9 i7 W: `( P
            {
    & O. h6 e( i4 w9 g                temp.re = 0;+ O  H+ p: I: W3 a8 W
                    temp.im = 0;
    $ y: q% L: d( K: b                i1 = i;- Y& _5 J4 W. ^7 j" ^
                    for (j = j0; j >= 0; j--)
    $ S9 p  v9 z! L                {
      f0 |* y% U! s3 d) C, e) v7 k1 F                        /* floating date operation */+ X& T4 S+ C4 u& `* `/ |* O$ r; P/ B  u
                    }
    8 H# z6 k- |  Y
            }! l, ^& a8 T+ V" S0 z- ?- q& |
    }
    % d( Z. q* t% B3 s: S. J0 X! h# ]; o/ T6 j# W9 C
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样+ G# c; u9 F5 j4 p. B6 p  V  _5 C2 k

    # M. G9 j$ f  i" W; m5 |6 X红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。2 x8 |+ e- M4 ~3 f/ L; J" s2 Q7 C
    现在call xcorr 100次,耗时78s.
    ' k6 L6 }$ R& n$ N3 A. O. l4 j+ z8 U. B( X
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    # T" [# U" x+ n- ~# b
    6 b. g6 X: l) I" p) q5 h, e8 {' t
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    & w7 c7 ~  F% i$ L+ B6 ]Maybe Debug mode?

    8 f4 T* V2 e! D& _: H% `. j2 J- i: m5 }
    不应该,看我上面的回复。( ?5 g6 b7 n* q& x/ L  ?& c9 Z8 A

    / Z3 c, C+ I" R4 k4 O我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    5 N0 K, I. L5 n& r' b! c$ s
    雷达 发表于 2022-9-24 23:54/ B9 E! P2 c: m; ?# Q
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ }$ F+ H8 e. a2 i% a, R8 J
    {
    ) R8 \; R; M! ]1 ~, U        comp temp, xtimesy;

    ' ^# O4 ?6 w2 G. H2 C# |* j7 ~% v/ t' t
    这个不是这么比的吧。。。
    % v! ?5 d6 O1 g& |5 G
    0 N9 `; Z7 n' h* g* y# ~您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    7 o" h+ e0 s" {7 x% e  c
    & W/ _) C! ^& O  J, D; e而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 - V% j  Y, O4 U, k* n+ _
    数值分析 发表于 2022-9-25 00:20" l4 R: I6 P. b# b
    这个不是这么比的吧。。。
    ! B$ a# M) C6 l) w% n( d
    1 r+ K0 z# n+ ^% |+ p4 P! E% u! |您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      H& c5 }3 I: r0 A( `! \

    8 X" f8 v0 ~/ U, t0 H有道理。0 j5 C- Y' }  t
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。1 _: \4 ?5 A# g

    - C4 T8 P- F, ^/ S! ~我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46! l) I5 b% Q1 ~- _2 o+ d
    有道理。
    ' n: L* d( d7 P0 w所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( V8 b0 n" r1 _0 ?你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ ~0 ^* S. P, i$ |) S9 LWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    8 p; T5 P$ M% k/ [这个不是这么比的吧。。。: C  q" q2 V4 b: i9 c% R8 U

    5 ~5 |" d9 y0 p) D您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    9 K8 A, k/ p" p. a: {) d! i
    5 V' @1 \0 `0 f- ]6 k% q* d9 X6 M
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    6 k4 c- p9 x# F4 f
    沉宝 发表于 2022-9-25 01:481 n. V8 R/ S& H- d- K
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    : n2 t8 D* j$ Q' N1 v' b: R- \! U/ Z  N5 x( _+ Z! p
    是的,兄台说的对。" O2 i3 t3 K; U2 _( b* c
    5 [% b- K/ F: H0 Y  h; v& e" r8 H
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    9 o1 j  j( f0 y3 P. S* C7 S) ~8 O
    1 o8 W% o: z0 x, l2 o9 |$ B: E雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。; X+ i. Z7 M; c. N0 I: J& w1 _
    9 n& Y# X/ c: q: v# w
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ( C- d- L! V; d0 x% L0 _4 r( E) n
    # `4 S5 G. @3 o  V2 b当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    - U! G/ \& P; a
    沉宝 发表于 2022-9-25 01:27
    ; s7 r& Q% x' G' n- y  P  j; W你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    2 H; r( d6 i% E. k$ K* O
      p$ W/ g  F) d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    1 s7 t( [; F) ~/ P, U# w3 W$ ^9 ?; e+ l. R0 t- R
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    4 o9 v2 T4 N" e+ v又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " J/ f- x+ c+ F4 K  ?; v7 @
    时间差一倍的结果可以接受。3 i; r# }9 g3 a" X9 [$ Z) j
    8 g/ N& @1 O3 T, X# i( m7 e% Y
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:39
  • 签到天数: 1949 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    0 k6 i7 X# D( x8 |
    雷达 发表于 2022-9-25 04:47
    , Y) }) v3 B/ k* ?$ c又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " ]5 i3 r5 ^: Q( L) ^
    $ m1 ~& C; {+ J4 r

    # y6 L, s  T* \& b' q, ~- P5 u4 W  d/ w# }, y' H+ e6 g
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    % ]" E( u) j9 K2 q) T
    数值分析 发表于 2022-9-25 14:58  d# T/ a' _: V* {
    能不能把这个也贴上来,看看和上一个有什么不同?
    ' q" h; K+ }7 H" t" J
    理了理思路,重新做了一个测试。
    : h- k, m; u) b4 O% r做了两个 vector 和 两个 float *, 都长 100000. L* F5 C( K+ U: E8 [1 Q3 P; Q$ G
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    + ^- l0 }( @) a6 P  M0 z
    ; V, I, z' }9 ^) }内循环试了4种方法,
    ) k+ Q. p/ J/ q* t' Z* }1. 直接调用 vector inner_product 247s
    % e6 F0 J* i0 @, N- B6 v2. vector 循环点乘累加 237s( v$ y: ~9 m+ n$ F" e
    3. float * 循环点乘累加 204s
    / {) C6 m. _! R9 W4. 空循环 100000 次 202s) M5 S4 z7 X3 z- Q. p

    8 C, X# T$ Z' ~8 a不做内循环 200s
    . {! E$ B) M9 e! x: @% A* T4 h  B; J" z; H
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    * S! W( y4 l) j; X4 k另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    0 w2 i2 u" U+ w# j/ v5 c
    0 u; v" C1 K& V至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    % W4 g# z3 g8 S2 [7 p
    ) }  t" l! a% u. Q; L" V, b" i(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    1 t# X. h# E; x: o
    3 {$ }6 a2 \1 b7 b5 j. P
            std::vector < float > vec1(N);
    # B0 x5 ?! \& `+ N' w0 G        std::vector < float > vec2(N);( y* B0 g  l' o9 l
            float* b1 = new float[N];
      k, f* _% V. W7 N        float* b2 = new float[N];
    0 G, _3 j$ B( S6 d$ g: W5 X5 A! p
    $ [* {) b8 h/ h2 n; ^. _        for (int j = 0; j < 6000; j++)3 h$ l* _% ]& w- R
            {1 J: {( H5 W7 u
                    std::generate(vec1.begin(), vec1.end(), []() {
    " F. s* F8 ~/ g                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; a' Q% n% l( n
                            });
    * w8 w1 d  \. d+ K) ~, e
    % ]7 x' V0 F3 l" r& p                std::generate(vec2.begin(), vec2.end(), []() {) S; [6 f6 d# V0 ?* J& _: C
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    2 t0 T# q6 [0 L$ |                        });/ o4 [) T( F% i- f$ H  v

    " |2 X0 C) G6 ~2 z$ P6 {; Q2 N                for (size_t jj = 0; jj < vec1.size(); jj++)
    6 |, i' M- Y; _$ T1 b                {
    ' S& T4 @' l" m  w$ d( Y  D& y6 O                        b1[jj] = vec1[jj];
    2 G4 z% Q4 x* u7 |1 o2 c                }
    0 J9 Y$ D7 [7 L4 ~/ X
    1 S+ [1 q' i+ D5 s7 \: {! M                for (size_t jj = 0; jj < vec2.size(); jj++)5 r- }4 {' [0 M( h! \
                    {
    4 ]* L2 ~/ z, k+ B3 A, t. r6 {                        b2[jj] = vec2[jj];
    ) a. D* t$ Q. ?5 z3 m% I; X                }
    3 s, S& R/ Z8 {1 M' i* K! k8 c5 ^# G/ o' g, B7 f; s
                    //Method - 1  N=100000 247s  
    1 V/ y4 x4 o1 y/ _9 n                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ N* V# m1 L8 z. y
                                    * P* Y1 J8 A! D8 \; R
                    //Method - 2  N=100000  237s
    / e& ?; f: f( c( ?/ R                /*" P. e9 l5 X1 h! j6 r) j& M
                    for (int jj = 0; jj < N ; jj++)
    9 s/ y- I, I# J4 X' U+ j9 k' j                {) |! c' @- o$ B8 |# a
                            fresult += vec1[jj] * vec2[jj];, |3 ?1 S! N6 E) w+ J7 ]: ^
                    }
    ( [$ t+ X6 ~' c9 y' g                */
    ; n$ j0 Z" U2 h0 R' a$ S/ b                                
    & `7 ^8 @: x) n+ n' |8 A                //Method - 3  N=100000 204s' i; I( t. n: R) E' W
                    /*6 Z9 d0 r  _6 n5 t
                    for (int jj = 0; jj < N; jj++)
    " W7 _6 W* q6 i                {0 ^7 ~3 Z8 @! i; N; t0 J! ^
                            fresult += b1[jj] * b2[jj];
    ! K- X0 N$ A! W                }3 Z* E0 ?! m+ R6 q6 o
                    */8 \2 }, T- M1 x- K
    % m8 V6 @* d) }
                    //Method - 4   202s
    + ^5 T8 M8 O2 E$ i* w% `% _0 }                /*
    2 W) M/ \' y" @                for (int jj = 0; jj < N; jj++)9 B" c! C; U5 A* ~  _0 H
                    {
    . W3 b: I2 y2 L) ]                        ; ]) w$ ~- ]9 |; T) V* Q$ J# Y: d
                    }
    3 z% }( ?' u2 r3 g                */8 M4 h% w# c) {* J( E+ T' b0 l* e
                    //comment out all methods, N=100000  202s                - _+ x9 r; H1 E: ~0 Z
            }2 w2 Y$ G: J" F6 p. r

    " X& p% ]5 o' m# O: V        delete []b1;: E9 O' j" H4 \  i* T& E5 W
            delete []b2;
    6 X4 N" n, f/ ^1 [5 J
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 I% N3 T# e- w# Y4 `
    * M. }, \+ n8 i: J9 G; e5 |
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?8 C1 O' ~9 t7 w: X: ~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15/ L% t* }" G$ t; l7 p( |8 K* q, R
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?9 i) K. q6 k8 U, Q4 d

    ! @2 o% p, y2 x2 A7 i你第二个试验里面的j在循环里面又重新定义 ...

    ' s+ q. q  a% H, i内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 }  f6 W5 ~: B* A- L5 `+ I; q! u# s$ j# m6 b' m
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16& s( N* x8 V7 f7 Z* U
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 y( @/ q, Z$ z+ f3 k& o

    % y+ p* s& _9 p* c# V3 b* Z不和它 ...
    ! h8 n9 R, V9 X9 z
      u. S: F, w! F* J- b
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    5 q! d5 ^2 Y4 K% \5 [后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54  Q2 g. u1 p/ a: [/ O7 M6 Y* t
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    1 j% r: e9 \) i5 J{( f# p! d# c* @- Y2 `$ J1 l
            comp temp, xtimesy;
    + N3 {8 F! \! C- s2 D3 L# q# W% G
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    . m6 ?2 v) a8 |  l' E$ H# d' c内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    2 J' N" S# q; o9 B, w6 eVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-17 13:54 , Processed in 0.044135 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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