设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?" Q9 a  R6 o" c( T$ [4 F% G' t, I

    & @* c6 ]6 X( R! o! i2 p9 z; B自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。0 ^1 s) a% B- P2 h4 o: j( Z" t; O1 A

    ; y$ B) ~/ G9 n8 v* I% ]2 O速度优化问题真的很有意思啊。9 ~/ o3 `3 V* q9 m! m
    5 E" s* X5 h7 g
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    1 V" F/ l  M+ D. C0 y, ?把代码贴上来看看?, U& m- b$ [/ K/ I; g

    % C; `$ `/ k5 l6 R3 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 编辑
    $ P) N+ }6 Q8 @7 U& e' W- R& ~
    数值分析 发表于 2022-9-24 23:04
    ; ~2 k, h- N! I9 L$ i3 v( R0 m拉下来?拉多少?
    # {5 O% ]* K7 a+ c! |把代码贴上来看看?
    5 ]3 K! \5 I+ z( p1 D8 ^, M

    4 F5 i, v7 V% Fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , Q5 v0 f' W8 p: H1 \4 M/ ^- [{) x, C$ H+ M  g+ G- r
            comp temp, xtimesy;
    $ e$ [3 i/ n# |% K* `        xtimesy.re = 0;0 z" a7 `$ I* x8 h, V. |  r
            xtimesy.im = 0;
    2 x- l. ]3 s' E. C6 w% {        int j0 = lenB - 1;
    5 ~% I! @1 l/ o: u" E) ~- T        int    i, j, i1, reali;
    ) I5 k/ J& ?: S; N, ?        if (lenA % 2 == 1)
    " }# [. W# Q: i6 |. h# Z# R/ Q                reali = lenA + 1;: C( i3 i+ q, j' \
            else
    7 Y, Y% m7 ^; y) @                reali = lenA;+ I( r, a# s( z4 e# r
            reali /= 2;
    ( L) l6 q" J* t' ]( J% p8 R* m5 W: G' `& S) s# B
            int nconv = reali + lenB;- r4 ]& ]' G/ q
            //#pragma omp parallel for1 @; c* Y7 N: l: p. ^) {! h; O
            for (i = reali; i < nconv; i++)3 |* B5 s3 M5 A. _, C
            {$ q- l, F( C. M+ {$ ~. |
                    temp.re = 0;. r+ v# N- s$ G) t
                    temp.im = 0;# |* d& K( [, i  F8 k
                    i1 = i;
    0 w  j- w0 b! U9 R, a2 Z2 p                for (j = j0; j >= 0; j--)' O- M9 |  L) L5 }
                    {! R* @% H8 {4 h4 M! J) Z& M8 W
                            /* floating date operation */
    ) A0 n7 f% A/ A; i* j4 A, a0 [                }

    : Y! H" w: D: c7 k; B        }
      @1 m" o$ }5 j8 l! }4 f}3 R: c& A2 w9 J0 P* z  z8 I
    2 A: t- k% l; r
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    2 f! d0 P1 v$ p3 Z1 j% P: _& [7 i& `$ P6 K8 J
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. Y% |" X7 k/ E! }
    现在call xcorr 100次,耗时78s.5 M7 ?- n; L5 x( r* V3 Y( \
    ) E( P9 v' Y8 h7 `5 ^6 ]4 @
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    . f8 r* X4 e$ ~* a1 U% l# g" W8 O
    4 ^$ x: J& P# O' g
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:336 J/ {9 r. q: t5 U$ S! W8 _2 P0 e) I
    Maybe Debug mode?

    % n8 @- Z- w7 h0 N6 ^4 @, o0 K" k+ I5 z
    不应该,看我上面的回复。" i& N( d, n$ j# U, m& ?. n5 T- z

    . N6 e$ d' n, c+ O我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 . F, h. v' ^. s* f) P! l* _8 Y$ H) N
    雷达 发表于 2022-9-24 23:54
    ( Q  I! j5 ?0 A2 xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 j+ L& X6 H/ E3 k2 W% P) ], H
    {# q4 ?9 X# z* ~) n+ R
            comp temp, xtimesy;

    $ u5 n0 G7 w6 O8 m4 }9 L  {" s0 j! B) J1 t; ^2 J+ @; ~, R
    这个不是这么比的吧。。。
    4 s8 i% W5 Q4 H
    + m7 m; q8 Y1 k3 W( J您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 o" l. A( F" K/ z6 `
    ' a- K( }) W" V( P而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 , f1 i: }6 Y- W, p" ^2 p
    数值分析 发表于 2022-9-25 00:20; C, c! V1 N+ o5 p* D
    这个不是这么比的吧。。。$ `# G, @4 s' h  d& _

    5 `/ K: ~8 q' j  L3 g您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ; s  m" b# }: L2 R2 \& G+ {, s9 x5 a- }$ T! C
    有道理。
    % P. ~$ I/ V; O" t1 w1 m所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    $ s  r  c; n+ a5 A) v* ?6 o9 U+ t7 U) T2 q) r
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:466 S$ a: }- G- g" T6 \6 l& B( c
    有道理。7 i" m- X1 f9 M
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    . Y6 C( {* X( k9 x& X8 |7 j你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    ; `! @" Q; N: n) I" YWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ; ?# f/ Y1 v7 x$ {" M  K这个不是这么比的吧。。。' I) ^. t+ m5 I, Q/ d

    7 [0 ]! Y' H$ H2 T' `您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    $ j2 U6 y0 [+ N: k' _4 x) L) F
    7 d) W; `3 W  j! g  N5 I# a1 [" g
    现在的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 编辑
    , U7 w, O+ L, ]# A) \. }/ D- ]  H# s% u
    沉宝 发表于 2022-9-25 01:48
    ( F) y3 _2 g( x现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    $ j. h- M' H6 X9 Z: h: g
    0 \6 ?9 r. {6 j, d
    是的,兄台说的对。$ l. ~- f4 q3 O+ I* [
    * r; m# _" w7 t2 m& h! B
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ) T8 j+ ~7 c8 |# t0 }% _! |! N7 h3 l' n7 F& o' D1 z! `* J8 s, ]$ a
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。7 l# \% V7 G1 f4 F
    3 {" @# ]* L, v  N" j1 I
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
      \, q! u5 @3 m  B( b# F7 n, m8 f- S/ |* i
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    , V. S7 J, r9 M* _: u. C
    沉宝 发表于 2022-9-25 01:27
    ( n7 }5 E9 i7 B1 a$ R& W, Y/ m" @你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    % O4 V% N2 {6 f$ E
    5 O: R: a& e+ h4 Q又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。* V0 e7 V1 n8 s& c

    1 I$ _/ g$ b$ G. x# o% n我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47" b0 ~# w- G4 p0 S, a9 L8 I) ?7 `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : m0 w/ f% M, G时间差一倍的结果可以接受。. @9 O! F" C' |* R
    % Z1 o0 [- {5 _
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 1 s, N/ I2 B5 z/ t8 z
    雷达 发表于 2022-9-25 04:474 [2 J3 S% ?' V. u" d
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * h' C0 e- c; z& u+ Z4 b$ }) x2 j% q" p2 N  u" Q$ B
    ) ?) |6 U% n% Y1 Y" j. V! g

    6 [6 Q3 f$ p* ?9 A0 k8 }* U能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 [0 V5 T1 X( D0 s" L) e( u
    数值分析 发表于 2022-9-25 14:58* X- W" N$ T2 N
    能不能把这个也贴上来,看看和上一个有什么不同?

    ) A) }7 @' O& p1 V理了理思路,重新做了一个测试。; }4 ]1 Z% Z! _& X, ^6 _2 J# x( @
    做了两个 vector 和 两个 float *, 都长 100000
    ( E3 {4 G  C2 |8 P2 f4 ~  E外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 z" f3 }+ @$ P

    6 f% ^' s4 J5 p( a" j& }4 i内循环试了4种方法,
    : @* C3 u; R8 ~+ S  v! C$ A# P1. 直接调用 vector inner_product 247s
    $ g% c# n' ], a' @. y4 y% l2. vector 循环点乘累加 237s7 U- L$ @4 ?2 c" n# _
    3. float * 循环点乘累加 204s
    1 t. u" {8 w9 J' q4. 空循环 100000 次 202s
    2 i, M% K3 A8 e) w" M( F8 R$ S1 ?' c. {' Q1 m
    不做内循环 200s+ r8 e. Z: B( J. N, P3 p9 [
    ; g- m9 e) N+ Y  C( U$ C& @+ @
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ' I) y! u5 o) _0 e- d2 y# {另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 @. k2 B9 e8 c$ W: G' z+ [2 P8 F
    . G' }* H0 [( h' q  N' W% U
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    . a8 M0 a. l* D) @% y: W1 k- v" v' F' F  ]0 a
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    2 O4 P- t, o6 M5 r! X
    ( B6 t# a1 X8 z- `0 P
            std::vector < float > vec1(N);
    8 Y2 L; ]! Z  R: X. Z        std::vector < float > vec2(N);1 V$ \' m  m$ C: Y" h6 @
            float* b1 = new float[N];
      G  k# q  w' R7 \        float* b2 = new float[N];
    4 g4 d9 c' [7 ?, [$ O8 l+ h' F% h/ D0 P# n; C
            for (int j = 0; j < 6000; j++)/ h1 S% Q$ t* K7 _
            {( o: t, @7 D6 T9 X
                    std::generate(vec1.begin(), vec1.end(), []() {
    5 ], ~) n, A, l, k8 ^                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! V; u% h" \: u( z5 F; N# k" O: G
                            });
    & z$ E( T6 C1 R# U6 Y& D  k- F& R+ ]+ a
    $ G  ]/ ]  ^0 l. e- {: q                std::generate(vec2.begin(), vec2.end(), []() {- F5 q8 W) E2 v  E% F/ G% z  O* A0 o& b
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    2 T- D  V- v9 x/ e                        });
    & B" o8 F$ n+ a3 q' l. ^9 H( ^% Z
                    for (size_t jj = 0; jj < vec1.size(); jj++)! [( V# p  x, w- y" g0 f, V; L# S
                    {
    ! [/ @) P1 T: a  |7 h" w/ ^                        b1[jj] = vec1[jj];
    * ?. W. N( d5 _: w& b' E                }
    2 F9 {7 _+ Y4 g  L
    " X' [- A; \- h1 L) _                for (size_t jj = 0; jj < vec2.size(); jj++), J& h; O! H; O- p6 {4 k3 I
                    {
    $ l' B) Z$ q- W' @! j7 Y. K                        b2[jj] = vec2[jj];' l" L4 j! ]! M8 _7 r, R
                    }
    " F5 j) k" S+ F' K3 T' w! M- f
    4 d9 T0 ^; R9 C, `( b                //Method - 1  N=100000 247s  2 u& S; Z" L: f/ ]. p
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    * B8 u( Q8 L' D* S; e5 S# `                                % g- A8 l9 m) a, Z
                    //Method - 2  N=100000  237s
    ) o1 s& _6 c( K# e  s( i                /*& d2 m9 B6 B3 T$ z, r' S
                    for (int jj = 0; jj < N ; jj++)
    ) M- ]( j' J6 J- M" _  D* V* ~4 n                {9 m8 x4 v; @1 o( ~
                            fresult += vec1[jj] * vec2[jj];
    ) S! V" G; B4 g: J, m0 R4 b: D; C                }+ i$ ], ^: `: q3 C4 w) u( |, w
                    */
    ) ]0 y; S; `( Z7 n% C9 {                                
    9 Z; P% z& ]6 r3 A* q# T/ Q1 j                //Method - 3  N=100000 204s
    $ J3 `2 b) V% A/ C                /*
    $ y6 B8 O. T1 O6 N                for (int jj = 0; jj < N; jj++)
    " m  o7 T2 p5 y2 `- Q                {
    - |' H: f. c, b/ n& g% v                        fresult += b1[jj] * b2[jj];/ B# W2 u7 N5 V! R. N" d' X2 C
                    }
    * N) A+ g- ~! h: G' c- g. m7 S2 f7 r                */4 a* K2 i7 z( B' ?

    6 I3 [8 }4 Y% Y. o: f                //Method - 4   202s3 G4 `1 o: H/ }. f( [' D& B6 o/ E
                    /*$ {$ B/ W4 j6 H/ k: V; K
                    for (int jj = 0; jj < N; jj++)* n) m/ H1 N5 `2 @! h
                    {  V3 q! d2 p# c7 w6 j
                            7 `5 Q9 U6 X1 D
                    }
    + c) t/ D% v5 W4 x                */" r& L# y* V+ l* K# e
                    //comment out all methods, N=100000  202s                % h: Y# }2 C5 b5 s
            }
    0 J7 c& {$ P( f$ w5 I% f+ Q2 ^6 P4 \* I9 B, p
            delete []b1;3 j- h% I# t! J+ t: n
            delete []b2;
      x9 |$ d: N, W
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    % `# f# }$ p3 C0 t. a
    2 S( ^& _1 }* w. |5 k! y你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    7 u! i2 N% {3 r/ H6 P0 ~% l- V8 ^) y2 W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    9 k! |+ Y2 B. I4 Z+ Q" p瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 b" r* N7 B% k
      f$ s7 X3 ^2 w# r; d# ?$ M
    你第二个试验里面的j在循环里面又重新定义 ...

    9 X  n7 D0 U6 [& n0 e) g内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL. P. j6 h1 S5 c0 g, ^# x3 V
    * \3 R! R1 ^& x. A. ^' N  @
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:163 r" Z* ?# Q% m& [% I. s2 l
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL, c( Y8 A% y# I3 `

    - l! y& Q$ i  p4 r) W1 M不和它 ...
    2 ~" H0 i; W/ \9 }
    : D( a) U3 K, ?) T5 Y
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。" i7 \( F7 [  i$ }) m8 }
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    1 u  {/ p$ k  b' Z( B0 Ovoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      {" H. {% `* L% M$ \{+ Q& z3 v% i# l3 x1 i) d
            comp temp, xtimesy;
    0 E& L1 K$ J* ]1 |1 D" g
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    % n. k! O. p( c内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?. ^* V& }' U4 a* F
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-7 14:05 , Processed in 0.077320 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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