设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    5 v8 N' O' l8 y: f- p! N! s% T1 |# g" c( \+ y+ E
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    ( O2 M  N5 j# Z5 U% ?! T0 x0 G% q9 M+ w3 B8 Z3 W5 t8 g
    速度优化问题真的很有意思啊。, _/ U) L; u. @% u' m1 b' @% ^5 H& }! v

    ) ^% g- O. @  t欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 22:29
  • 签到天数: 1933 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?( A- S7 R+ D# e/ {( b6 @
    把代码贴上来看看?
    + L& J& H* b# U* i7 K8 p6 r8 _
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 + s7 s: ~5 ]3 k. y; v
    数值分析 发表于 2022-9-24 23:04( h5 t0 T% T, A/ c! }, ^$ X+ M  E) A
    拉下来?拉多少?" ~6 [: K; s( V
    把代码贴上来看看?

    : z3 |! M+ L, S, o9 x
    ) D5 o" O* @  m3 [9 }" qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      ^. ^1 e: b7 Q. q! H{7 f6 I5 V) t  S1 U2 [
            comp temp, xtimesy;
    , C- I4 z( N+ R# S$ @3 d5 q        xtimesy.re = 0;
    ; p- i2 `# `1 K        xtimesy.im = 0;: Y3 L* A5 J0 }
            int j0 = lenB - 1;; {. F3 O0 ]" M9 D( O$ j# Q
            int    i, j, i1, reali;
    : B7 O! L% n# S$ j( h0 d* B! I        if (lenA % 2 == 1)9 h5 {) N; y2 ?4 z& H% l% X
                    reali = lenA + 1;. i8 h5 s4 j. E& |  _
            else6 y( d: M6 {' L$ \- k4 k+ b$ f
                    reali = lenA;
    7 N+ z  y9 m6 b: g! G" {        reali /= 2;
    " G, C) J8 }0 K- m3 U3 }) B& {7 l
            int nconv = reali + lenB;
    6 p* M# P, h( w( G- X1 o7 i        //#pragma omp parallel for
    ( _2 j; Q9 }! {5 g' M# p# J        for (i = reali; i < nconv; i++)
    9 M3 d& {& `% K( q# Z0 K        {0 z! c% J7 e5 S  ?" w
                    temp.re = 0;7 m- i: t2 _' N1 A
                    temp.im = 0;
    7 _" W; U1 ^) Z5 M' ]                i1 = i;8 v3 Q0 m2 ]+ Q5 g
                    for (j = j0; j >= 0; j--)
    2 ^3 f6 C1 v3 Z- ?: r& U, Q1 k                {$ Z0 Y9 Y; }: _2 D( |, |
                            /* floating date operation */0 ]$ d& i/ d+ Y  |2 }, W- B. B* |
                    }
    % i0 f# Z. s" p! U
            }
    / F& J  G4 d0 a0 z}! S: c& J; W" j5 W+ k2 J

    / @: A! U2 F  z5 A4 B8 ]# c, Axcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样+ o, N/ O; ?0 p4 a4 O5 m
    3 C9 ^" p3 ~0 i9 M3 ?' i8 C
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    2 @9 S6 N! E9 k4 Q+ _' {& z现在call xcorr 100次,耗时78s.: ^7 R# n+ }" R& R
    * S# w" g, c9 U2 u- g: Y
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    9 P/ C' l, S- I* P7 v. l$ E" S, q$ }8 O5 W  O
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    0 I, q% Z' R0 n* r: z0 SMaybe Debug mode?
    ! q1 _. |) o0 x! S

    * j: p) \2 ^0 y2 F  m) N6 ]不应该,看我上面的回复。
    ' n* C- {( J/ b! w7 ^/ m  V9 d7 r6 M! t' \* L
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 22:29
  • 签到天数: 1933 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ) P, B5 _* S7 \  g
    雷达 发表于 2022-9-24 23:54. P5 O1 W2 p- b/ f, x. b
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    . l7 H. \3 i% Q4 q- C{% H* H' N7 y0 e0 U' S& f7 |
            comp temp, xtimesy;

    ! V5 Z  w/ O' p, f/ Q* g* q) p+ ~7 L/ ~! S% P
    这个不是这么比的吧。。。- w* Q7 k$ C9 p, S; z$ O' W6 R

    ( |2 M& A- k8 b, M( u您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。% \1 \" ~3 L) s5 C; e5 @1 S
    3 h2 r% e/ X7 I9 {" u
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 1 f, H  i4 Z# A4 q. R# F! L
    数值分析 发表于 2022-9-25 00:206 f( }& k4 R" P8 {4 Z, g2 {
    这个不是这么比的吧。。。
    # L# @* T/ v3 x" d# r7 F' o
    2 @* n- w2 E- g8 K$ h您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    # S( y" z8 I$ C4 X5 O, F! h
    , |+ o; L7 U3 ^# B% w" e6 V' v有道理。: r& G! z+ j* l% j+ J- N% X7 U
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    0 ~% \: ^3 b5 @" u# v& t% v7 J/ D8 q( n
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:464 q0 d5 d- Y3 f( m
    有道理。. v  e: S1 a2 _
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

      n6 p2 ?- N% i. j/ U! X7 D$ w你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    9 P' o$ B# G8 {/ iWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    4 A) Z. G$ b, Y1 L这个不是这么比的吧。。。2 h, b/ L# ?5 y' {+ u

    $ h" p$ a. B& W8 Z. w# [; {# d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    & `" c6 Q( A3 A9 }7 ~$ t  S% ?" Q
    7 b  n. @/ h$ N
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 22:29
  • 签到天数: 1933 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 & Q& W4 ]9 D6 q  \/ w0 \$ U  w) g
    沉宝 发表于 2022-9-25 01:48* P, g2 ^: L1 A$ X( K" Q$ x
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    8 U8 \2 n' ?8 |; T8 }9 P$ M

    + y* a3 y8 s. a是的,兄台说的对。- y, P( ?, E5 x7 ]/ j$ m- w
    6 w8 m( h9 U$ @) K
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。& l1 M  g, C$ f" o  {, ?
    + X( r- \3 I  s+ d6 e/ K- O
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    # n& k  z0 p* Z3 `2 T8 x
    " Q7 a1 N4 `% f; ~5 l8 i+ N$ s  ~# D. F比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    3 @% d2 C. ]# O6 S% ?+ S! l
    8 ]7 e2 \8 y/ Z( @5 t4 v当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ! w  h: p/ J# Q& [3 v2 h
    沉宝 发表于 2022-9-25 01:27$ R' e3 i6 n( J; q& _, K, B" X
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    . M; G8 P8 m& {$ ^6 G
    : }: h) ]* Y* s* G0 j# N" X) Q7 `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。7 K; b/ M( R" U, W! s
    2 l+ g; i# N/ H
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47: U! k' X8 w& A5 z
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    8 ?- w2 s3 A; L0 w& n. U时间差一倍的结果可以接受。
    ' ?- G3 }3 V) h8 V# b% d7 r0 k# x/ Q3 n6 \6 ]$ S
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 22:29
  • 签到天数: 1933 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    1 u& t7 Q1 P: K' f; |9 c- ^
    雷达 发表于 2022-9-25 04:47
    9 U8 e. Q0 ~7 T7 C9 {+ U又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    1 t7 s7 @* R* \
    . S. ]; _9 I* C) C
    : o8 O  _. G; U  r- i( T
    / J: z. B5 p- P( ]. c
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ' \3 d9 M" e: R8 d  P, b
    数值分析 发表于 2022-9-25 14:580 I; |, |. Z: S: e. c2 b! Q
    能不能把这个也贴上来,看看和上一个有什么不同?
    % G; K# @2 A; g6 H6 r) F" X% R
    理了理思路,重新做了一个测试。- D* O" w& P' F
    做了两个 vector 和 两个 float *, 都长 100000
    # l% e& A: u. t: D外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.* K( `5 H# O" R; V

    5 t4 j8 g- e" o( u8 E& n3 j# D- K# p内循环试了4种方法,5 _) U+ f$ c, Z6 L' y7 l
    1. 直接调用 vector inner_product 247s
    3 }# H: Q/ m, R6 ^( w" J2. vector 循环点乘累加 237s* D1 }' ?$ B  o
    3. float * 循环点乘累加 204s
    ( S+ Z8 n9 J9 ^4 z4. 空循环 100000 次 202s: B  W/ e( ]% U/ m1 t$ m
    ; F% y" }5 C: }1 e. ~) ^1 y1 v: T. z
    不做内循环 200s
    7 e1 p4 g0 O1 j0 W
    / |8 H: V/ R& r% Y, i# H, _" _你昨天说的对,内循环本身占比是很小的,大头在其他处理。( |- z3 I' i' o) o) E% e  ?& [( v7 Q- Q
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ K) d3 u  V- O! b8 b
    * t2 {& ^5 {+ U& }0 ]  M
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ A5 N1 m7 [! q5 z1 r$ e* E
    + n1 l" n* }2 `) ~# G
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)  I3 y8 J+ D+ o% X- j7 N- L
    $ y+ \, i# s5 W  n2 W7 c: j9 x
            std::vector < float > vec1(N);
    + A. F$ ^, @7 g4 l+ F/ s3 [) }        std::vector < float > vec2(N);2 P0 ?% k" I: {6 g
            float* b1 = new float[N];
    6 s+ V" s! L( D. Y' u" N        float* b2 = new float[N];
    / h" x9 Y% M  K+ y5 U5 u: l8 P+ O! j  K+ G% S
            for (int j = 0; j < 6000; j++)
    ' n$ j% m! V5 X5 f        {6 E1 M6 D& `! x+ s- ~
                    std::generate(vec1.begin(), vec1.end(), []() {; B+ t$ C6 w5 N/ F1 I7 D$ i
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! h6 p3 M1 d9 K' y! O0 u
                            });
    & R4 E1 h7 P3 x! M1 y; j  j1 j" C1 u) B. h7 U
                    std::generate(vec2.begin(), vec2.end(), []() {5 k0 D2 o5 W! N" {
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    , V; N0 z$ \# z/ ]/ D# C                        });
    " M. ~4 q% j! S5 q- s. [+ e* I& y* y
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    . f; v8 i& n, |8 I$ ^0 G                {
    & d4 @/ D% E4 J, H6 z- j                        b1[jj] = vec1[jj];
    3 S& W  `. h" N. i3 N* r                }$ C! h" D6 F8 W5 w

    , v' d% P/ a5 c' O2 S0 O! d                for (size_t jj = 0; jj < vec2.size(); jj++)
    " {# F0 p) X! [# V& h) X. e                {9 c3 j- U6 A; p2 C* t
                            b2[jj] = vec2[jj];
    , d; A6 [$ t) ^) W                }6 g# ~! u8 O' d0 c+ y; V

    3 n1 }) v4 z- {0 c3 t2 \% K; F                //Method - 1  N=100000 247s  1 b6 R+ Q! u! T
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* }0 w6 w+ I. T9 S, y
                                    
    5 w# e1 t* E7 A; q6 }; ^8 t; @                //Method - 2  N=100000  237s$ k; q4 m, g5 ^4 i) W8 i) |5 B) \5 Z
                    /*
    " F  V2 |8 F6 _4 [& `                for (int jj = 0; jj < N ; jj++), d4 x, ?; b* K* @! a1 _
                    {# `3 {& K+ m4 ~
                            fresult += vec1[jj] * vec2[jj];
    & \+ L" H+ s' U# }& u5 a% |                }
    * V: s4 z2 {: s4 e                */0 m8 V3 ^9 X: H4 b# z- G( Y
                                    
    # s% ]6 C5 U# ~3 s                //Method - 3  N=100000 204s
    . ^9 C' l/ r: [1 b                /*
    9 o3 W- G. E  M9 S+ \7 `                for (int jj = 0; jj < N; jj++)1 J# t. T, H+ ~/ V+ ~
                    {- v0 |: i6 \# `- b( U+ L. G# ?
                            fresult += b1[jj] * b2[jj];
      O2 R/ C7 O$ g8 w! t6 q, p                }- N" P$ f( J+ S; v/ T5 k
                    */# ?, ?4 y+ ^' ^2 m2 t
    + O: ^/ r* Q; K
                    //Method - 4   202s: B& H4 G6 L4 l4 J2 }( K% m0 k
                    /*
    # H' f/ c2 u3 D+ }' o, _                for (int jj = 0; jj < N; jj++)3 I5 m. W# e$ C4 ]/ N" u3 e
                    {
    , J- r7 S% B$ ?4 c                        
    8 j' r  [1 W3 B9 ]2 H                }
    $ \" j# m0 Q# G# N                */; U7 c9 i  S7 L* b7 \
                    //comment out all methods, N=100000  202s               
    % {5 O' ?! X* \' ^        }# P$ f' o+ g4 z2 f- `+ _
    3 J  z: Y5 B/ N) r
            delete []b1;
    0 x& F. u3 p0 ^& s        delete []b2;
    2 e3 u4 R- r9 S, _7 o4 e
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?3 `3 ^8 g; j$ w! k  ^. f0 a# x

    ) T3 f# ]% P+ J6 U. J你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?' M2 w  [7 P5 _% f+ B3 P1 Y( V  ^
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15" ?, E3 d1 s0 O- i% K
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    $ J0 W1 k" t- ~1 C% `" p: q0 h  M2 @' G- ]# ^( r5 D
    你第二个试验里面的j在循环里面又重新定义 ...
    8 U+ a7 P  A, a, ^
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    1 A/ C8 S  j4 F# R9 ~$ |1 x4 n  y  M) I( g- Q
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16# {; K* H! `1 I$ q( A7 y# v
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    1 U( z- d! R, [6 S9 j$ i/ ]" x/ y1 O$ S9 @
    不和它 ...
    4 S! B+ u3 u$ _5 I

    3 J. I6 f* a' k) c- o6 |不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ) E7 L  H! J/ x3 S* V; n5 M" j后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54+ @) O& O; o0 ]% L
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ Q$ N2 U; Q) N
    {
    " b. I( Q) j2 @1 ]- I        comp temp, xtimesy;

    4 v4 \9 d- a$ w5 |$ o8 a! [6 t这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    6 A: S+ R. y1 s( [, c7 e8 R1 P! J内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?' X: k& Z5 O+ X' p; p9 s0 u
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-7-17 19:41 , Processed in 0.043253 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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