设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?. I2 T  K$ @% o4 x

    4 c+ j: |, ?# e# b; a自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。. o' Z% m) J0 Z" {5 U. s
    " v, Y8 F; X, V
    速度优化问题真的很有意思啊。% H1 I+ H  I1 Y
    0 C3 n' l9 z, z" ]
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    % e' u" F$ J6 v  ~0 @. l4 l把代码贴上来看看?
      V$ ^9 M  Y9 U# s0 ~5 p% q6 g  b! 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 编辑
    4 c# }( g3 `, S0 w: A2 E9 X  s; s4 S
    数值分析 发表于 2022-9-24 23:04  L0 G: m/ n2 M6 ~  t6 D3 A& ~
    拉下来?拉多少?
    1 |' N; N9 y7 A6 u5 w把代码贴上来看看?
    % a; E" }$ G7 F! p5 C
    8 I2 j$ |" l) h
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : \3 K; c) w3 U- z{' D- C* ]8 j( L- `' K
            comp temp, xtimesy;
    : o* M6 y- N+ t4 [( i3 s, p        xtimesy.re = 0;
    , P, x7 H* d' @- @$ Z$ I        xtimesy.im = 0;) l& W7 u. q4 Y" H7 i; p
            int j0 = lenB - 1;
    4 R" N" ^4 P1 p        int    i, j, i1, reali;3 ^2 _0 E! g' M6 L: Y6 Z! T) n
            if (lenA % 2 == 1)( w- i/ p" p7 n: ?
                    reali = lenA + 1;
      G8 w7 P3 Q1 V! k4 {0 ?        else3 m$ S+ q$ v# `; @' M, A/ [; @/ t5 f
                    reali = lenA;# M* ^0 m0 X/ V
            reali /= 2;
    % R) x" ?, w5 C; d. F' H1 t! f+ h3 r3 h: Q
            int nconv = reali + lenB;
      T( Z" D. R* j0 d9 I0 I' Y        //#pragma omp parallel for
    0 X7 Z1 J( w% Y5 v/ d/ O. f* @        for (i = reali; i < nconv; i++)0 b- k( ]: b5 Z1 s( `
            {
    8 S* X& Q- N5 g# \5 z                temp.re = 0;% e; Q# b! |8 Q2 Y
                    temp.im = 0;2 a6 N% i: S9 P: s
                    i1 = i;
    0 W5 t8 r1 m/ n% @! `  v                for (j = j0; j >= 0; j--)
    2 A% ^- I" l1 d: \. b                {
    2 o7 [( T7 B5 e+ [# q: m  y                        /* floating date operation *// b. \3 E2 ]0 Z1 R' `
                    }

    # O, X/ z8 N6 V  @  n        }1 A8 c( H% R% I3 j- ?; t" L
    }
    : U# K4 G, ?, w6 {) @' ~" I
    2 K- P8 [& B0 Uxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样( R1 k. B; n0 B1 V1 d7 q$ f" Q* |: A
    ( }8 |) g" N+ \
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。6 m- m' F, k' u* H$ P8 y/ ]- B, ]
    现在call xcorr 100次,耗时78s.( P5 u' K3 b" L( C" e( \2 B% v
    5 W! g7 z1 ?# e1 E
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. & ?7 V: |7 ^. W, F4 M. a+ z$ g6 i
    9 A& f+ `% B5 h& `9 T" \! M
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ' P' Z- c6 k4 VMaybe Debug mode?
    ; Y8 R& F2 c' g0 _% O) q  Z
    $ h# H, V6 x0 i: N* ^
    不应该,看我上面的回复。) J1 z4 z/ ?. }# `( L- M

    : @& `2 U) X( C我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    $ `& w0 V1 A, w2 C
    雷达 发表于 2022-9-24 23:54: |* ?8 \) N" I2 v
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    " E# M9 ^8 ?7 p. O7 K" }{
    ) d  Z1 P( l+ L. ~        comp temp, xtimesy;

    2 i( ^2 D! j8 m
    1 z+ S. ~) \  k% O7 y, r& A这个不是这么比的吧。。。
    1 f* V" S3 z0 P" |% ^, f: G: g  `+ A: n
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。! k; o2 H& ?0 X
    ) D  D" u4 K" `: [. N; Z
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ; r: ]) |* O0 m: e, w. K
    数值分析 发表于 2022-9-25 00:200 c3 f9 p( u- h3 k" Y# r
    这个不是这么比的吧。。。4 K3 x7 h+ I3 t& |" k

      g+ ]# b& H9 H! B; N7 B- T您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    % {5 f3 c% f' @( Q5 M; u7 }2 {: c3 I# n5 p1 E% @
    有道理。7 O8 N. Z/ f3 n- Z! f4 a3 q. M
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。, ]* @" _) x7 c0 k5 s# |
    ) t- f, B, D' r7 J, F
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46# ^) \0 n5 [, l! Z  S
    有道理。. y0 h0 I0 y5 M2 [
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    5 P2 D& E; [( b! a8 g你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多5 |' ^$ G' \& {+ x; V& U. w3 T, U) y
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20, t( D5 |+ G5 w: }3 ]1 t$ S$ o0 c
    这个不是这么比的吧。。。
    , _6 y0 i* z) e& W5 _; k" x! S0 Y( }( g5 A5 S5 E) I
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    $ r0 q" M) ^! ^
    1 V$ R" E0 G# x3 h
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 2 U" F8 `  R  b! I
    沉宝 发表于 2022-9-25 01:48
    1 A: O" [. S( Z! p现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    & ~3 u1 Y7 h" o9 x* d! T5 j4 D& P6 _
    是的,兄台说的对。8 @* {+ e& Y$ C2 @# |0 P* Q. k) n- c4 F0 x
    - G# D5 \" R9 F+ I! r9 T
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    8 U3 S! Z  L' I- w( e4 f# J0 A$ F
    ! P4 T) Y5 W% c, p1 T雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。, X  U3 X" E# r) M- `
    . C8 M; `/ Y; T+ G" A2 J
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' @0 I: P. u" y2 C: x1 G/ a, h3 w/ _6 E9 o9 o3 T, Q' a
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 . p* I  `' V" Y6 P& g. [4 d" ^
    沉宝 发表于 2022-9-25 01:27
    : k& Y4 O9 I! i你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    . _: N' k" v* X

    / i+ H5 k% T% u3 `  `又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ) Q1 q. F% Y& B" B
    ! l% I& Q  h! \% ^( X  l我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    $ Z- \& t/ ^) T' o又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * K, R, Z* \% e3 Y时间差一倍的结果可以接受。; I  W( d9 t. y* A# |$ Q, M5 L6 j
    9 ~, U$ b9 W' S6 |+ s# \' x' P
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 0 I& z1 G. {  H. X9 F  k
    雷达 发表于 2022-9-25 04:47) d, L9 p( Z/ z
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    $ y& a8 y* H! D
    2 Z  ]/ J! P* a/ x9 g/ |8 ^/ }! H* R1 G4 K0 h
    % Q3 o. g. c" [2 O
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    $ ~0 b2 [+ N2 d" c/ ^7 D; ~& B/ J
    数值分析 发表于 2022-9-25 14:58$ w. L" |& U6 y( x2 N
    能不能把这个也贴上来,看看和上一个有什么不同?
    5 M8 c! ~7 ^2 t5 @9 W2 w
    理了理思路,重新做了一个测试。6 D) d# }2 i# S" I' `
    做了两个 vector 和 两个 float *, 都长 1000009 v; N* N8 x4 }$ F5 K' r; k% a! U
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    3 y. r5 p' D. I4 t
    7 S9 k! B1 r" R; b* f3 A" x' h内循环试了4种方法,2 B, F. a# r' g3 f1 M, _0 w/ O8 `
    1. 直接调用 vector inner_product 247s   m: D  `! x6 I6 s* i8 X0 N: P* c7 P
    2. vector 循环点乘累加 237s% V% v3 Y+ x' @2 I- [' b; s' g
    3. float * 循环点乘累加 204s/ l9 V! ^" H, m4 w  u
    4. 空循环 100000 次 202s, |1 u9 z+ I! z. v6 n3 W, W

    + ?+ w6 X4 w0 d2 p  j% M! v0 J不做内循环 200s6 C, v. k2 f. H) m6 b4 v: \
    / S$ E. q: ~0 x4 H
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。, ]0 m4 `$ ]3 @; N# _8 Z
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- U2 B7 k, g( f/ o
      k/ N" w- b! s8 T
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    7 y7 b0 M2 `  d8 _/ h2 q% d& h' V7 f; t$ Z& Z6 L+ k/ Z
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 c  r. f7 {, B/ i

    , X7 s4 ]$ [7 T  m& t$ e. X& a
            std::vector < float > vec1(N);, }6 F( f7 j1 Z( W7 X- u1 C. Z
            std::vector < float > vec2(N);
      Y+ Y; \+ p2 f. b        float* b1 = new float[N];
    ; ?# `# c! r8 r8 ^        float* b2 = new float[N];0 J- e3 }- S1 U  ~# G7 ]% E# H

    ; i4 z* z0 K: i+ ]; V. p' M& o) v        for (int j = 0; j < 6000; j++)  r- ~" O0 g. D9 m" Z
            {& v1 W, R1 x0 O( N
                    std::generate(vec1.begin(), vec1.end(), []() {
      d6 {- q& A3 a% t# g* t                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ) O% R+ c% V2 B' q3 \                        });' G* q/ I9 i& w6 P
    " K1 K1 L2 W* K0 S- C
                    std::generate(vec2.begin(), vec2.end(), []() {
    & ]2 g7 {- _' U0 |) |3 {                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. R' A" }/ Q4 K( X2 V! H6 O5 J
                            });
    . x  \1 @' H' Q0 O4 I2 Y6 x4 N) Y0 S4 b3 [. R
                    for (size_t jj = 0; jj < vec1.size(); jj++)6 _3 _# x; x/ z* r$ ]: x4 F) g
                    {
    & S; ]# @$ T. g& U" P: n* ^                        b1[jj] = vec1[jj];
    & m1 L+ g& e0 _4 D/ S9 d                }
    4 t2 ]: L9 b. h  v5 J) A9 o+ u, p5 k# Q0 q0 i9 b
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    $ X' u/ h0 l1 p0 ~( x9 \                {
    8 G4 Q2 D: G# ^. ]  r                        b2[jj] = vec2[jj];
      O2 i( K1 t- n4 H& U" b1 Q- \                }
    9 z/ v" Y, e( d# [0 Q6 _9 }' R& B7 B0 V) c; O$ {% V' c
                    //Method - 1  N=100000 247s  1 s: R6 I: r0 R; [6 l; p
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    " L5 x' L( |& S" f* M                                / c! p' M- \- q
                    //Method - 2  N=100000  237s+ O# }! N! T+ K9 C* ~) T$ h" T% p
                    /*3 H( H( {( x. K5 t1 Z
                    for (int jj = 0; jj < N ; jj++)' j. S: G$ `% ~6 |& y
                    {1 \# i, Q7 m$ }8 r/ r* m* y  g& u
                            fresult += vec1[jj] * vec2[jj];+ [3 S; U% d3 s6 t- T
                    }4 z' m, F9 M& `& u3 l6 ^
                    */
    1 x+ \' X, v0 H; y4 w; X0 ~! z                                
    ! j. |6 x3 g8 L, F0 j; X: ~) G                //Method - 3  N=100000 204s) _8 p" y9 ^; }! ]7 |$ w2 Z
                    /*
    1 ]1 s9 b$ _9 C# y                for (int jj = 0; jj < N; jj++)
    4 y; N5 f7 D) `% d6 J; N# V% z                {! ~& o; K$ [! |- u$ y0 o
                            fresult += b1[jj] * b2[jj];
    , S; |+ r5 ]1 e2 R& {2 q+ R5 E                }1 E& k5 c1 X  g! i: z$ d" ^# b$ o
                    */
    9 Q& X8 T% ~2 _5 E5 g: V5 u) i" N# v. L& f% t. h/ w/ L8 H
                    //Method - 4   202s
    - l% y+ U" f9 |) C: K) `7 k& |                /*
    ) J. l5 w- N/ I% @* ~                for (int jj = 0; jj < N; jj++)
    6 G) s$ O+ B5 m8 t$ C, I* Y* ~' G                {
    + i% n5 f1 ^# J% |9 h                        - B7 @( h& g) A& V! v" P- j! ^2 y
                    }; o3 i( J* @& k2 W" s1 \
                    */# m. s$ p; @# q  E9 U
                    //comment out all methods, N=100000  202s               
    . f; y5 `' W8 ~3 A" ]7 X0 G  ~        }/ o# q$ H" @) R( D8 F

    . d! ]9 h& e; O1 }        delete []b1;
    , {0 j% q, B9 w4 ~        delete []b2;

      A  Z  e6 ~6 F  H3 L
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" E/ K7 d! x0 z" |
    : s7 x2 m9 o# T9 M
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?( c& Z5 S+ N! J5 }, k; j/ v7 X& }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    + t; n8 U) m) N1 [  W瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    7 w  @# b4 e. b( g0 D" A2 r* h3 p6 t7 }  j- Y3 Y$ X+ q. L
    你第二个试验里面的j在循环里面又重新定义 ...
    : k- V) o3 S& e) o
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 p3 F# F( u; f8 c' f( @% a0 p
    5 }6 S' g  Z4 Q4 U8 a不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    0 Q5 W8 U) F6 |8 [内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    $ g4 @- n0 [% z" }" z1 e" Q  ]3 r0 n9 [$ p
    不和它 ...
    8 q" {; R# f) h( n5 g

    5 L7 O. L! t9 [% O不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。- y- ?# X  o/ u7 G& ^2 E; B; `3 p5 x
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    , z# y8 i6 J  d9 h% gvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ U5 `; U; ?7 ?9 m
    {
    $ `4 F; A) r: r8 l& r        comp temp, xtimesy;

    . u$ [+ y7 w9 H1 z# r6 L8 A/ N这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    & t  ~. b; F, H7 e8 v( G内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?. E  P' M2 }# I: b1 }
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-5 03:28 , Processed in 0.039676 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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