设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    5 x) H! ?: Y; v+ [4 A4 \' @  Z. z. f7 `' w
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    % W# w* h$ A& m' Q4 v' H: O  g. X4 n8 M; ~+ u) w  H7 U
    速度优化问题真的很有意思啊。
    , ]) K# c' L6 U5 c' {  e) q3 V
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    5 K- r' z3 _: s+ v把代码贴上来看看?$ _& E/ a2 H7 Q% N
    ; U( ~2 g: H  |6 Z
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    , m4 r7 h1 j  \7 B3 q; ~
    数值分析 发表于 2022-9-24 23:04
    3 U/ {, @" t; f; A* {/ R拉下来?拉多少?/ p' @; _4 ~/ v" H
    把代码贴上来看看?
    " ?. J+ V  W8 K7 c
    / z1 e/ C: G! \
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 T, X% v) d; W
    {+ P9 [1 M* H7 T6 P
            comp temp, xtimesy;
    3 Q8 S8 a7 _, v5 b, b9 a9 v: O; Q        xtimesy.re = 0;1 q# q; c2 r" L6 H! S$ M+ d# |( M: `
            xtimesy.im = 0;
    8 O, x! |, _1 u8 O( |        int j0 = lenB - 1;0 y- j) A: a$ M, J- f
            int    i, j, i1, reali;
      T" c/ O; ^4 E4 ^        if (lenA % 2 == 1)
    ' r  [3 V6 ~' `) a1 q, d& {* S                reali = lenA + 1;/ f8 x! B5 s5 G. y  z9 N
            else
    / c! c- f3 w0 ]0 c: C% b" S                reali = lenA;/ o1 |3 \6 |  F; H7 [6 d
            reali /= 2;6 y$ }3 q. @5 |

    9 }5 d- F5 w' @# p4 K% N0 B        int nconv = reali + lenB;& A2 F1 b* h2 h- L  A' ?1 F
            //#pragma omp parallel for
    , H- X8 _8 s5 `- ]0 S5 U. P- X        for (i = reali; i < nconv; i++)
    1 R% P6 r  z3 Y2 `4 I. H        {
    ! N2 H0 d$ R: L' w, o6 `                temp.re = 0;
    : q4 \* F& o0 f: F$ K                temp.im = 0;7 e) P  I' ]' v: X
                    i1 = i;: ]) Q9 S; x9 J) J$ v
                    for (j = j0; j >= 0; j--)) N! r& l- B' a0 w' c3 W  j
                    {
    $ G5 }3 D- p* u: u+ H3 B% z2 }0 M                        /* floating date operation */, `0 h) z, `  K; M7 ^& D
                    }

    0 N! q- g, A: Z$ T+ r8 v* r. T        }# O) ]5 |+ R7 G" [! i; A
    }
    & o) Y% M3 U* E8 ~7 z- u- x7 m0 Q9 w; X
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样+ {9 D7 d+ i) G! B
    ; b% o; }4 E6 x" \% j+ c. j
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    " Z- O. p" E: ~5 N' K5 ]" Y" Y现在call xcorr 100次,耗时78s.+ ]4 ]4 w. u9 E' k1 o

    ) v. B& ^6 [  D如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    & ^$ u( h4 F# O) W
    8 `  h, E, ~2 R4 G- `+ O, r
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    " O+ Z0 r. N" pMaybe Debug mode?

    0 C. ]5 y# ~) U+ Z& f7 b  I# |) B; c
    不应该,看我上面的回复。
    7 s) Z4 J: P$ P, h/ \; D1 E
    ) b7 b8 Y4 ^2 y- R我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    $ e0 _2 c" n8 Y, }4 L3 g1 I  K6 P
    雷达 发表于 2022-9-24 23:54
    9 A$ P# @; ?4 V+ @4 M7 G7 A+ f' Fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " I3 w  ~' Q0 F% J0 Y{( X3 @% N5 O: O* a8 K1 P
            comp temp, xtimesy;

    5 ~  o% b6 f. F- R- P9 K. [6 o  w) I/ p; a
    这个不是这么比的吧。。。
    # D( f: K1 y! O# |, X# {. D4 {/ X; o  G' ]7 N6 ^$ z! v
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。5 ~9 t1 p# H, u: |1 v

    : j% R! p* p( ^3 P, k: |而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 " r0 g) v4 V, j" [
    数值分析 发表于 2022-9-25 00:20: d0 T( s+ Z& a. V3 T
    这个不是这么比的吧。。。. g) q$ P8 K- f8 ?( d9 ?, f
    7 S0 G2 E( U! ~5 V2 O: t& a
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' K; R  m5 a* o$ [. P" F' S

    ) u: t4 [4 w8 N6 c- P9 H- J" t/ t有道理。2 l8 r* D/ L% `/ j) x" V
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    1 q  x+ v* J% n/ R1 ]& B8 K6 t6 z& b& @& o  q
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    * I" N1 s2 I) ~有道理。; g' ]0 Y' A: L  _: q- r
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    / }1 S$ U8 O$ n' J5 W, m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ' ]3 g/ U9 W5 ^9 N; ?& d6 AWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:206 e$ o7 i2 t6 U9 j2 @7 I/ V
    这个不是这么比的吧。。。8 j: ^- X" p1 F1 X# I

    4 S& B/ z% s) e; D/ i0 w您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    6 O8 \$ C5 F2 g

    3 [6 D* Q3 Q# c0 R现在的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 编辑 . g+ g6 T7 B9 J2 h( Z
    沉宝 发表于 2022-9-25 01:480 J; Y8 [$ \0 `, U' n7 Z7 w
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    # U- q: D* d. T
    ' {* c3 T, Z! V6 F
    是的,兄台说的对。, |! _9 w: X$ ^+ K: b2 e% D4 [* u
    : e* x! @  g" @# {
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    2 g' d0 p5 Q$ t  F3 F: }: x/ ^
    ' f$ ?' K) u. ^+ }; I( g雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。' b- S) R, ?) \# x  r3 p7 I
    % A8 b6 [/ `/ I: m6 N& S) s
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    - x. k% b( ?+ l2 ?6 o
    , H# U. Y+ i6 G9 m) L1 H2 O- x当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    6 v9 v% u- v5 d  }4 G
    沉宝 发表于 2022-9-25 01:27
    6 @- X" K% K' {1 L5 Q+ @你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    1 x/ R4 X0 \1 B- q3 x; }
    5 ]1 V5 `. l% ?3 u又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。6 _" @8 u9 x9 [, d3 d; s! ?6 q
    0 W2 `# p5 j! |
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:478 W# i9 a( Q" W0 M4 w1 u$ ~$ s
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ r9 f& y" h# V3 L; J$ B6 |
    时间差一倍的结果可以接受。
    7 N/ C6 H9 z6 s# R* w! }) A0 ]  w$ o8 E& x6 c
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 5 ]1 v* _2 z2 T4 r8 c0 ]- ~
    雷达 发表于 2022-9-25 04:47( \! R2 C1 S+ ?" p8 @6 t# R$ A
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    9 ]% A% u4 r- R! @, R! A- w( l; B. }' L5 w2 {. v/ A& x2 I
    + E0 }; P& U$ f$ f  E( X8 y
    6 r- F, t- H) C& @# Z
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    ' Q, v0 t+ Z# q0 M- D
    数值分析 发表于 2022-9-25 14:58
    ! D/ u2 J" q+ x能不能把这个也贴上来,看看和上一个有什么不同?
    - P+ E) D% l# [! ?0 j4 [
    理了理思路,重新做了一个测试。
    ! Y5 Y, T% T6 z做了两个 vector 和 两个 float *, 都长 100000! `5 k% n- m" Q) h7 y  p5 t
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( y. h5 D( O$ V% K9 V  |
    ) B" P  i- e$ B8 g! F) c4 _) ~
    内循环试了4种方法,
    # p: a! c' \2 ^/ p! n- `1. 直接调用 vector inner_product 247s 9 P* C+ R! ^/ @% n
    2. vector 循环点乘累加 237s
    * A' C5 Z5 x0 r3. float * 循环点乘累加 204s  @1 _# J/ d2 U7 E3 A
    4. 空循环 100000 次 202s
    ) k4 M; [! N7 p, ~' I* k. h3 T
    % Y3 d1 V% F& w不做内循环 200s; x& t- Z4 A% U0 \
    ' x) D' q7 x# X# x! n2 x" x
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 X2 J. x5 f/ Z( F) M% K
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    2 Y0 C9 c. E) s) \
    - D2 M3 S0 Q8 I& C# P至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    / y+ ~7 O$ R! z, a) |( |( R& |$ N2 B' w! e
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    7 a% Y0 P1 z# C3 W- l% Z' ~, i" e% Z5 t1 }7 K9 @  ?/ O
            std::vector < float > vec1(N);% F; H7 e4 |" }1 e# E
            std::vector < float > vec2(N);: R- p6 X0 i" }9 w6 R- K1 O  t
            float* b1 = new float[N];
    & d# _* X1 X0 b) l        float* b2 = new float[N];
    9 q! v0 u; F+ Q$ O4 Q4 B+ ]9 `, Y9 o, Z' ]) U0 [+ H; o3 Z  A  z
            for (int j = 0; j < 6000; j++)
    ) [% {! }4 x6 x+ p        {) l( q1 o6 k! o; T* g
                    std::generate(vec1.begin(), vec1.end(), []() {7 Y4 @$ t8 _7 z9 f
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    0 {6 `0 g: T5 u5 F: h) ~5 S                        });
    8 j/ c1 I2 ^: d# y% Z3 B4 M
    - p  K# M+ O& |& T4 w. ~                std::generate(vec2.begin(), vec2.end(), []() {; h, S2 }3 |# [+ b, F! K- I" g
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 A# w2 @% a' O
                            });  n7 J: V2 J' p% M; [: m# Z
    9 `  H8 ~3 t8 M8 O
                    for (size_t jj = 0; jj < vec1.size(); jj++)7 U, {$ M9 p7 Y, s( H2 i  n4 y0 j
                    {
    ' D: b5 R1 A6 l8 a- \# f4 T                        b1[jj] = vec1[jj];+ |' B) \" E7 Y1 E# X& D" K! w2 _
                    }
    - @# g# b: _5 m6 t5 L  R5 v6 [- ^  [6 Y; Q; N# o' @  S
                    for (size_t jj = 0; jj < vec2.size(); jj++)  B, u' y  z. {9 X: f1 X; R
                    {/ N; d' k8 X$ l8 o
                            b2[jj] = vec2[jj];
    " U. u8 C7 V& P* M: @6 M8 K1 ~                }
    " W4 M1 ], f& }  o, O. l; b: \4 |" X  i
                    //Method - 1  N=100000 247s  
    6 h% q3 I, ?5 F% S7 a                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
      M' {+ J6 G7 b; r9 T                                9 D9 ~  A) Y4 m1 l/ F' [# h
                    //Method - 2  N=100000  237s. Q' h7 ?. Q& g8 Y% V
                    /*
    9 @$ ]6 r5 d! X& Y2 \                for (int jj = 0; jj < N ; jj++)
    8 @2 p4 r3 w; {+ ^" R7 R; J2 b8 l) x                {8 G& ~0 B. x+ d! X1 Q
                            fresult += vec1[jj] * vec2[jj];, `. p0 c& P* G0 |7 Y2 o; o& @
                    }
    . _/ d/ _: A0 o* ]$ b                */
    / u! d! Y& G/ e7 c1 y                                8 \% b- W% S- q$ `, m
                    //Method - 3  N=100000 204s/ ?" M5 g( t/ x+ R: ^* E
                    /*. V% z! z. |5 J. g! t) z( r' t; A
                    for (int jj = 0; jj < N; jj++)
    5 {' l5 b) d! S: I! P& u                {5 a8 b0 F  h: e$ ~) O
                            fresult += b1[jj] * b2[jj];
      f! f5 `1 }/ n( }( Q                }" E% [0 @( {. L) I1 I  w! p$ L+ r
                    */
    / }- {2 K# }, G) Z% x* ]. Q$ Y8 N  A$ J- |8 e! j2 p0 g8 C: ~. i
                    //Method - 4   202s+ S7 s$ S6 g3 n4 R3 ~
                    /*
    $ ?$ l2 Q4 w/ z. v                for (int jj = 0; jj < N; jj++)& |# H3 N9 H3 K  f2 ]4 j! Q
                    {
    7 L7 N! ]+ ~$ q9 J' Z- `3 I7 K6 H                        
    6 W; x: z) M$ H6 H0 q: s+ }; D                }$ x' w- L" M0 g* ?. r
                    */! `7 Z% [! `$ W8 D
                    //comment out all methods, N=100000  202s                ( E9 U9 F3 i. H! r/ M, q
            }
    ! r/ ^/ a! f$ i) Y! s
    $ ^# c" J2 ]9 }        delete []b1;
    5 q8 l: j3 X4 {8 t( F        delete []b2;
    & e4 r  r( v' l# j7 }! n
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    . \. n' v3 h* o+ v9 Z) r$ ]* E
    ) w! Y1 J7 |2 J6 V- _% R你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?2 I1 k3 O% }: `
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15) b, M5 Q8 h9 K8 Z. A& q
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! }# C- C( r' m& c) R
    2 U8 T  D9 b* y" j你第二个试验里面的j在循环里面又重新定义 ...
    ( h$ }7 ]" m8 A9 k
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    3 n7 {$ c+ s2 \0 C) V; ?% W$ w# a) W. _" F
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:167 i6 R% o5 l/ \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    / F/ ^; m' s; p' f( W( ^% N$ f* x9 M0 N. N) n. Z- I4 A: H0 y7 }
    不和它 ...

    & h) t- g- V$ J/ _" M/ U$ V. a. p! r$ i# ^& l. m2 N- k
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。" G/ E- t2 V: ]/ y2 m8 W
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ( C# `; Z$ E: \void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    6 j8 j- m3 {$ }+ m{( p2 U- [6 I& H- Q' {4 p% h" h
            comp temp, xtimesy;
    7 T' S+ J5 F# o, j, A
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ! ^' B) u7 I8 t& _" X, c( D( ~内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ; I  M. e# S/ n2 ]; H6 ^VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-15 07:47 , Processed in 0.070380 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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