设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?7 ]5 H' |6 v. h  E+ A9 T2 j6 b. m3 p

    ) L% ^, [+ I% K* v- w* U# L自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。  p4 U3 _9 x/ s! \' b# Z% \

    & @6 T! U% l! O  ]- d& v速度优化问题真的很有意思啊。
    ! w% ?! x6 i7 }+ g
    9 Q5 w( j0 d2 @2 N* ?欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?2 a7 Q9 X2 ^0 a1 [! I4 ^( o
    把代码贴上来看看?
    ; }  F+ p2 h0 Z6 q! A) x
    9 g9 b. P1 Q4 e& R/ m5 a难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 2 E) N, P+ w; ], q; k6 U
    数值分析 发表于 2022-9-24 23:04
    ' ]$ N* X: i  h. y8 F拉下来?拉多少?
    / k0 u6 u0 \: ^. S( G' e把代码贴上来看看?

    6 N5 Y/ p+ h- p5 \
    , M, H5 g! c  @3 I" `, g5 z5 Z& t/ ivoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 q6 h& ]' e4 n) v' N{9 b0 ]4 r+ B3 ^  b2 A  V/ K" u; ?- }
            comp temp, xtimesy;: \% [! t3 F9 Y# V4 B+ o: f/ h
            xtimesy.re = 0;
    5 z! W; L. M# u  K  n$ H        xtimesy.im = 0;5 z! W' r6 K  t2 s
            int j0 = lenB - 1;( F0 |. C' c9 G+ i
            int    i, j, i1, reali;, a% A. T9 q8 _+ F
            if (lenA % 2 == 1)& y2 a3 a( |+ ~/ O3 E0 [3 u
                    reali = lenA + 1;+ g* z6 f  y* s0 S* y7 {; U
            else
    5 r1 _7 D/ R4 [9 [! T) ]& d( E                reali = lenA;
    & b  x/ _7 y+ D; N0 [        reali /= 2;
    * W# ?* s9 }; z/ Q" X' l" X( M% v8 j0 F% c/ w8 z( ]0 K
            int nconv = reali + lenB;" }' }9 x# x4 ]; ]2 U" K8 V* \- H
            //#pragma omp parallel for. |) g& @6 X7 K) i, Z% ~" h
            for (i = reali; i < nconv; i++)$ B/ g3 A. H! g0 h: Q
            {
    , {2 b; h6 |9 t9 Q5 d( T. J4 e9 G                temp.re = 0;' H6 E' m' V7 k
                    temp.im = 0;& M$ k! s( A" m0 b7 U
                    i1 = i;7 C5 C' |; w4 B2 k6 I
                    for (j = j0; j >= 0; j--)% p: d& L" A+ z& y9 U8 u
                    {- I# p, C1 f: v
                            /* floating date operation */
    - O- F8 `% i# G- l                }

    * s- z6 i6 l- r        }
    ( u: Z4 i) N; v6 d}
    ; K' r$ l. _' b) g# P- d% A5 s! ]" O/ f
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样7 ~' z7 L" k/ g1 P
    6 n; h9 t( A5 a+ U# e5 p  S1 ^
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    4 ?+ W$ o7 V+ M) ^) T现在call xcorr 100次,耗时78s.+ F  J7 a7 H  E( [! n

    8 g( S6 v# p. c- A如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    , Y- E: h2 R: w
    ) m( L! a; T4 o: R4 |  p
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33$ _( k" y8 W1 X8 ?2 o7 R
    Maybe Debug mode?

    2 n- |6 I/ s5 x( O  r; w* G6 k- Y5 D$ z9 h& L: h
    不应该,看我上面的回复。8 `. `" B- i( z' n- \/ |& G
    % [' G+ P$ `6 r' u1 f8 N! v+ @& ?# W, U
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    4 L% y: E4 }; i. @& l9 e" c
    雷达 发表于 2022-9-24 23:54
    . s) |( r. X  ]/ i  B5 Tvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + l* V0 q- B, o2 Q$ U{
    # G3 f! L# w4 k, }3 i# h3 N        comp temp, xtimesy;

    , X4 l7 c2 o$ w2 a+ s* ~1 s% E& V1 r  Q
    这个不是这么比的吧。。。5 K" P6 j5 r( O. g1 L
    : Z; A4 r8 ^$ a1 z5 ]
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      Y8 v; z. C' X& z; V4 M7 b+ k  U
      U9 d- x! K+ F9 Z$ 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 编辑
    8 Q* p: `/ |' V3 |0 S
    数值分析 发表于 2022-9-25 00:20
    6 n5 O7 n. R9 e, X这个不是这么比的吧。。。
    ' j( N( F  j" x7 J2 I9 l+ P( |6 Q4 T$ r7 J
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    * [5 ?4 z0 T4 x- y! a' N7 N( M4 J0 Y; s! F
    有道理。
    3 [7 h% P6 F. e  s% U3 Q所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    5 ^' K0 ^5 w! {; q* o% q1 L8 N: G; Q4 V3 w# H6 v; k# _
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46& _9 h4 Y+ n6 b8 n- L4 P
    有道理。
    & h5 a9 {* Z/ j6 K0 k1 x所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    $ Z# v7 K1 i( K6 \
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    + L4 U1 t/ n. i4 ?. o4 CWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    / Y8 r( n- ~: m1 c: L" S( D这个不是这么比的吧。。。
    0 W, S! W* {" a9 Y: y
    4 a) p6 X; |0 x0 ^3 w8 i您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    - O; R! A' F5 [* B( ~

    , S; H* ?! H3 N; M3 z现在的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 A( p; v$ S8 S0 M6 b, Z
    沉宝 发表于 2022-9-25 01:48# ?% D% H5 x6 a3 ^3 }( f
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    : x! o' |% Z9 n2 g: p
    $ L, _1 S9 Q0 a; ^. e; p- h  {
    是的,兄台说的对。7 ]" m, m+ s$ h+ E# j

    * k3 m0 j, u1 v$ U5 u/ v1 F1 P其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。; W& L* K* W  f. I6 Q% H) Z

    9 F1 e" P* C$ B5 G8 L& w9 J雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。. Y- `4 Q6 I! {% @; D  b, R" f* ]7 T
    0 _5 q' s- n1 l' X0 S7 E+ Y
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。+ u# e3 B1 R( c2 ^2 i+ @. H- E

    $ i0 b+ X2 X% U) ?当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 2 F+ w/ N- |5 Z6 @$ }0 i; p/ R+ V
    沉宝 发表于 2022-9-25 01:27/ Z) o: a8 Z2 e+ P# b! ^9 P
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ; v8 k! ~5 d( ^; H& o* e7 `( S# r3 \& X0 ?, g3 H4 F- C
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    1 o( V. z3 b0 I) C) y  t0 N: y
    : r; n! K' J* q* V' P% ^$ ?我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:476 D$ d+ y6 c/ T- H& P, W
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ! f3 a% M$ n9 z; H7 y时间差一倍的结果可以接受。3 U' Z" P! `6 s5 Q. P/ F! j
    ( E2 ^) h" `: H1 A! ~. n
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 & r' |, J( E0 @! [  G, Y
    雷达 发表于 2022-9-25 04:47
    / V% d4 ]+ C6 U  e* o又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    2 R+ }2 L' S2 [. [

    , {2 l5 D7 y6 `! ]; M3 g/ x. u4 B( X0 j+ Z  }4 p
    # |3 d  x, }! p) |
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 # `) g* g" ]) J( Q6 J; |
    数值分析 发表于 2022-9-25 14:58
      K: u3 t6 u4 l8 x1 U$ A+ O7 k% v能不能把这个也贴上来,看看和上一个有什么不同?

    ! |7 x. r9 V' j理了理思路,重新做了一个测试。
    , x7 G- k7 F2 R/ [, t2 x$ q做了两个 vector 和 两个 float *, 都长 100000
    0 p9 I4 `: G9 @# r0 X# Q+ `外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
      Y" J( \, Z: ?/ o1 ^; q
    # s$ ]0 M. |  o8 V: e  y内循环试了4种方法,+ R! z% f# N# S
    1. 直接调用 vector inner_product 247s * S: T0 w1 s4 O5 s! G* T: r4 L
    2. vector 循环点乘累加 237s
    ! ?$ _! d3 N/ V3. float * 循环点乘累加 204s: g: X1 `8 ]. x  }4 N
    4. 空循环 100000 次 202s
    ) p6 o" l: A( y2 Q/ A( K4 H' R  p4 g8 i# X
    不做内循环 200s( g7 G0 E& f' L* Y  N
    ) [$ L# a5 D# K' ?
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。, C0 L: A! i2 k
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    8 Q; x% _2 |' W2 a+ u; w3 p) @2 q" Q" C) H3 h" r, z
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    - d$ C8 l  @  j- j; r' G: a
    4 k9 w/ S1 z( K5 v# p' [' w(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)( X* [0 Q  c1 O* p0 Q
    0 W/ W' B: B* z( J5 G1 Z
            std::vector < float > vec1(N);
    " G0 l' O% w. m3 J% U! R        std::vector < float > vec2(N);3 m$ g! w4 |- I, b/ D; W  w( Q& q
            float* b1 = new float[N];
    ( `% ^0 M/ a& M; W  R        float* b2 = new float[N];
    6 s9 x( v) W$ P! t' h( I- q- d8 {* Z) q* R  I" `3 c
            for (int j = 0; j < 6000; j++)8 A6 _/ Z' g* W
            {% O3 c9 l3 I; k: o* A# i' S# e
                    std::generate(vec1.begin(), vec1.end(), []() {
    , y, y" Q7 {6 `                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ( x5 G* L0 u) l/ ^2 d0 h                        });( |5 d( B% j& j5 c: u; M+ W
    / W9 S# ]. [3 N$ S2 b8 ]
                    std::generate(vec2.begin(), vec2.end(), []() {! [) S5 a+ s  |. s) n
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    6 [' K" P+ w0 j! c; e5 ?& M& P                        });
    & O; v' H! v5 P7 P% ]' s9 G8 S; w) i8 c7 Z8 ?$ x
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    9 H: e3 C. }* C: @# R' V% B0 J                {
    $ Q+ G5 j0 |6 `) A) p* L$ O                        b1[jj] = vec1[jj];
    % Q) o! W7 Y5 y9 H6 v                }
    8 u. R3 t/ i+ A4 A$ u0 y% w3 D8 V3 `% a
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    $ h. P, v* X" X; Q. J                {
    6 w$ l- ]7 a/ r* n" [                        b2[jj] = vec2[jj];
    ( p" Q' n/ x5 o8 z& }                }% x% m# f& F% p# i& f! M6 ]
    4 O# ~4 t" b: U- ~0 _2 r
                    //Method - 1  N=100000 247s  8 }8 d" |* P) V) }
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    . c; O* s, @: m1 G2 r                                % S8 Z, q8 p8 G  w) @
                    //Method - 2  N=100000  237s* Q; P8 }3 a. A' R0 B) f
                    /*, s$ c) ?9 B: i/ o; _9 j
                    for (int jj = 0; jj < N ; jj++). ~/ A, Q7 I# ]! v
                    {
    ' O' r% M8 }: ?1 z% B                        fresult += vec1[jj] * vec2[jj];
    8 u4 R$ B2 }7 k9 S) m4 s$ V, P! |                }6 n1 N- Z& w; G9 R5 a0 T: ~. |) S
                    */
    ( v9 _+ @( o* B1 X" a                                
    9 q4 _4 |8 Z: r4 o                //Method - 3  N=100000 204s) y0 w) P8 A# E  J
                    /*4 W  `4 `2 K1 N2 H* U# M- i
                    for (int jj = 0; jj < N; jj++)( w) z0 Z& J! Y# G; }7 O
                    {6 t' U! I" j8 v5 y3 o
                            fresult += b1[jj] * b2[jj];, b! a( i7 @( u3 _, M0 g
                    }
    4 d* P" W* t( K5 Z                */
    / S0 f, S9 G/ y& L+ |( X0 {! `
    * c4 f5 Y0 l+ W% j7 A+ i                //Method - 4   202s( }' C8 K+ d) U1 [2 c( A6 }
                    /*
    % U) u4 B$ z) ?                for (int jj = 0; jj < N; jj++)
    0 W/ b5 |# ^- X# @' q2 Z1 V9 W                {
    % v$ H+ q: l+ e* K; A                        
    $ x( g( y+ b2 S3 q: p' @( u                }
    9 T& a" U) }& A                */
      I/ z; ~; I! `( ]6 J8 m! b3 O                //comment out all methods, N=100000  202s               
      _1 I$ j; Z6 U5 u" v        }/ M+ |) \# w  S) Z6 y# s5 l& z- K

    8 d. L  o( R) X% i* M+ E: B        delete []b1;4 H2 p! w: D) Q1 ^7 T# W
            delete []b2;
    3 _: P: i  }( u# _  M% c
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , j- }8 z* F1 @( j. @1 A& w/ N' ^  |# h# `* h1 K+ I* j
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?7 \: a) r1 \# Q2 q0 J+ w7 i
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ Z/ `# V% `) J9 d' w8 x瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?" E+ C# m4 {* K& m- Y
    8 ?0 f" ?( T6 C5 B
    你第二个试验里面的j在循环里面又重新定义 ...
    , v2 f1 e/ h; W# ]2 z5 m2 X7 @$ a
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    $ Z5 U8 n7 g5 V6 i% W. B
    6 j6 Q9 \$ f. p& S7 U不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    4 ~; e. ]* ?8 `& Z! D# q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 N3 F0 a6 j: Z! @
    5 d2 D' ^6 }$ @5 a, q' h不和它 ...

    8 @8 t4 y% A/ Q, n" B% ~& w# f, `# P* ?
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。3 o8 V) @- x; j
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54; G6 W) @, ^8 [/ J0 Y- |
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + ~8 g$ Z; t( W) D4 g{
    . Y! T' m& Y" u& q0 Q6 W+ t        comp temp, xtimesy;

    8 O: h: @5 S6 B& g) a这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。9 g/ t: c& v0 Y0 U# _" Z
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?: A/ x$ S8 z/ p
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-7 01:26 , Processed in 0.070393 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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