设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    - B9 h( I6 o* \
    ( X' \3 d( F7 {6 p% q; }3 ~$ G自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。3 U: @* `) z# T3 |4 t

    7 f; b5 }! ^# h" b( U: A. [; ^速度优化问题真的很有意思啊。$ M8 ~4 h3 x8 u6 K$ D( A
    2 D- b1 n$ P; p. `8 I' o
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    % x) v5 f& \; F4 c把代码贴上来看看?
    8 z" q4 |- A2 D! O# v  ~5 j4 [; E( ~3 g0 M7 ]( o% M
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    & i) [* [1 F% j, g' v, h' O
    数值分析 发表于 2022-9-24 23:04
    # f! y8 y" ~- H拉下来?拉多少?6 O5 v$ {+ W2 \$ F1 d
    把代码贴上来看看?

    / C0 I# x7 a9 @# r7 k9 f& ~- k( L0 `
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 r8 u6 k( E. ^/ U. T
    {
    ! }. T- `- _8 k6 E* V% P$ e! g& l        comp temp, xtimesy;  U  w$ x/ g) |4 }. q$ h
            xtimesy.re = 0;
    4 ]! m  {, F1 g6 u/ Y- M        xtimesy.im = 0;
    " @' f9 b9 i' n& E& X        int j0 = lenB - 1;
      X( @5 v5 h) u0 T# _7 P        int    i, j, i1, reali;/ P5 Z6 d0 K" N' V$ B
            if (lenA % 2 == 1)& v2 Y1 c3 o: e: C0 t
                    reali = lenA + 1;4 K7 \1 E% p6 X( T% j
            else
    ; S( x  W, ~: h& m4 y                reali = lenA;
    3 H1 i$ F" F' D( C) |% K0 G        reali /= 2;: @8 L& b" c1 D3 n

    & u) N* H  M# a9 @0 e8 \# f+ t        int nconv = reali + lenB;
    7 e: G2 ?* d" C0 t' X/ i) u        //#pragma omp parallel for
    0 b; ^* i; Z6 e; D6 [% _  t        for (i = reali; i < nconv; i++)
    5 T0 T3 a# ]9 P7 \/ ]        {
      P1 D) y- N) y                temp.re = 0;
    + T. g0 @* d. }  J                temp.im = 0;: B$ N) K7 L% P2 P
                    i1 = i;3 h/ f$ m# Z+ L! h" P* B' C, Z0 B& E
                    for (j = j0; j >= 0; j--)- A$ ~4 w$ q6 G
                    {, `# o" T7 @  y+ W# J
                            /* floating date operation */! U' @5 ^$ Z2 k; V2 L) d9 N
                    }
    0 _+ x1 }7 t. X% w: b- }5 U! ^
            }
    % B7 c" v8 J& h; ~}' g* F9 _( m: k# A5 l

    & @& R2 P; \: `5 m. lxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    " U. }( l- a7 a8 Y4 ?2 q) ^) ?( Q5 B* G- c! x8 F6 b
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    3 k4 I# {' ~& u8 g3 i% Y& @4 k现在call xcorr 100次,耗时78s.; X! A9 i; `/ E# l' v

    ; n2 g2 Z* ^5 a( \" C" F如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    + ]1 p# w! b) e& o1 s. s0 B
    ! [9 D9 M3 G' r0 ^- `
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:331 X* n* j+ a+ |6 \" d
    Maybe Debug mode?
    ( A6 s5 z& l  P/ L  v' v& O

    5 ]$ |) f* {2 `  ]3 f不应该,看我上面的回复。& n# U/ T( i3 ]8 g! m- b

      J* e' z- P7 `( @8 ?) H我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 - E9 Q  }( A6 l8 ^3 p) C! F3 ^, A
    雷达 发表于 2022-9-24 23:54
    , }+ Q% K& V4 Z" _7 g' Y( u* [void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( s+ T0 \) a. `* L, d
    {3 [6 j  I3 a. L1 t  ?" F
            comp temp, xtimesy;
    . `, i- P+ z/ l) f

    6 P, |7 I5 \7 h; t( p这个不是这么比的吧。。。! _2 A2 W5 p, G4 s# ?# S8 a
    ; B/ d* z/ c) z: U& F3 Z& d
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。% G( }# Z9 Y: S8 x/ |
    6 g6 ^3 O- h/ p0 ?' ?
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 - v6 _$ W/ ^6 J! G$ P6 z! I/ D
    数值分析 发表于 2022-9-25 00:20! S  `4 h7 x( Z5 k! e
    这个不是这么比的吧。。。5 d- n$ {+ d5 a+ \9 \
    7 k: ~( S- k9 e' ]4 |0 w5 {% ^
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    ' D, p$ t; X& z  J. q! \; U
    * G1 I9 _. l- c8 G# C% Y' V有道理。4 _% J  t% q9 y0 D
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ( I9 C" C  E4 _# @3 i3 y1 H& T) |. q* W' w
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    7 v3 D( v1 V* W/ J8 V: U4 g有道理。  }* q6 v/ n+ ?2 z- g
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ( z$ _! M% C3 p7 ~! G+ Z你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多/ N" @) V! t% |! B% u1 }. z% \, V
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    ) L+ b; ~- J5 F5 q  C& B7 }+ H这个不是这么比的吧。。。
    9 R; B) o$ e4 p% w2 d! ]! H
    : i+ W$ {( x% H$ R您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ) ~  l9 w+ w2 N4 J5 C
    # z" k( e; L5 c2 Y2 |  p
    现在的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 编辑
    2 C( P% S+ j8 B7 R" ^
    沉宝 发表于 2022-9-25 01:48
    4 x; Y( g1 C- ?现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ! R% b( F; @% Y4 o/ e2 |. K6 g6 n9 l5 e* l. k+ l- z
    是的,兄台说的对。
    ) q( z* r. a) ]% ^2 T' a
    , V2 N. q% |4 V4 R其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    3 L6 R4 P/ h' U1 f' E
    0 I9 R8 `6 a7 ?, I0 W雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    6 t5 e- `' l! B$ `* j" F( Y8 Y; y7 ?% Q4 Q, ^0 Y" a' v7 S
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。6 s! ~4 z0 a5 n  m% H; E# \

    , C" W. N) T0 Q2 n当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    6 i. V- d' f+ ]" t6 b
    沉宝 发表于 2022-9-25 01:27$ A( l9 _+ j+ \% d' k; o( ?7 R
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    * o9 `* G9 g" z  y
    ! A5 \+ d4 @  f8 Z6 v1 P: Q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。6 W. S" I( M& K0 P/ K7 @

    + X, a; Z( T# T; F我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    % C5 M0 n  p' _' E$ D$ j# F又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ' v4 M; t' o- y时间差一倍的结果可以接受。, B% T1 L. i! w4 p' E
    , a! s4 u& l& ^% H# A5 g  s
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ; f$ ?8 g8 H* v( f
    雷达 发表于 2022-9-25 04:47; j/ I  K- m, o1 S
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / b7 j2 y" a2 D4 m
    : q0 T/ ^9 p: M+ N# Q, K" u  F: k* m$ b2 H( I0 G( r3 }

    % n1 T  |8 _5 u) J9 Z能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( I, V6 a9 v. M" F" y" B
    数值分析 发表于 2022-9-25 14:58
    3 }7 W. P! g6 \/ G! j) s能不能把这个也贴上来,看看和上一个有什么不同?
    ' ^; H. ?1 X+ }9 ^- V, m; E; E" q
    理了理思路,重新做了一个测试。  b' n) I# Y5 S: R1 o
    做了两个 vector 和 两个 float *, 都长 1000003 l6 ^1 n" Y8 L8 ~; [5 e" ?% T
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    4 q: f( j3 f( c  V* E  ~$ K) _9 `8 U# S, Q7 _4 c# Q
    内循环试了4种方法,2 e& r  B9 e* E
    1. 直接调用 vector inner_product 247s
    2 R) Y) [5 J) m# ~4 t( o" m$ F2. vector 循环点乘累加 237s
    4 X3 Z' E$ o% m7 ~# \: x3. float * 循环点乘累加 204s5 ~; {- G# [( E' ]) \- S  i/ q. r
    4. 空循环 100000 次 202s: [* h3 o; I7 V- |' }4 d
    . N7 T4 h# ?, g9 {
    不做内循环 200s
    ) P3 X8 s( D% T: x+ n# I1 I' |; Q
    / |& W' _0 _5 _6 l9 l你昨天说的对,内循环本身占比是很小的,大头在其他处理。; C/ {% B. z) [7 J3 v9 h3 K
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 `% m" m9 g3 ~( |7 G% j
    ) a  o' d8 Y# \7 Q: G
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    . n) C; U# G4 T$ |
      o4 F2 d5 S  F6 s  v(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)% p' L! R1 r1 F' W& c
    / }0 u, Z0 D' X8 W) f" h
            std::vector < float > vec1(N);
    3 F3 o5 R% p* J8 B' Y        std::vector < float > vec2(N);& w% O+ `3 y" A8 Q
            float* b1 = new float[N];1 C- O  H/ _- c2 Q, U2 A
            float* b2 = new float[N];* {2 q, O1 f) z' Z; ^6 e

    , M  B- H( ^; Q8 ]' }& y, l        for (int j = 0; j < 6000; j++)
    % s& p# H" A$ ~: e! Y/ M, A0 k        {  q  [/ _' G/ }* ^
                    std::generate(vec1.begin(), vec1.end(), []() {" O8 j" @# z+ p
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 ~  R& n8 U2 {$ Y' g
                            });4 H& c2 i/ e- g  J+ X

    , V. h9 ]+ r1 @6 \                std::generate(vec2.begin(), vec2.end(), []() {& x$ C/ o. N8 \$ L, p1 g6 o; \
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    0 X9 }: L9 @/ X                        });
    9 I4 u( m# C7 j! N# j
    0 @: p+ j  ?' f                for (size_t jj = 0; jj < vec1.size(); jj++)
    2 ^# B; _: E6 W# Q% p) W  [4 t9 N                {
    . [8 y7 Y; P7 \2 I3 e5 J4 G                        b1[jj] = vec1[jj];% H# ^; w  a! r
                    }
    : L5 e9 [. k1 e
    $ I. V; O9 l; Y/ b& ]                for (size_t jj = 0; jj < vec2.size(); jj++)0 z1 J3 c' O# Y
                    {9 n, ?8 X: p9 C) P7 n' C  I1 f
                            b2[jj] = vec2[jj];
    4 q0 Y: \  H2 e! u5 V1 w                }. V- g  X: Y$ ~* z9 }* |6 I7 j0 }

    2 {( A! e" O1 I; E' p! {9 p$ k3 F' }                //Method - 1  N=100000 247s  
    7 _6 Q: ^1 N: T                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    7 t: y2 {8 I" R# C# Y6 H. j                                
    6 \5 W3 J+ P3 {4 a8 E4 o                //Method - 2  N=100000  237s
    8 U/ }) a! u1 Q4 \" m% f9 P$ p1 s1 R                /*
    3 h, ~8 G" {1 l/ U                for (int jj = 0; jj < N ; jj++)
    & \- p% J9 `) H  J- p; |                {, S* |$ F0 I/ O; F
                            fresult += vec1[jj] * vec2[jj];
    # X$ D* V& O6 b; [2 i3 I' }! |                }! i8 N5 b0 O0 ]6 m: |* j$ R
                    */
    ' y4 H5 ?2 D6 r6 b- G' j                                
    $ u6 b  m: n& O- S1 X# i) y5 f                //Method - 3  N=100000 204s  m9 W6 N. d8 [0 u' q
                    /*9 y) H0 K, u: o3 C# w7 [
                    for (int jj = 0; jj < N; jj++)
    2 x- `5 y: ~; M1 ^) H, o( i                {
    ( U7 O! b3 U/ S1 f; z& W8 T                        fresult += b1[jj] * b2[jj];4 I5 w. l& r- a2 o' X2 {1 U
                    }
    0 p1 p  h# d6 r( U3 l1 q6 g                */, C" Y' l6 g7 [) b1 R" Z$ k9 c+ {5 }* s
    " o' o$ L5 M; U! z, [
                    //Method - 4   202s
    0 G; [. N' c& Q/ G, U6 w( s1 _                /*3 y6 c2 t8 X4 u& k# [! @
                    for (int jj = 0; jj < N; jj++)
    9 d5 q0 [2 y; F0 B3 A                {' {& z1 {1 b1 t
                            . Q, e6 H0 F7 ?. `
                    }
    ( X) |/ [: {/ H4 W3 z                */
      D! y  v/ |: T6 Y+ V# }  V                //comment out all methods, N=100000  202s                  s" Y. ]% t1 |5 s' ~* p
            }
      @/ i- z  r, f! f
    # n; D/ _# x, X& k        delete []b1;
    $ O2 h5 W/ B* p) p        delete []b2;
    . S$ U( e; F" C! P. }  s. i
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?- H2 S- @& u* E

    ( N9 R, D8 X, V你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ) v$ W$ j; ]% X. ^8 Q" X% ~- _
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 1184 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    9 e6 k" ^2 {, g8 x9 A4 z瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?+ U/ j2 w! X/ `- @2 f

    $ x" Q4 a6 I) |你第二个试验里面的j在循环里面又重新定义 ...

    / a7 r/ B5 i# O5 j  [# k1 k: P7 g, |内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) c4 [: d" ^8 H% L; p' ^# {
    5 N& }) ?/ A+ H' s- Z8 J" b& b不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    7 M5 q2 p2 d9 u4 J% O3 Z3 P内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL  E! X" ?: U. c0 Y/ X

    8 h8 g" f: P$ H1 i  V- p不和它 ...

    - V, Z6 k* m( N0 ?7 E' W
      _& |# D  @( M# K不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。; Z' U- e5 {' J/ ^4 b
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54; H" z# @- ]! T- E& j
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): _' K) B; S0 `+ b- ]1 `6 R. Q2 H" n
    {
    5 O7 e* E# N4 w. K8 S# ^        comp temp, xtimesy;
    " x6 h$ e. m8 G
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ( b; y) O7 l! {- P内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?& ^: v6 [- t% B# K' \
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-20 10:02 , Processed in 0.069771 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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