设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    $ W' e) Z& `; V1 ^+ ^, u' t1 I' e  L6 Z; ?# ~4 Z4 c: x
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。* ?0 g+ J% c, D. {
    5 T) U& |% c" V9 \
    速度优化问题真的很有意思啊。
    * n1 z/ q" u. X3 z: l& O. r$ m9 o; r* p) V0 b3 \1 {
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?$ m, P, t: ]+ W+ B* N& I9 t8 |8 }, [
    把代码贴上来看看?
    ( x5 T! M* R& f7 M6 }& s) m1 E8 p& S9 _+ V( M' j
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    * L1 o6 R* m7 \  T4 q0 `: p
    数值分析 发表于 2022-9-24 23:04
    # e6 b1 K9 P- |0 q" Z拉下来?拉多少?' n2 I. P- n1 F0 d/ n4 Z
    把代码贴上来看看?
    , s( b. f$ v* D0 i& N, z0 Y3 F
    ; {: F( U! [: h
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 ^: f$ h& X: h
    {
    * ]* }) {$ `9 U3 S- z# b0 l+ Q        comp temp, xtimesy;, O( ?" h! c* z: B6 }1 O4 E
            xtimesy.re = 0;0 X& A9 [! s& f- N
            xtimesy.im = 0;
    3 p/ `  E$ f+ E$ {8 E; B9 Y2 y2 k, H. _        int j0 = lenB - 1;4 K/ ]  D1 C) h: ]; T. o
            int    i, j, i1, reali;- o' P5 N4 `+ ~% G% d2 d
            if (lenA % 2 == 1)6 }  r- R2 p) ^1 i& b: A
                    reali = lenA + 1;/ Q* B+ ]: _* |4 ^1 u6 y
            else
    8 o, I& Q0 j( T+ j0 e                reali = lenA;; q7 t4 C- B* n  y
            reali /= 2;
    8 J5 p4 Y" ^: a1 t' M
    " N5 a4 x& I8 k( \+ [! |        int nconv = reali + lenB;
    + G6 ?/ Y' X$ F* w        //#pragma omp parallel for
    ( |+ j5 x2 ^' y2 ?% m        for (i = reali; i < nconv; i++)
    % Z' F- K' M0 p& o8 Z        {
    : R9 }! D) z& f4 f                temp.re = 0;# \: Y4 V) d0 l5 L9 ^1 Q9 V; s
                    temp.im = 0;
    0 V' @- g- w* e* ^) \+ b& |3 Y                i1 = i;  V1 d4 Z/ f0 P+ d: e5 r; l6 u3 ~) {
                    for (j = j0; j >= 0; j--)
    8 h8 j1 D0 \: N4 x                {( K- E2 c/ V2 G- Q: @" {; Y
                            /* floating date operation */9 G8 _+ C! o* F( l( m4 U% g
                    }

    7 J9 i7 q; w/ p) p5 t        }
    , j( g, a0 D) z5 k}9 [3 n  C' M1 Q4 n7 X

    . d# j! T. y0 a$ P! kxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    : R" T) ?4 a5 Z9 v; Z4 R1 w% X& }/ p' D: C; v0 C
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    " v3 `# o. Y' T! r( @7 S- u现在call xcorr 100次,耗时78s.
    ( s% H  E' T3 \# x3 W7 i' l
    9 {; @0 h: p9 x7 }& O* ~! P如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. ' b, ^5 q4 C0 g4 w. `% E* I
    4 p6 J4 i* h4 ?6 M$ \
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    5 _# y5 q& D2 o9 k3 `! u' GMaybe Debug mode?
      l3 ~& a5 c; n1 R0 Y

      M1 C7 p/ ?( _: n! |不应该,看我上面的回复。
    6 _) t- x; o8 X( J2 Z+ P. G4 h+ Q8 x$ S# k5 L
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    ' R( s& b1 S, G3 l7 h
    雷达 发表于 2022-9-24 23:54
    / c$ O" k/ V+ M+ l6 zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    : L% ]) k4 ]7 ~1 y% Q{/ I6 ]: F3 f* J1 b
            comp temp, xtimesy;
    7 W5 l4 ^0 N2 y; s

    ; z5 |" h9 m2 x' _$ _  Q这个不是这么比的吧。。。3 U+ w9 q: U1 q: e" f
    # E2 M  ~9 m  k7 n
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 }# V/ t* d1 ^4 W& `
    ) I% S# p# x+ V$ O* h0 }9 c; ?) K' a而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 $ z" `8 @5 J6 M- K: p4 `
    数值分析 发表于 2022-9-25 00:202 S8 J7 o2 x! u1 J6 `& _: R& r$ G
    这个不是这么比的吧。。。, f7 v: M: B" g' i6 T) I3 {
    ' Z; \* T2 V" d* j
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    0 y/ V. @7 h% a2 ?  s$ s! I$ A  P7 n4 e2 t; \/ y4 N
    有道理。' z$ x9 U8 z/ \5 A* N& H
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    & _5 [! y' t# F7 F3 T
    ) f$ Q8 D. a. U1 |$ L! n# X我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:467 G, S  E  c2 Q  L5 W+ e
    有道理。
    - g1 @" s3 n! X: M所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    - N0 l6 ?" e$ w2 U3 l+ ]
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    $ \  v1 f  `1 g  hWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    " @( Y$ H9 u1 a+ e6 j这个不是这么比的吧。。。
    2 q% Z+ p( h$ T" R/ O5 h1 Q7 u1 {  C6 v$ j7 k5 y# y" R! s5 i+ Q' U
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    3 `  s2 k% ?% h' a/ ^3 v, b" k

    & u' E3 K3 G- I1 [  }- U2 \: r现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
      y" t8 X" J( I$ j& m
    沉宝 发表于 2022-9-25 01:48
    ' P1 W/ @6 p! ~5 i1 X7 D, Y现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    6 ]0 w# x8 f+ R3 T8 |" w, V' b. ]2 Q3 y& Z7 j; [
    是的,兄台说的对。
    0 T9 f6 x6 u; Y9 A, A- b
    # G  {+ w. c$ M3 Q其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    $ y, y: w" c  j9 T" J' T" v3 x0 h9 e) x. ?3 t
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    3 W& ]9 J- H8 L1 }: }2 o
    4 Z% L( K. n( \: R7 @1 w2 M+ ^比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    . }+ D3 v: y. w0 T) X3 J2 q% t7 j8 E
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    * M1 d3 c- l) q" E( P
    沉宝 发表于 2022-9-25 01:27  k7 o- t+ N6 Q
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , C9 [% Z! j, l
    / f9 S( V6 o0 H  G& Y4 U% H
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    8 O4 K5 A/ k" o8 A3 h
    # F8 z5 E* J4 Q% a我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    1 s; {: p) c# y/ b$ ^7 P4 r5 g9 f又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    " x/ \. H: `4 E. |
    时间差一倍的结果可以接受。
    + j3 E5 Z* Y5 {
    8 S; G6 c% ^2 L% Y7 m$ p$ r; G你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-10-27 04:12
  • 签到天数: 1953 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 - h8 X) Q1 n& j
    雷达 发表于 2022-9-25 04:47
      Y& H3 [. B  d6 }) R$ Q" k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ' o9 O. P- x0 H' K& `2 f9 o6 n( R2 S' o

    ) R3 {3 |9 f2 {4 Z+ K5 M/ E% {9 X$ v; [4 U
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    / k" t) B: W/ P. x
    数值分析 发表于 2022-9-25 14:58
    ; e: _4 k: L% X能不能把这个也贴上来,看看和上一个有什么不同?
    . J$ {/ X  I% J& m# \% q$ X+ q
    理了理思路,重新做了一个测试。$ m" }* |0 K* P+ ?7 q! b" E/ L
    做了两个 vector 和 两个 float *, 都长 1000005 P8 h& U0 E* t$ @9 i& K
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ R% I) N: L) q9 |0 |' G1 X: d+ c, u

    ' g* u5 O: c& [! Z6 _内循环试了4种方法,, B! I9 A* u1 e4 O0 N% G
    1. 直接调用 vector inner_product 247s
    ( D1 D* w, a7 s3 T( s- t% I: o2. vector 循环点乘累加 237s
    / M3 Z2 S! {" }' M3 h3. float * 循环点乘累加 204s; W. z) q  l8 c4 e7 ]
    4. 空循环 100000 次 202s3 t; C7 K* P; I4 ]3 L

    8 v/ p) p( J/ K% x+ m/ A不做内循环 200s
    9 Q/ P/ j7 J0 W
    $ X* K' W# B6 s你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    * [+ j% z, }! P1 |2 g2 z9 |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    8 l" g5 i1 D( t4 j2 ?% k2 _$ Y& Y, _0 C
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). }( b4 I/ V/ W; C) k
    9 e% F" B7 K4 N  }% S7 v" \
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)) `! I6 B1 u, k; p# s
    * K; o! S6 b" a+ W6 S
            std::vector < float > vec1(N);' w3 T4 J1 d, A. _
            std::vector < float > vec2(N);
    " z: d& y6 s! k' I- k, J        float* b1 = new float[N];
    % D) X: M* w7 |! ?/ H; `        float* b2 = new float[N];/ P  o4 ]/ _/ L3 I1 K, a! O& f# m

    6 j. R  i: j2 r( O        for (int j = 0; j < 6000; j++)( f  X2 V6 N9 `
            {
    ' B' I$ \$ n/ L                std::generate(vec1.begin(), vec1.end(), []() {
    & h1 L9 G% Z" O2 e                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    8 ^1 t. H% w0 L7 x                        });" Q7 j, ~% |' w7 D

    1 L" t+ f( C/ H                std::generate(vec2.begin(), vec2.end(), []() {' k5 h, x6 c  e3 X
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    4 O7 h2 w5 F: l7 _                        });
    ' N" n0 p$ Q5 j8 P4 H
    4 [$ B' f- {( I' N                for (size_t jj = 0; jj < vec1.size(); jj++)/ X7 J0 ~$ ~) Z8 ~! |! T
                    {5 |  c( H5 [- f$ t
                            b1[jj] = vec1[jj];* s5 D* ^& w, r
                    }  {4 q  k' Q4 X* T
    * M+ s! `9 i4 `5 ?3 X# A  B
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    1 w' f( n8 v$ ~, P* J+ h                {
    3 ^" i( \8 e0 u9 }                        b2[jj] = vec2[jj];* X3 d$ W( g9 o, M
                    }
    ' v' h: `6 v- H' E
    5 T! W' C7 b$ K8 [  n) o                //Method - 1  N=100000 247s  
    ; k5 L8 L3 L% J$ R                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    & ]7 U3 d! s5 V+ u" |                                
    9 [" _" _$ g4 b+ e                //Method - 2  N=100000  237s& Q& p9 V  x: C# d
                    /*
    # i' g- ~% M  N8 a2 X                for (int jj = 0; jj < N ; jj++)' m; H4 U! g8 j. C2 }! A
                    {
    5 x& J. G& C& h% E  Q$ e                        fresult += vec1[jj] * vec2[jj];# R1 e! o; j3 H$ p, v: q
                    }# Y: t4 w; U" g8 r9 Z
                    */
    ; W  |7 d2 l1 \: D" Y' O+ y% X                                
    ) t9 t6 e5 E/ g; f4 @# t1 ~                //Method - 3  N=100000 204s0 f' Y. `  S9 m5 v' q/ d$ G3 D
                    /*
    6 y0 n, |+ k7 L7 Q% L: a; r# C                for (int jj = 0; jj < N; jj++)
    2 }  C. u; ?$ x) L- ]% H" n( {0 ~                {; s2 y2 k* B/ C  e( `1 D# }
                            fresult += b1[jj] * b2[jj];
    7 Y1 `0 L! ]% Y* h) G                }
    & r6 [% D" x3 N. {4 B3 [                *// C! l* {7 k8 D: |
      g5 |/ w+ Z. c7 t; J9 o/ \
                    //Method - 4   202s
    3 p- x( G! Z3 X) z) Q/ M( p8 t# ?                /*6 y. |! b1 x% v1 l
                    for (int jj = 0; jj < N; jj++)! B+ d9 @4 o6 P
                    {2 O3 \" t! p) _  x1 t4 }
                            8 g* h" @5 H- x# O0 v
                    }2 s3 k1 t0 x: o$ X" ~, z6 a0 N- [
                    */. G: ?" h  Z: T/ |. O4 ~
                    //comment out all methods, N=100000  202s               
    4 }" q" u7 L* }+ a! x; l4 ]1 Z        }
    ) w; k) ?0 ~4 c5 y1 X
    % `1 u; K, ^' t; r6 ?* U& |        delete []b1;
    ( a, A1 [0 A, G5 b        delete []b2;
    # E$ p3 G; N$ h1 W  W: A
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    - t6 w9 ?9 e0 F5 }/ [3 j( o8 J% N0 S; B5 k# i
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?5 c  F0 q% e1 m" r0 X
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    / v" l: X: e0 T+ s4 R: x瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    # n" K7 J* M: s4 d; W! _
    " j1 b  w* x  R: D. ^你第二个试验里面的j在循环里面又重新定义 ...

    ! Z4 f, Y8 m. a! i内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ T- g$ s" X2 @% G4 m. J4 ^
    0 u9 X; k/ H$ Q5 c
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16+ i2 X7 z2 I4 o0 e
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    8 b4 L" F( [7 i- A2 O. t
    & h2 z( s6 m, H( y: R: @0 f; f; P# ?* m不和它 ...

      p& P: M& v, m5 q7 Z6 e# e& V3 L" E! _* Q1 D( y
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。  ]% T. J; ], |; m$ D
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54+ A# |5 f4 j) `" W0 n- E/ P
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 j" N- U' n' E' h  W/ F- M8 o& N  ~
    {
    / M1 Y; o; x% o: O' {$ Q; n        comp temp, xtimesy;

    * U- E+ F& q5 @8 _+ |' \8 G2 c这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。; B/ @( H% h7 i: g
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?# U; ^" t+ @4 _8 o' {" L
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-15 03:40 , Processed in 0.040882 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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