设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    . E& d. M, c+ j8 i1 Y- P! r  Q: q- x. ^/ y
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    & _4 }) x* C" Y  ~4 T) Q4 @% R- \% U5 S: e' I& |( o
    速度优化问题真的很有意思啊。0 {; s  [8 v" V; `( x

    + p- z# I# A8 y欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    % j0 F$ [2 g9 F; F5 p  M把代码贴上来看看?
    ; K% Z, o0 V/ C% b. @; Y. L4 s& {( O  [3 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的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 - t9 ]+ s: `0 [6 v) n' b. ^
    数值分析 发表于 2022-9-24 23:04
    + b! p4 \+ z9 S0 h拉下来?拉多少?3 }* }$ o1 b, \0 w; W3 ]8 o  g# |
    把代码贴上来看看?

    ) n2 D3 e. X- d7 @! c7 R9 N' k. T+ g1 [- ?
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + B& ~% K( X- B4 r; }% O2 a% u# Z1 f{
    / }2 M) X# ~: r        comp temp, xtimesy;
    + A; q( h2 F& k% Y        xtimesy.re = 0;
    , C* p* {8 M/ \- f) I$ `* F+ ^) ]        xtimesy.im = 0;
    1 D  h0 h' ^: B8 i9 C* x4 r9 v        int j0 = lenB - 1;8 w1 ~$ k, m% X+ L
            int    i, j, i1, reali;1 g) Q! P6 \$ J6 E0 i# I
            if (lenA % 2 == 1)
    6 E  J! F! y$ {% {, w3 b3 f                reali = lenA + 1;
    ) h& i4 w. K/ `& b+ t- W8 ?        else
    9 q. U6 j! p8 X4 g; Q2 D                reali = lenA;, u/ T. R. |& \
            reali /= 2;
    5 T# |* K4 o+ D* x, i! Q8 M
    0 U0 G9 z+ `8 O9 t$ b# O6 F        int nconv = reali + lenB;. [% r4 ?- f1 ]- A9 c6 @* @
            //#pragma omp parallel for- Q3 x5 B0 G" r  m1 s
            for (i = reali; i < nconv; i++)9 p. R, {3 h8 a2 K7 ]/ d3 X  v
            {: i  l8 _2 o" a0 w  M+ m
                    temp.re = 0;2 v2 |& ]0 k, ]1 [; ?% E4 N; Z
                    temp.im = 0;
    1 K& k1 [, L, C. R0 f  p                i1 = i;
    3 u% s6 O% [3 A6 e                for (j = j0; j >= 0; j--); E% x* X3 j  e& l( j. G
                    {1 {$ e2 J' ^" n' ?) J/ |' l
                            /* floating date operation */
    6 w2 ~" `6 W7 F  D; A3 X( x( L                }
    % H" i9 S  {  U5 G: ^
            }
    * B; m% q: ]2 N0 f- R9 c; g}( ^. U4 Y1 o2 [. q% B# b" s3 ]9 I

    ! o- [# Q% a* x9 wxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样* F3 Z$ ^* @6 e, y1 x. {  O

    8 ^$ A5 E8 e  ?红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。% Z( D, }* ], j8 l, m
    现在call xcorr 100次,耗时78s.. t2 @' T, R; z+ X" N

    ; M; i# M" d0 K如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    2 |/ K$ Z% G3 o- S, w: ?
    ! y( F+ Z3 Z& N% ~3 y0 X8 m
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    3 U* W* M: h4 `! W2 LMaybe Debug mode?
    % G2 l! ]* X0 U, @8 f8 l+ u* W
    , y) Y, I, w/ H. T
    不应该,看我上面的回复。
    * r9 k. e4 T) \* w3 R
    ' l  i$ j0 j$ E' N7 ?; T我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑   M/ y4 Q5 i3 j: Q8 g5 R. _% A# z2 |
    雷达 发表于 2022-9-24 23:54
    " {! f1 Q: H# n2 q; O* ?3 q  d2 r2 cvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ B' J( h7 _* {1 K
    {
    * n$ P6 r( }4 F  T  l        comp temp, xtimesy;

    , }/ M- [6 ^4 s% n6 E' y4 n/ f9 F$ O+ L4 `
    这个不是这么比的吧。。。( N. c, P/ x7 t+ k1 c2 O
    5 m3 K, Q# `/ j: a- i* }2 N! ?
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。0 D9 D9 d7 m  X! }# X. R% Q

    # L: i' u3 `2 e; O, S4 C而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    0 Y. b. @* _* {+ a
    数值分析 发表于 2022-9-25 00:20
    & I& f+ D, N* o2 ~4 V这个不是这么比的吧。。。. V' F+ O( [9 K

    6 I5 }- z+ \& o7 x9 u您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : B8 j) z8 o: I7 {7 A6 ^+ W
    * K; p1 R7 F$ x& s# f! O$ X
    有道理。
    9 I* i  q7 h, @3 `# A! G所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。7 q& c; I, _4 [
    / D8 F' C! s6 r
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
      p! @& ?9 T5 y  _! f有道理。% s$ r; I9 m/ \$ f1 z2 \
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    3 T1 |% F$ U/ Z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多) ]7 z( t, i, |  M3 t3 Q7 @
    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
    & e2 b( G  v! z5 B6 {5 a这个不是这么比的吧。。。1 M3 E2 `  E9 E

    " |2 D" k6 ~' Q1 p' `: r& ~您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    % w. ?' U* n* U5 q" Y, R8 y
    0 o  s& F" k- E' A% k. C: A, i' _现在的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 编辑
    7 ^* _: ~2 W4 p+ k7 E
    沉宝 发表于 2022-9-25 01:48
    # F' t  Q% v/ s6 u现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    + q% u. `3 {0 R7 [& B
    1 x  e& S1 r  ]# [4 V( F- U+ Q% l3 G; J是的,兄台说的对。" Q% u7 l) [% n( n

    ) x# o" X' z4 l6 X# {' \1 Y; I# z其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    , J$ R$ s3 u0 D9 @2 N. s9 }9 F& V# v% d6 N2 a
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    & K4 M5 a" K! R- I* A
    - H6 g7 N2 L+ `5 K/ v* @比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。, t$ E5 @* G% D( f: N
    - Z( [1 c- {/ `! C/ R
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ) D. U2 P4 d' R) p& z+ J
    沉宝 发表于 2022-9-25 01:27
    3 i* k; F' \, w4 m0 ^" F% |你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    2 [  R6 V" v0 S) R6 x6 i4 b0 t: j4 C: I9 ?: J
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ! j7 k) X3 }5 ^0 I* S- Q5 X1 H) F3 d7 _2 S
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47$ v* [* ]- v/ S
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 R* G3 k: b' S% S- e
    时间差一倍的结果可以接受。
    / }/ s# x+ x4 P7 G( G
    + v& D6 _+ m3 [. |' N6 a: J你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 $ z$ Q* U" D. N. p( M4 z
    雷达 发表于 2022-9-25 04:47. k, t! y$ ?" L( U9 K( O* o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    $ V9 G2 O, _# y3 \
    " l/ [1 I( ~% X! `* _$ H& _$ a. q
    % v1 D) Q' G! Q- h& r5 e0 e, e
    3 z: a! W  V$ ~: U: K* l+ ?8 O! C7 X
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ g- t4 z" H+ e) K% [3 c9 s/ y8 L
    数值分析 发表于 2022-9-25 14:58/ K+ s' U$ A6 W9 W$ Z- H6 p
    能不能把这个也贴上来,看看和上一个有什么不同?
    + v' O1 W) m$ ?# }
    理了理思路,重新做了一个测试。4 C  Z1 H! L& u  R* {7 r
    做了两个 vector 和 两个 float *, 都长 100000- ?* H# g: S) b$ e, e5 _) \+ l, W
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    % u1 T# q2 ^3 i
    0 V  }4 Z/ a; f8 q' x内循环试了4种方法,1 o+ z3 g" h8 I  e/ i
    1. 直接调用 vector inner_product 247s
    . q) |% G5 ]* o9 H7 [0 c, o2. vector 循环点乘累加 237s9 E* P5 M& f) b, a$ M+ K! z
    3. float * 循环点乘累加 204s9 q7 G" v6 f1 ~. g2 [) w& |4 F
    4. 空循环 100000 次 202s+ |6 ?; \/ K* l0 y' g& B+ ~6 ^; `9 N

    7 a" _1 y; q5 G! r, c不做内循环 200s  ^; o* j! c% R" @' {

    ) ?% v; M2 ?: M6 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    # m& o& Z4 _2 I( N4 ]& j# R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
      C# W( s/ g" r7 O" g
    # O# p6 t) w( Z6 r. l至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ( x9 B4 c+ k4 E8 x" t8 A) X5 }1 @$ s) U% ^3 U2 I( N
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    , M8 b6 j. ~6 L* [, C/ P
    % ]+ m: J, |$ Z& s
            std::vector < float > vec1(N);, x% I5 C# \3 H
            std::vector < float > vec2(N);
    ; U( ?, k: h" o3 x! l& |# e        float* b1 = new float[N];" O. ^) `- A  ^6 o9 j0 T9 G3 A% \
            float* b2 = new float[N];
    8 C; t3 M$ i( h0 c# C  G) v& w6 O/ f) |" v- N' E: ]
            for (int j = 0; j < 6000; j++)
    , u. m1 A5 Z# b8 g% m  k' |        {
    & R( w: i0 U! O! C" J" E9 Y                std::generate(vec1.begin(), vec1.end(), []() {/ C: Z. W9 D4 W1 t$ l
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    4 t( }$ w5 E) q/ w                        });
    & I1 J* q" Z4 g: v# z& f
    , L0 t* {$ H- |( C7 d                std::generate(vec2.begin(), vec2.end(), []() {
    7 `) a1 c- v8 |. s* U                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. x0 E- R/ X; A7 m9 H$ \7 N7 W
                            });
    ! g" i9 T( o, a: w1 m$ s# ~" }2 p& |0 W* z2 m
                    for (size_t jj = 0; jj < vec1.size(); jj++)8 L, Z, i: P4 N7 V
                    {- s& I3 \! b: ?& p: V" I4 Z, c, s
                            b1[jj] = vec1[jj];
    $ x, L; D9 [  j6 K, p                }
    4 N, h# T: c1 R; e4 l. M  V$ J  Q9 V9 z4 e+ X/ Y
                    for (size_t jj = 0; jj < vec2.size(); jj++)6 N; j* k3 u' b" `' }. ~* V! g
                    {; }' _3 V( a- T& k% ]. t5 w. {' F+ A
                            b2[jj] = vec2[jj];- }) T) |# H2 }1 v
                    }8 H1 E9 h+ c; a7 z
    : A, _4 R; Z6 @! a0 Y: ]. L- z
                    //Method - 1  N=100000 247s  
    ! K. R, F- t# O* m; H2 i4 ]( f) Z+ c                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);  S. f4 j2 p" }6 U, T/ ?+ L
                                    
    ) k9 [0 a0 h! q# I- g3 ]                //Method - 2  N=100000  237s# J# ~# ?% G2 {$ N5 [
                    /*1 F2 X: W& ^) H& t% k' I) q
                    for (int jj = 0; jj < N ; jj++)/ {& G  }. P1 z) n' [
                    {
    , x) W, B$ I( z* a( I9 h! i                        fresult += vec1[jj] * vec2[jj];
    1 d$ U; G3 v' t' B3 t                }+ `/ J1 e9 \& Y" I4 J$ I/ h$ ]
                    */
    + A1 B8 y( u# V. e6 h                                
    ) f# U( c- ?0 F( d                //Method - 3  N=100000 204s7 i4 Z7 y" L7 V- G$ X
                    /*4 Q2 X* E6 s8 z- [4 W+ ^! Y; D
                    for (int jj = 0; jj < N; jj++)9 V! ~; S8 C; J4 g9 W
                    {! ~% h0 k$ h- W9 d4 _: y7 l5 T
                            fresult += b1[jj] * b2[jj];# `4 j% s, F3 w' Y
                    }" @7 l+ a. X# f1 Y3 w1 ^3 O! o6 p9 X
                    */, H! ?6 a, M# R0 F; j9 L
    1 @; g) J) `6 X7 H! ^3 f. s
                    //Method - 4   202s
    5 C6 ]# _: r  G; m; e                /*
    " w  J8 s' ^8 }3 ?, b                for (int jj = 0; jj < N; jj++), Z6 r2 U. P" E" \4 K
                    {  j# F! Q( B* W6 @) }) V5 F* j
                            % W- U% d: v4 `& O5 j
                    }
    + K. O7 }+ T" N6 e! H                */3 g" Z5 n: t4 S6 _
                    //comment out all methods, N=100000  202s                7 ^% {0 G" U5 t# K% e
            }9 u# t. l4 t1 O

    5 i' B; ~( H  Q/ z/ W$ |        delete []b1;- h1 Z9 i9 }+ ^  V1 l" p& s1 a
            delete []b2;
    % ^% G% n5 [0 _: ]
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% _# @3 x' u% J3 N
    + J  {# ]* q6 R  j" P  u% S
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    2 w1 E& N$ R% _8 o3 {% a+ J6 y
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / A% y/ q/ }% }1 ]9 C瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    # J2 N# ]9 K. z( t! c. l
    1 T% R9 u" g" |/ a你第二个试验里面的j在循环里面又重新定义 ...

    / ]9 q' B1 j  K) t内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL' [0 e6 x/ x' z4 |9 \, v* L8 q

    : ^* \7 O2 ~$ G$ z不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    / B2 u" G' E  Q9 m- w" v+ V内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & T0 j1 l1 e; Q
    4 P' O4 U# I% l+ B不和它 ...
    - s2 y; o. ^4 v7 S9 z3 E  Y
    " C4 _% O! }4 a. `5 S& t
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    % _2 T9 }- v# ?# k* m! _后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54/ p5 k& w& |6 o. f. H2 s7 O
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; L3 N1 [, C% t  U4 P{. f$ E) W4 x9 r# `, P
            comp temp, xtimesy;

    ) j# [- k. ~0 B- U这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。3 t! s6 Z- X* R+ H) ^6 b
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
      S2 F9 F4 m" T) s! `. ?7 d% J" j3 VVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-21 10:42 , Processed in 0.079250 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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