设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?# _' t% K/ z* Q9 y7 z) C
    ; w1 [) k: t3 a- O( |
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ( w& M2 e+ |7 _9 Q$ P% i+ [' T! @: R4 X0 w, n: t1 y7 ~
    速度优化问题真的很有意思啊。0 B7 H( O- Y) R# R9 ~7 a" z

    ( ?& j$ G0 T/ G7 Y* }欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ; [; U' Y7 T6 t4 k2 [7 q3 c把代码贴上来看看?
    8 O$ `: P; f" r/ C' U' _: a% S9 o! D& z% {( F
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    % J4 \" W; M% [0 J% w0 k# l  n
    数值分析 发表于 2022-9-24 23:04. w9 t3 \; U8 |5 [6 B
    拉下来?拉多少?
    3 b7 l2 v: d& u把代码贴上来看看?

    2 `7 @7 e& T/ Y% w3 l. {# f+ A
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 x* q  Z( [  g; m4 P{- _: f9 G3 f& `! F2 F
            comp temp, xtimesy;
    5 X1 Q4 o# Z; ?7 ^, ~* t        xtimesy.re = 0;
    + S% t; F5 C( ^! e: Q        xtimesy.im = 0;
    2 `2 X5 C5 u* X" i        int j0 = lenB - 1;
    ( F9 @0 C$ j, {7 Q0 \        int    i, j, i1, reali;
    % k3 T5 p/ z8 K) g. k, F/ L0 N- P) c        if (lenA % 2 == 1)
    " T& g  f- a0 F6 W# C$ ?                reali = lenA + 1;( t1 T* Q4 H* f( {' s" \
            else, Z0 ~/ v6 K, ~2 W& I) h% \2 ~
                    reali = lenA;
      T( A2 A7 J) {+ t; u! v        reali /= 2;
    4 `& C' I. s- b, U0 K) |) p  ~# \6 R/ z8 |( R7 T
            int nconv = reali + lenB;
    ; n# b( r# C0 G6 X8 U/ [        //#pragma omp parallel for  ^2 D1 d+ r$ I# ]; O/ d
            for (i = reali; i < nconv; i++)
    8 I& S, w2 y9 v3 F5 y        {: E' Y2 b- Z' F6 l- K
                    temp.re = 0;
    4 ?6 V6 l6 g1 u4 i* o& P                temp.im = 0;- O/ d) V& a% h; Y2 \5 h9 V$ K
                    i1 = i;
    & }2 \) ~: [4 n+ p3 E6 k                for (j = j0; j >= 0; j--)4 ]. r& G- X3 _6 |) j, n" a. A
                    {
    9 l# y7 F, M" f+ ?8 i+ @                        /* floating date operation *// w2 K0 z) n2 J. _4 s! a
                    }

    $ I3 B+ h3 n, b+ m# ]        }
    ; g" f# @4 K: U2 f( L$ H0 M+ D}
    ; v7 U. G* G" x7 i* ^) @. |' M1 I  p9 L# K3 P+ j
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样8 r# r7 {& B( C- g7 S  _

    $ k+ I8 b2 R0 R红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    ! P" w$ i- |& V. p现在call xcorr 100次,耗时78s.! ~4 ]! u; L2 _" N  l: K
    # E# ^% t5 {1 K' M8 X' u
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ; t9 D/ A; z# N# m, c" t. J

    9 _' W7 l  }! R* D& q
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33+ I* I+ t/ O+ L" J5 T% C
    Maybe Debug mode?

    ' O' n6 K1 j6 ^% ~& C
    * m9 x; H8 Y6 ~1 b- H5 C* @9 @不应该,看我上面的回复。3 I' a- j. H, ~& {
    ; o( p: ?. m7 g8 H4 V% Y
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 0 m% O% l# N* C1 j& Z2 G3 a: ?! m. w: j
    雷达 发表于 2022-9-24 23:54
    : s. K) r4 [# p# Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; G! d' ^( w# S{( D1 {) Y# E+ C
            comp temp, xtimesy;

    7 I0 z: ?/ W3 J3 K1 ?% ~5 J5 N& m% t0 s8 \7 [  f8 j% i2 g
    这个不是这么比的吧。。。9 U" }) T+ b8 D  i* x

    5 X! T3 z; _4 c% o, R% A+ r; N您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。6 Y$ w- x$ C/ y5 a1 m- L" q
    2 [' N' {% w" g/ G3 m+ G
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 6 p0 V  U( v0 Q2 q8 b) c% G8 e% A6 }2 m! n$ |
    数值分析 发表于 2022-9-25 00:203 z/ V$ w* j" C7 G$ a. D4 i
    这个不是这么比的吧。。。
    , h9 ]# W  L$ Q9 u' Z8 U/ i: b# F
    8 X: _+ }* c" ~您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' [+ i, t$ g& K8 Y' O8 E

    & f) T7 }- Z$ \有道理。
    6 H  m, B* b9 c6 k% ]所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ o) |8 d. r- _  u4 P! f; N$ h5 A5 a
    # F: c5 C+ C  l- }2 F/ y我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46& B$ W7 }* S4 V8 {0 o# L0 T0 `
    有道理。
    - p* @3 w4 W3 Y所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    % |6 G- K3 M' X" E你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    " P' B/ e7 m3 K% G, C% vWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ( k8 o" [- m  W这个不是这么比的吧。。。
    " ~) |6 e2 [4 m7 J/ ~/ i5 X2 r+ \, [  d$ y0 u: L) L
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    ) B8 e+ j; q' j! x
    0 u2 j2 W; k9 H现在的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 编辑
    5 k) D: p2 s% d; @1 L6 G. @
    沉宝 发表于 2022-9-25 01:48  U- G/ U1 k# j( o6 A5 D7 L) C
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    : V$ A3 d, i) Q7 r, ~1 x
    % X- I( Y4 N( M是的,兄台说的对。
    8 h& b, P/ e- t+ U& ?8 D7 R' l# }0 ~
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    % P5 E/ z* ^; |3 d1 }
    5 p6 `2 B: ~! D  Z# q  c雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。) `0 Y# V  Z5 Q! ?, q

    3 J+ c: H$ H; l比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。1 y- O9 R+ ^' X( J3 V

    6 D* T5 u5 A9 e/ G# j5 v当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ) X, u/ W$ j7 N2 {
    沉宝 发表于 2022-9-25 01:27
    / h8 b1 L# {8 ~; x! _. O% D3 z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    " }$ T/ `% ?5 h" v2 `7 V

    & d( B6 m' j' l' i! o+ t) m1 L又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    * F- Y" c' z1 A8 e+ g$ ^# d( f2 K! `/ F( h
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ' n4 ~$ M7 t' h' B7 U, ]又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    2 t6 E1 B* M" i: Z时间差一倍的结果可以接受。, z9 N/ @) n4 X2 l2 [

    $ U0 N# I9 r* A- `7 V7 L& B你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    5 M9 w" n2 ]0 \) \' g& A5 _3 [  K
    雷达 发表于 2022-9-25 04:474 k0 ^9 @( X2 ~5 B; @9 p( t* j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    9 v, P+ ]) ~/ E3 k

    ; P7 v0 L' t& w, Q, W! x$ ~3 e, h

    # R- m9 s; n3 L: S能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑   P* n& h' k! {, i
    数值分析 发表于 2022-9-25 14:58& Z# ?9 N& K! w! H; g) V
    能不能把这个也贴上来,看看和上一个有什么不同?

    ' u: K. j" T0 l, A8 ^) Q理了理思路,重新做了一个测试。, V$ r( d! i- {% a: }  C
    做了两个 vector 和 两个 float *, 都长 1000000 ?- P5 }, E, N5 Q
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    0 @0 c/ s0 l5 Y7 u( f+ B6 j
    ! {$ ~6 Y" \% Y. n% k内循环试了4种方法,
    ) e/ U; p3 r7 c- t1 ~2 A0 k4 O1. 直接调用 vector inner_product 247s 5 `0 G7 [- ^7 v: j  Q2 k1 Z% W
    2. vector 循环点乘累加 237s! L1 B2 o1 b: T+ O2 b
    3. float * 循环点乘累加 204s1 h, s. _* K+ Q+ [! S4 w
    4. 空循环 100000 次 202s
    # v, C: Z+ j# _* o! J- a
    3 L1 R/ T$ T' C- Q) z不做内循环 200s
    5 ^- _' f( _" e& ^) m% S# y
    0 w* N2 p  Q, K. Q+ b" O# y你昨天说的对,内循环本身占比是很小的,大头在其他处理。: q# A  ^+ ]9 M# t3 y0 H
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) Q! k. I) A6 v, E5 `0 c. u
    / F0 d2 Y5 f: C
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' x! G( Z. P7 i

    2 U& j! P2 [( j' T* x  _(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    % v( U$ W- e4 L; v6 w& T
    2 ~' [& V/ Z+ @- x3 U
            std::vector < float > vec1(N);( g# \7 v. y% e2 A% D
            std::vector < float > vec2(N);) \! ]6 y5 `+ Y7 o7 a% m
            float* b1 = new float[N];
    ( X/ R+ w2 K4 G% j4 I8 Z        float* b2 = new float[N];  S! w0 |4 X! t( s- a8 n. L" G
    ) ~5 ]9 R! y% B& T, i
            for (int j = 0; j < 6000; j++)
    5 i6 J- g' W1 h" u$ Z. o2 _' T        {" G% T, ]) N# ~+ M/ Z
                    std::generate(vec1.begin(), vec1.end(), []() {# ?# g6 Y! \- D. x  U0 P
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    / n. H: h. O) ]  q. V                        });! a) p. ^9 e% q& F

    8 p7 D8 b, T: P3 r. C6 O, }0 Y5 w                std::generate(vec2.begin(), vec2.end(), []() {
    , U1 |/ l8 z+ I5 ]2 v4 _, i8 X                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;- }* u. r' j9 I8 [. c$ ~
                            });6 A1 U& l9 g2 m( `; E
    % t2 w" L* b4 D9 K3 \. a  ]
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    $ I8 F. v2 F8 ~( m( w; X                {" b9 E4 w) `$ u9 g
                            b1[jj] = vec1[jj];4 y2 T7 c6 c% {4 Q
                    }, G- V" {  H+ e4 f! V: w: j6 Q# Z
    # L8 R' x8 ^4 `6 x& F
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ; {# s3 S$ Q; G* q                {( x1 Z) M4 W' C' h$ [+ e
                            b2[jj] = vec2[jj];
    . o9 X5 J2 n$ B! `                }
    ! C; b* u) P9 P9 u7 d  f5 l! T9 h* P1 g( B2 J
                    //Method - 1  N=100000 247s  
    ' {9 ~0 F8 [( {3 `                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 N4 y+ ~9 _% c. R- i" x' p
                                    
    9 D2 v9 i) T- d# ?                //Method - 2  N=100000  237s
    ' f0 f5 C  H0 k0 w0 T& @' Z                /*
    , r$ ?0 M8 T9 [* \% [6 [                for (int jj = 0; jj < N ; jj++)3 {0 \7 e% D! w; d. H- f- L
                    {: T6 ^- w% T% c
                            fresult += vec1[jj] * vec2[jj];
    5 n8 h: B! H3 X% G                }
    1 @  M- G+ U* s8 L                */1 w, R3 C" G5 k* f
                                    
    - @; g$ `' f- F3 _                //Method - 3  N=100000 204s, n+ h2 ]& ~! k8 ^
                    /*
    , J# H7 U# |7 T8 H% n9 f                for (int jj = 0; jj < N; jj++)
    7 x( k) j/ x* P                {% J9 [& u/ i) w# S! m+ x
                            fresult += b1[jj] * b2[jj];
    * `4 }! o5 ~9 |                }3 W, `6 A) ^3 W2 X& F
                    */* \- c% K0 {. H9 T- I" w( P9 Z
    ( p* B& ?7 ^! U8 S1 L( q- o
                    //Method - 4   202s7 K$ Y5 b: J; H& b6 @7 ~
                    /*
      s, Z! Y9 F: k  k5 V. J                for (int jj = 0; jj < N; jj++)! q. ]2 `3 h. _  s# ]% V, w
                    {2 C, b4 A+ _5 `1 C4 C
                            3 w7 p9 E. S# L
                    }2 I7 ~# L2 V) N3 r# }4 X( ], S
                    */! R. `' i1 P5 H+ L
                    //comment out all methods, N=100000  202s                * E: q3 M) e) G, V! g# a0 u
            }
    5 ]& H8 M( }9 C+ A  g6 p3 N$ O; i& o1 V. n" h7 j" I& e+ N
            delete []b1;
    ; Q/ x8 Q3 s+ i1 C. D3 G8 v' {7 F        delete []b2;

    ) X6 ]6 P) n, p$ V1 j/ j
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 h) j5 x+ b- x, A& b# y
    3 D7 z; J/ H) z9 p& r& }7 ?0 [( [
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
      {9 u! o& [6 P9 i* z: m0 t
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:151 n6 J% Z/ T2 y) j) J) F6 v
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 a1 A2 V6 e: I9 a

    . B8 d9 N% q9 y& z. W你第二个试验里面的j在循环里面又重新定义 ...
    1 h$ P/ }6 q2 D, S) i
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    $ Z. y# X, h7 U8 g. s! H/ Y1 v
    8 \4 `/ p6 b, L' D% Z: Z7 p: y! ?  l" f4 y不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    ; r6 H" Z/ A0 O/ B0 F$ Y2 v- O内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL. M" r2 X! V# F3 K
    1 D6 A+ k* v6 k; Y) i7 Y6 D3 S
    不和它 ...

    5 U7 u3 |) H5 R: N* y+ c
    8 g* M# x# l2 q, P不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    & L" R$ Y4 t2 f8 `; I6 F后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    2 _! e0 g" Q! _0 K5 }8 N: Y% j' Nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 y1 o% w  H" a4 y" {: n" l8 Y{7 n+ b2 h5 I  F$ b7 [7 A
            comp temp, xtimesy;
      }6 {$ q/ t; \
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    , h8 ]' ^8 D, g2 a0 q内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ( X! |/ K; c* R" U0 u+ AVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-12 13:51 , Processed in 0.088422 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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