设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    9 t% n' u; \/ }. u, P5 G# ~1 X4 j% h
    1 i' i& y6 X$ W7 g8 X9 y自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    5 B& B8 k2 W6 P' _" T7 G
    7 L. y0 M, Z0 N+ y  [速度优化问题真的很有意思啊。" P6 z% I. x% k2 N$ O: E

    1 a3 |; F) H' M1 D8 v. E欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1724 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?2 n" g6 i- M/ U# I
    把代码贴上来看看?: Y& [4 v  n  m8 v2 [1 b6 Q  y

    " ?" N) h& P9 ]% }, Z难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    ' M+ e, F  H; \, I* e
    数值分析 发表于 2022-9-24 23:04- B7 I! s7 S: o7 `) Y
    拉下来?拉多少?: @( [+ J, h0 S* I9 X
    把代码贴上来看看?

      N, P$ Z; T, I. N
    0 }  K& [! _: M! e5 l) Hvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 z: C" U" z4 X0 ~* g3 @6 [
    {: R- X, c: a, i# f
            comp temp, xtimesy;9 d1 \+ o7 M1 H5 e- @
            xtimesy.re = 0;
    7 T0 ^: x6 k# x% h" ~        xtimesy.im = 0;& l5 O: n& g, C, J- \0 s8 F( y
            int j0 = lenB - 1;  c2 e6 E% q* T
            int    i, j, i1, reali;& j6 W0 S. j$ ?  y! F7 b! x7 D
            if (lenA % 2 == 1)
    2 D5 z4 a: A- ~# P9 e" ?                reali = lenA + 1;3 x- d; V: s' p6 o' W" K! g
            else
    ' X3 e6 Z% z$ h2 l5 Z4 `/ K                reali = lenA;
    2 h6 t6 P) h* l        reali /= 2;
    & G4 s1 w5 T- O9 A
    # v/ ]0 q3 X1 X) C' N* |5 \- r        int nconv = reali + lenB;
    1 {/ Z8 |9 L6 o# n* l$ U2 h        //#pragma omp parallel for
    " C- C) g' S7 a) S# ?        for (i = reali; i < nconv; i++)( N5 L+ o1 u5 r2 _2 P4 H/ J
            {
    2 c. i4 \% m2 Y" ]7 B2 U1 F                temp.re = 0;
    3 b$ n' S5 {. O& p+ W                temp.im = 0;
    2 e6 [# \2 Q) `" T                i1 = i;
    0 x# j+ \7 ^3 V                for (j = j0; j >= 0; j--)
    * W/ ~* V. ]: ?0 s                {/ m$ @$ H  ^' U: O
                            /* floating date operation */* K9 F# C: e/ }9 m6 K" l/ J& G
                    }
    / ~) v/ Y4 a2 t$ A3 H2 F! {
            }
    7 ?+ l5 ^. H3 V9 y1 d}
    6 ~6 M1 y2 p4 `4 D
    , x7 t. l8 X* \. cxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样( y/ v' ~8 t0 \6 X# B4 q

    1 F# ^* S9 C0 d1 I红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。" l5 a  h0 x+ @: u% `1 N. h: L
    现在call xcorr 100次,耗时78s.
    " J, ?& B7 n! ?+ b1 ~
    " y' U  N& N* y* X/ k. C如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.   c9 {% w  c9 y  b  u. d

    % k3 t4 q2 Y4 b3 r  W) X( {* @
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    0 X* B; |7 f1 o& D" `2 h& pMaybe Debug mode?
    ) @, ~0 `3 g: K6 f
    ' }7 I0 s2 m5 |5 k7 ]
    不应该,看我上面的回复。
    , Z2 F; z! v7 `0 ?1 p' f/ ]) p6 X- t
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1724 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    % J  F' v, u* P7 y
    雷达 发表于 2022-9-24 23:546 Z( i, L, r* ~3 y
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)! q0 o3 e" L, r
    {
    % H0 G. m1 ?/ V; X9 i. E0 g: p        comp temp, xtimesy;

    / X8 q' J, ]7 u, r/ u$ M! z: y! V! i" @
    这个不是这么比的吧。。。. c- s& a9 A3 E& Q
    ) N( l. E" w: N* Z6 G
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。9 s2 |+ t% V, R5 ~$ _
    # m9 C* k4 w' E- f
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    8 f2 p" K' F5 Y+ u
    数值分析 发表于 2022-9-25 00:20
    & h/ M9 I* J( ~$ _这个不是这么比的吧。。。
    : J" {/ S2 p$ J( r& h- F: Z' `* U3 d% D  F
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    % R) ~$ O1 q& P) u

    + e4 g0 h1 Y/ z有道理。
    $ w+ \! \/ z) S! y, E/ F+ \& Q$ X4 N所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。1 }9 Q  H0 H+ u2 t' }

    ) l/ g3 e' k6 A8 q我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    1 O: `, m5 G% x+ c, T有道理。
    % f; c: a# ?  m6 u: v# q( O所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    5 p$ Y2 H% h! ~7 z% S. K你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ( o* u, K7 G. j& t0 P0 p# JWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
      Z6 Q! D8 r5 r- b这个不是这么比的吧。。。
    5 L. T* _8 T* }" x7 k$ I0 _  p
    & K1 f6 ^8 B& v8 e您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    5 M1 h, K6 G1 B( [, z0 o1 o2 _: w$ Q+ A  H8 h
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1724 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 6 C  o3 u. Z1 D( A
    沉宝 发表于 2022-9-25 01:48
    . N( K5 Y) Y. a6 F+ r现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    " H* C% t) A" f$ C6 j! {" P

    - Y9 n% ], a1 l3 ~  I: b- K0 Z是的,兄台说的对。
    ( P. X$ H* v3 }+ B9 i' U! z- u$ W- q9 A
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。5 Q  }3 z7 U2 r3 L, j2 ?
    7 t) Q- T# J& Q( S
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    0 P7 A+ q$ M( K0 G" M' Z* T$ ?# e# g1 h% b6 _' z5 t/ J
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    - A. F2 A; a: s# A; Z1 I# W$ D" M- y, y  L$ l2 j
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 7 c& N& N) e8 m+ x$ h% u
    沉宝 发表于 2022-9-25 01:27: x5 v0 m9 W* Z% W' F* Z
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    6 L" C& O6 L& u- l1 V* F, E
    & Y' h, d: S/ M8 `' L* q; X0 f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。5 f" q8 J1 W6 \
    " Y' B4 S: m, [* m- C8 ?
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47% C& d0 J4 Y/ r. p
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ) }0 t8 }! S4 x9 o时间差一倍的结果可以接受。
    5 S. }8 y0 y3 T9 g" t4 h8 I4 O7 b& q' k* U
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1724 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 ) W8 ?. V+ p4 G/ @3 c- u
    雷达 发表于 2022-9-25 04:47
    7 A* l9 Y/ z# d, V又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ' H8 w! i1 f! T4 }5 l/ T3 \

    ! S; L$ Z3 X3 A- A- l9 V) n7 u* u, m9 l- s! C8 x( u

    0 f: G$ ^; g3 ?1 M2 ~1 Y% q+ a能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    0 k+ G: U) l' p
    数值分析 发表于 2022-9-25 14:58& ?) A6 X* O. X( J! W* X  z
    能不能把这个也贴上来,看看和上一个有什么不同?

    $ e4 b( [& C  f4 D6 ^理了理思路,重新做了一个测试。
    9 j* A) }* Z* q做了两个 vector 和 两个 float *, 都长 100000  o7 z" d, T1 m) K* Q/ [
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    & s6 }  @6 [1 g# C( U: y
      E/ G) ~6 ~& h% ^; n' O+ p$ b1 o内循环试了4种方法,
    0 v7 i: b1 T( b( B1. 直接调用 vector inner_product 247s / ?0 W& g/ T' ?0 Y! Q
    2. vector 循环点乘累加 237s
    " m' \5 e; B. D0 }; h" Z3. float * 循环点乘累加 204s
    9 a2 r& A+ ]$ x, D6 m3 ~4. 空循环 100000 次 202s
    3 w2 E$ ?. O/ @* e8 b, X' V% E0 m0 }8 D1 X5 U8 d! [
    不做内循环 200s( D# }- b' A  e/ t( R1 H/ N6 O

    8 d1 M! ^- t7 R$ m% |你昨天说的对,内循环本身占比是很小的,大头在其他处理。! y! J4 Y: A5 M9 L
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! N' x4 u( D+ B- J+ _
    ; J3 Q/ Y5 X% ~
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    9 E/ i2 k; q4 M+ c" A
    8 Z3 l. S4 ?7 ?3 J9 B(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)7 x' k. E3 \3 A- S8 s
    5 o% [3 Y3 M8 B1 h
            std::vector < float > vec1(N);+ I( C6 l  w9 g7 `+ P' D
            std::vector < float > vec2(N);5 u) O; ]7 H4 j+ [# i, {5 T
            float* b1 = new float[N];
    , D4 r' |7 e2 U2 i; f% Y9 b        float* b2 = new float[N];& b  ^! y- B3 Z1 l  ?2 @8 S! ~5 F8 |

    ( j1 Z2 T/ J5 N& Q3 k. e8 \& {        for (int j = 0; j < 6000; j++)
    ( I3 C& T  W, c5 H  [5 R        {
    3 q7 Y1 Z% P5 z  a2 F1 r8 H                std::generate(vec1.begin(), vec1.end(), []() {
    / B: o' l% A; G1 V                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    5 E4 t" }3 J6 H: w$ u  I                        });
    . L4 p+ E4 P7 @3 M# t2 o8 N
    & Y! e. m. b. K+ z  x! j/ y                std::generate(vec2.begin(), vec2.end(), []() {
    : n7 G% @' U/ R& s& ]                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 b: }+ S2 A, H+ u8 {
                            });
    " }7 n) }. S1 r
    6 Z7 O8 |$ Z( {" n1 c, f0 f9 ^                for (size_t jj = 0; jj < vec1.size(); jj++)
    : Y0 N' g9 M* t$ @                {3 J  R3 n+ c0 |/ g; D5 N+ B7 `  Z
                            b1[jj] = vec1[jj];6 |( W1 O) v6 K2 y, ~2 c
                    }/ N! Y& ~, b5 r: e0 ~' o" N

      v& f1 @: Z& n( _4 A, j' w                for (size_t jj = 0; jj < vec2.size(); jj++)
    * m6 P/ ^( o. ?/ [6 B                {" l4 |) @: w' ^$ L& u$ S6 M1 _) `6 w
                            b2[jj] = vec2[jj];( ?0 s6 D( O: }! i1 ^1 ]. q$ x
                    }9 J9 M( s9 e- d% w0 {, [
    4 b. i2 J3 F: [, j- b+ ~( R; g% u  ^
                    //Method - 1  N=100000 247s  
    & T# D3 l" [& G2 x                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);# J5 j+ b* c. p/ G9 x
                                    
    - L  t! L2 N0 D; f# A                //Method - 2  N=100000  237s
    ( h3 Z1 _" Q$ x9 h. n; o                /*& T; x* T$ ^1 i. f
                    for (int jj = 0; jj < N ; jj++)# x. o# y& T4 s, D: j6 ]( R+ L
                    {+ I5 o; q/ J+ [! q7 L  n# J
                            fresult += vec1[jj] * vec2[jj];$ u1 T* U. N( X" e, Z5 W% {
                    }' P. f9 ~0 P: k  S
                    */
    , f, n' ~( s/ ^5 D* n                                $ `" B0 z8 W' @1 v+ T" H2 v+ i
                    //Method - 3  N=100000 204s
    4 V# k1 z) ?, X4 G                /*+ H7 \! R4 `$ k; S7 ]0 l* n7 j1 S3 H
                    for (int jj = 0; jj < N; jj++)1 p+ L5 ^& x. E! \$ f) I( r! K
                    {
    ; Z# ~( q/ t3 [) J& t) i- x                        fresult += b1[jj] * b2[jj];
    8 d4 [; Y* {3 C2 F! o                }4 c2 z; D3 i+ c4 w9 q) t
                    */& o( p: ?3 h! b- K6 s

    7 H' f5 J4 t8 a  n: d1 d                //Method - 4   202s
    ( h2 Q. r2 @) N* m0 T  j# {) T                /*
    & D2 [0 y1 y$ \                for (int jj = 0; jj < N; jj++)
    . g7 y) Y( t1 ]6 Y; E! r: k6 H                {# x  c; f/ J- n6 A
                            - g0 f+ C4 A9 l; [& d# C
                    }/ w( E( x# M% u, F! l7 |+ m0 F. g
                    */
    % y9 n" ^7 {7 t4 _7 h: C3 v                //comment out all methods, N=100000  202s                6 W, Z& {$ M6 q9 S* d
            }7 ?  o9 j  @9 b

    ) b* }7 i! m0 }7 p8 r$ K        delete []b1;
    1 J6 E- k2 F6 D; I        delete []b2;
    4 C" C% ?1 U1 F% J
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?. J7 r' I% I+ V3 G
    + v2 n; M7 C! _$ s
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    " q- m% Z6 }, R/ _
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    , R1 M$ w6 \0 r# z1 Q' L瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ( R- N' D9 y) g) N4 U& l$ B6 D9 I! m
    0 Y1 ~" l6 f2 d4 V你第二个试验里面的j在循环里面又重新定义 ...

    ! B0 \, T  M# Z$ e0 |( J3 e内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) F$ N% @$ T% t) K& `- L1 K( h

    $ e. G9 j; E  Y: P5 a不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    2 x: u* _$ G. k  v8 }! _内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    - K( B- i3 k, Z4 o; U3 z7 S
    2 [- p& T* t! Q* h. ]不和它 ...
    ) g  U& {) ?1 C# H4 ~& v

    " e1 C! `. b3 R6 p8 _9 T2 ^不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。3 I! A2 g8 ?' \7 d
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    : e  O0 n$ H% J9 a0 fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ m+ l' ]# k9 J: w+ T{
    + F, s! F4 u7 f2 U5 Q8 W+ J5 p( u# e        comp temp, xtimesy;
    ! K9 P! k$ n8 ?! B
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    : B" c2 \5 B4 @9 f/ ~内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?5 n2 W# C( k! V
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-11-24 19:00 , Processed in 0.044794 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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