设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    7 O# e& W; M$ V' C* M2 q  ~4 G( Q/ k" `  b
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。- D9 i- g0 `/ T; u6 a0 |, Y
    " n/ |* x4 b" ~3 W
    速度优化问题真的很有意思啊。
    $ I0 f% i9 g, `' i# g% V3 [* @# r0 |& m/ `$ w
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?3 z" @7 U( @" m8 @7 L2 D
    把代码贴上来看看?  k/ \+ s( R0 i3 G: E

    # s! {+ v5 V% C$ j- ~难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    8 `9 v, x/ w. q+ Z
    数值分析 发表于 2022-9-24 23:04- u7 }8 f! N/ {6 B
    拉下来?拉多少?8 E3 J6 b  M* ?$ J
    把代码贴上来看看?
    " P: m" U2 H1 g

    " ?/ r9 ]3 f4 t7 ~6 h( a9 qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; Y5 R4 J8 r- K' W! f{
    * h* W% t% Z' s, N% Z- F5 A+ S        comp temp, xtimesy;9 j0 b/ E) t" e+ T! P, f" I
            xtimesy.re = 0;$ L) E' ^# U: b4 J7 {8 U. @  H
            xtimesy.im = 0;
    ; k' V6 g- {- y# p        int j0 = lenB - 1;
    ; q" i/ c) s( l5 X        int    i, j, i1, reali;
    4 Q" |2 C& O! I        if (lenA % 2 == 1)7 d0 e  k, F! r1 O# P, A- F
                    reali = lenA + 1;2 I  r( G9 c8 s
            else! j2 z: R( |' b( q2 H
                    reali = lenA;
    , R" w7 q- c7 N5 {6 L" B        reali /= 2;# A0 z" [9 V) `% @3 Q! E( [* k8 L0 W

    4 Y  X, k, T; k        int nconv = reali + lenB;4 J8 K) u8 d4 `/ h
            //#pragma omp parallel for
    6 P. U. L# U- J        for (i = reali; i < nconv; i++)
    " t: j" d8 u6 V8 G8 Z        {+ g5 `# v4 u) h, W+ L! R% r# s
                    temp.re = 0;
    : _6 f! k: e! J) {8 _$ q1 y2 X, J                temp.im = 0;
    % p- x& n; C/ n) w8 h                i1 = i;' f6 D8 q- n# T: r4 k
                    for (j = j0; j >= 0; j--)
    ) B" L+ W9 n, r' i3 p+ X                {- P: g+ j7 y/ j5 ?
                            /* floating date operation */8 `- P0 W' S& c, D$ ?" \
                    }
    8 w% r& j% M. d9 v' i2 t
            }
    7 h) q+ u7 C9 N' _}- H3 _* _1 c+ Z- s+ t- [8 @

    3 f4 Q1 O& Q7 f" t1 _xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    # u' w7 d3 p8 P4 {/ I# b2 H6 A  o# p
    ; z7 {( T8 W" C* t  p& U红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    # n: @- z! B, c' y现在call xcorr 100次,耗时78s.2 [* A0 y3 P! p! I
    : z0 |+ S) q8 }  N9 w' e/ e: ?
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. + L$ ^: {+ ^1 t! I7 c# m; Q

    " _: r; m& y! r- o5 Z8 a5 y9 X8 H
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33# v  ]2 s- G9 J
    Maybe Debug mode?

    $ ?4 ]% Y8 [: }: E0 C$ L5 n+ ^
    $ v# E" S+ ~4 c7 j5 P3 C. X+ [: T不应该,看我上面的回复。
    8 m# h0 Q" o  q$ x% {! ~
    + {! C1 q) G: i# c& ~2 K我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    : ~+ ?% @# z2 Y8 I7 s+ [' |* Y
    雷达 发表于 2022-9-24 23:54
    ; {. M2 c- z0 f, w. Bvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; F2 j" v" U) @1 ~2 A7 t, o! k{" }/ }: `, E0 T1 M0 C+ Z
            comp temp, xtimesy;

    7 @" L* r+ ?* [; m  b& _9 v
    6 I  j! d: q' _$ h7 e% j这个不是这么比的吧。。。
    $ v' h. C1 u1 d; j. d$ B6 `9 j2 q/ L
    " @5 M1 B3 g4 ]  _: I; S8 U5 I) D您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! y# G+ u: D- _# z8 e* p' w  h2 v0 j! L4 f& i
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 0 m3 f" y2 N: a, \! |
    数值分析 发表于 2022-9-25 00:20
    % g' w; k8 p3 X; L3 X! P这个不是这么比的吧。。。
    % m# C2 l3 l( I& ?; s% X
    & E' [( o8 U$ u$ v; {您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    3 o) ?: v! X: g+ \3 ]! \9 p) R6 f$ |$ z) ]( o9 Y- |
    有道理。
    ' D2 ?+ S, X/ y( T; Z1 R所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。5 e/ n0 \/ {' ?3 j" U
    ; p+ Q# _; e: p* {
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46/ W: W- ?/ c# H" ~+ v: c+ x8 _8 v
    有道理。4 K4 X0 d# x+ ^2 H: |
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    7 u% J- n8 z) M  U
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ) L8 |1 C, u# P  I* b1 Y- DWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    : Z  w# A! @% B2 a; t5 C2 |这个不是这么比的吧。。。4 D6 N& f) D# J

    3 O( v( b5 W7 Q2 e0 [6 U7 Q1 m您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    & v6 v+ ?7 S' L. s- [$ L. A. S; j- I% `3 {) {" L% i
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    $ V7 }+ Z# s$ V
    沉宝 发表于 2022-9-25 01:483 ^6 ?+ R+ K1 u* Z- C  |" G' s
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    & m6 b6 c' e+ n
    # I1 G& [9 X7 ~: s+ [' v
    是的,兄台说的对。9 l( @+ }" _3 ]3 e+ u

    / k, \' S& O; F! Q% }其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    , d* v/ _; V' f( f; @$ g
    + ^& W: B6 W& D5 O雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    8 ]+ g' E4 }2 }4 ~# `# n1 w; _
    . m. |% L7 |. U9 y, y+ B比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    # D% b5 p1 x# [
    6 Q& ~  A3 J0 w" Z当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 3 P9 j7 Q% q! ^& y2 s5 f2 ]4 x
    沉宝 发表于 2022-9-25 01:273 a/ j, N+ @5 A% |
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    * i2 w; N6 T5 K# l3 O7 B
      d+ b$ z/ m! u又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ' c1 J9 {6 M. L4 I% U4 a5 {( ~" f( K9 \2 j' r3 p
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    4 k1 |( Y4 I/ h0 `/ P又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ) {# m2 x7 ~. ^6 b% D4 T' u4 G
    时间差一倍的结果可以接受。
    8 P, P+ T3 D% o7 b% [7 P6 Q+ d% y  o
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    3 M$ T7 ]: I8 p
    雷达 发表于 2022-9-25 04:470 Z" b0 t3 N3 z4 a! C) S4 s
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ! L8 I" m0 T5 |! E  V  v8 T4 f2 z

    + l/ U: \3 r7 h
    ) ^3 i# m% `( W8 Y$ O$ _) z5 z7 m
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    $ r3 c# p" O3 ?2 t: k
    数值分析 发表于 2022-9-25 14:58+ z+ g5 X/ }9 ~6 w
    能不能把这个也贴上来,看看和上一个有什么不同?
    ) @  F" C+ ~; u
    理了理思路,重新做了一个测试。6 b& g6 W, l9 p: `! A( y0 j
    做了两个 vector 和 两个 float *, 都长 100000' h6 h2 m$ g1 x
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: s/ ]; y7 i$ |+ R, p

    8 U$ R6 X: o. B, p0 p内循环试了4种方法," l( u- c5 H/ j8 G- q" V, `/ Z% z
    1. 直接调用 vector inner_product 247s
    7 y& G- a6 r7 ]9 V  @+ l2. vector 循环点乘累加 237s
    , z- E+ g6 z! u( b3. float * 循环点乘累加 204s
    0 N/ l2 j2 U! H; a# G4. 空循环 100000 次 202s! h: X: D( F" g' Z9 Q/ c- ]# H
    7 z" c! @' v) ]* |+ [; P5 s4 |! t- @" ]
    不做内循环 200s4 k5 }; G6 @+ J, F  Z( [" S
    8 G; P( T4 e5 K4 E0 S4 p; @
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 b6 k2 A/ v% D) }
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。  G  d0 I2 V, A9 ^+ N! k% _- m6 Z

    ; P: P  O' @. l2 s, v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    % x3 N! C3 b) a, v: B  U& ]) y
    . m5 l7 N3 H! O. ~) `1 S7 j(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)" _6 k% P+ G8 R% F
    - g$ y: `) q. r0 x6 C: K
            std::vector < float > vec1(N);
    4 N5 X" O+ q% L        std::vector < float > vec2(N);' G) a% \" ]5 _+ F
            float* b1 = new float[N];
    ; x  M% \3 b3 J& k        float* b2 = new float[N];
    7 m  Y/ U- ^# j, k6 d/ ]% ]: z0 ~) P8 t* b0 B
            for (int j = 0; j < 6000; j++)
    6 U2 j6 _* p8 S, S" R' g9 F4 o        {. o, |$ `' J% b' W
                    std::generate(vec1.begin(), vec1.end(), []() {
    ) C9 V" F- [3 V. I5 ~+ B' M                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, ~' t, R# C1 ?9 u
                            });2 x1 g: e+ \9 M

    # `! N/ v& K1 o/ Z: ^% ?                std::generate(vec2.begin(), vec2.end(), []() {& z* |% k& I8 N3 Z7 a
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    3 f0 R& G  M- p  d6 c6 X/ |                        });' O2 s3 X; d6 v; a! c' P6 R

    ( L" G( Z4 c" C+ E- x  W% o4 @                for (size_t jj = 0; jj < vec1.size(); jj++)
    , |2 U; c4 _  y; R) T& d                {3 C. b6 M+ G- n% E7 }3 b
                            b1[jj] = vec1[jj];: y% n- m! }( D, n$ |, R$ G# x
                    }
    ) x$ |( t- M# g! W4 h$ v
    3 u1 }2 }4 ]8 v                for (size_t jj = 0; jj < vec2.size(); jj++)
    ! ^, L  h$ L1 ^: b                {- L6 b7 ]) \. A3 W* d; N% a: e
                            b2[jj] = vec2[jj];
    . h* T' K/ s1 {' Z. D$ ~                }8 T9 L$ m1 |/ l5 P7 O
    ; [/ C- v% G; u; X( k
                    //Method - 1  N=100000 247s  0 o2 K" w4 T: ~) i
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 Y3 E$ a2 g' j6 A* x) u
                                    ' l8 C# `1 k, J4 S9 d1 r
                    //Method - 2  N=100000  237s
    5 }8 C- G- b- r4 d                /*& T: _4 v: n( o: J$ ^
                    for (int jj = 0; jj < N ; jj++)
    9 d  @6 g; R2 l; V4 q; o# ]4 [                {
    $ m0 [) g$ h1 y. Z- \' f                        fresult += vec1[jj] * vec2[jj];8 _- v; @& ?4 a3 S1 _; u
                    }+ S- u3 k" U: F+ z+ q: g
                    */
    ) S' q  W% f2 m5 ]  n                                  M* J& t9 A7 c3 R  X; D8 C
                    //Method - 3  N=100000 204s
    1 G1 d7 b6 f0 Q: m2 \                /*6 @/ b' g3 k5 l. E  n* u" b5 `
                    for (int jj = 0; jj < N; jj++)
    , c" X) p3 c/ }* u' |  J$ D' n                {
    * J0 c+ a0 t* f( t+ z1 w                        fresult += b1[jj] * b2[jj];+ d9 n* t6 W& f) s* V3 J
                    }/ _9 Q( d* s) x/ t% v- ^' R
                    */- R- n" V3 k/ \! X

    3 V$ O& E1 `5 m" D  F3 s                //Method - 4   202s
    2 O9 s& L: g, z+ f  P6 z, Q                /*" e. B6 z# V* r8 S; A1 t& E
                    for (int jj = 0; jj < N; jj++). O+ Q( F( ]+ ]+ M5 \' t# J
                    {
    # N% Q  U  b1 K& f" U: g  Y% S                        
    ; t. j" t, w. m# E6 y                }
    5 [% n" M; n; p9 e0 ?; k  J                */
    / J+ `- G* T1 m                //comment out all methods, N=100000  202s               
    + g( E- i$ T  ~        }  A2 a, e. L2 D9 Y- B, ^' G

    7 Y- Q4 H/ ?2 M! b$ o% O- }- g        delete []b1;
    ! P+ t. v6 @/ e        delete []b2;
    4 v, m" r6 v7 R; ]
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ) Z/ P, U; a4 K' d( m6 G% ?4 A0 g' L4 o+ r) w
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?7 O7 ^* ?6 G8 q1 C5 _7 ^0 D0 ~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15; c, t" b9 ]0 I, o# T
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 R! k5 o2 C+ x+ o4 b% s

    " Y* R+ Q4 h! I9 M8 I你第二个试验里面的j在循环里面又重新定义 ...
    3 |- u6 x7 q/ Z' c2 d$ U1 \
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 n7 U+ f4 j  A: [, o  V% @
    1 z2 u) _! z: I% q' W8 i# E
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16" _5 M' J, D) j4 k* u4 p; [, V
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 ]/ R) r& b- X- ]- f
    * y8 K* t9 w) V* _3 C1 N2 ^
    不和它 ...
    6 n1 [# p+ I" Z  P
    ( e6 O7 T* j" W  b) l7 p$ W; F; E
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。$ c. g" b# I( U" B7 p  S* i
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54- m' r5 B" e2 T5 Q% ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 W! k) {3 O1 Q$ h3 h
    {$ H5 C$ z. G* L( ]+ u1 m. u
            comp temp, xtimesy;

    4 M$ X! S# f3 h% d6 D这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    % Q. g' @1 p: ~6 H4 y5 H内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?" y( L* U5 {* ^  s
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-26 08:39 , Processed in 0.070165 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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