设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?7 x! y) W* ]2 V1 Y
    1 s( J1 [/ \" C6 Y+ Q9 t% s
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
      K. e5 H/ i  ~% E/ G3 P! r: p  _  ]8 K' ~
    速度优化问题真的很有意思啊。4 I8 x/ E4 V5 m

    $ i  ^, {1 x( B: K欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ) [; h) N( p& u9 n. q: |把代码贴上来看看?. Y- z+ z1 c/ Z, ]' N  H  }! _

    8 D* p3 E3 G4 c3 w难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 9 p* W3 N4 j, K, |- s
    数值分析 发表于 2022-9-24 23:04
    / Z5 k4 B( {  }3 \拉下来?拉多少?0 i2 V! O: @! n& d0 Q8 F
    把代码贴上来看看?

    6 j6 N$ Z& V7 S3 \; V' T$ V& x/ p5 K
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) f5 ^/ _" h1 s& j  I' G
    {7 P4 o! Z. E+ }% L7 r
            comp temp, xtimesy;& _; `( ^* N+ E0 u1 o' X
            xtimesy.re = 0;
    : A/ N4 B) t1 A6 J+ P        xtimesy.im = 0;( b, P# w. U3 t$ \, J$ h. j
            int j0 = lenB - 1;; p6 h2 ?" p1 p* ]0 ?
            int    i, j, i1, reali;
      S- _7 t& M0 C; e, b9 k- v, E        if (lenA % 2 == 1)* Y/ M: i4 O( T  n
                    reali = lenA + 1;
    6 P$ _+ G# |/ S( s        else" F+ e4 Y' E1 d
                    reali = lenA;
    ! Q9 T, [& C: N        reali /= 2;
    4 c) E' g, a/ M8 G+ V2 c9 X1 \' }
    / [$ `$ l( M& E* e        int nconv = reali + lenB;7 C+ h- R: }) N# `+ u+ n
            //#pragma omp parallel for
    * o: j  k/ g% O        for (i = reali; i < nconv; i++)5 |) a/ \8 j. {) ?/ u$ R
            {
    ( g( Y9 u$ Y; Y" i, |5 y, G                temp.re = 0;9 C; e5 b! |' c, |- P+ w% f4 {, O
                    temp.im = 0;
    1 P7 u- Q: o+ O                i1 = i;) N  t/ Z& X& T# R# J) {4 {! u+ [- P1 y
                    for (j = j0; j >= 0; j--)
    , q6 }* \+ E5 F% Q                {
    ; @9 b: d0 P$ f+ e% [                        /* floating date operation */, k: t) l, |2 H) {- T
                    }

    $ G8 u& Z: O4 v/ U& ]/ X/ W4 n  a        }' N( a7 x% q% s, {7 p- d
    }
    ; K* ~0 u7 E, Q8 D7 v2 Z- e. R
    7 H; w, ^7 y! B" u0 c2 xxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样! g( W0 `, ~! S3 k( z- c: X
    & o2 L$ w6 S2 H) |5 A
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    4 d* s( y; o- A$ v$ t现在call xcorr 100次,耗时78s.% y3 S5 p# C! y

    ' g, A* k2 x0 A( b" c! q如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. / h  G0 v: j6 {) Z
    # P  _  v! l% Y  H6 D
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    " d2 t# z6 L$ M; b7 B( uMaybe Debug mode?

    ( b$ w9 {: T, s0 B& c% ]# l
    9 q1 Z- c1 ^% D不应该,看我上面的回复。
    $ x6 q4 l) E" N, }8 O8 J& w
    : V+ f, }1 e5 b我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    . V6 @( p* ?* C; c
    雷达 发表于 2022-9-24 23:54
    % A2 B# a8 ^; P3 rvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
      P6 m3 x& k' `; d! I{
    $ d4 I8 O  T  j( A" h4 e$ t        comp temp, xtimesy;

    $ p. t$ V  F" S# Q: q  i- `, `3 e! W
    这个不是这么比的吧。。。
    5 E6 `& S3 Z6 \* X6 p4 E
    0 ^6 N, ?2 b5 g7 j  q, G, P您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。: a$ e3 {, W; K  A7 d7 J4 Q

    : D7 N( u- V+ l6 H! f8 I8 F8 w而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 1 [8 W6 N% ]1 N  V. y# J
    数值分析 发表于 2022-9-25 00:20
    $ m1 k4 v1 [5 C/ _2 N- F- y这个不是这么比的吧。。。% U! i/ y4 Z% q. B

    & t/ ]; _7 h( M' B2 J8 A3 i您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    4 Z9 d* W( l# p# u/ x

    3 V* Z7 ]8 s8 |6 ]有道理。7 g- M6 H, ^1 S) g# e: R8 `* D
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    4 U- |2 x- _9 x. q' s6 ]; w3 L! W' @6 l# Q( d6 b
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46. T9 R/ i- C, G4 d* e+ `/ H
    有道理。
    0 ]0 [; l2 U: z& u& \所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    $ x- y" u" _8 A) c# _你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    9 e) D% o) o  j; n  WWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20) A: B0 M2 h+ ~( P7 q
    这个不是这么比的吧。。。
    ( N& ^3 h0 o1 N. A% L# W# |5 J( T1 {
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    $ p. `# O+ ^; E+ n3 T* P  j

    3 E% H1 x+ X! _  ]现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 2 F1 s4 Q* W+ Y
    沉宝 发表于 2022-9-25 01:48) v. _( e" P) e+ ^4 i) d) j
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    + z0 j: x5 M5 H  S% S
    9 N- X' x5 `+ m3 e* ?是的,兄台说的对。9 q7 b0 p& p- {$ \" H! _; \
    + E4 p4 i3 T' ~! B7 ]9 ?( O) O
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ' o2 e- |, `) l/ f' A! s# [) s: ]; G$ ?! t
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。% k1 l+ q5 |) }3 M" e: L, L+ f; m2 P

    8 B. }, [  t6 g7 n2 n比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。7 x3 Q  }  f3 m9 m# q% I

    0 ]) [3 ?7 V  Y& G9 a/ i$ |当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 0 ^% g" B1 h# M5 T7 P; [
    沉宝 发表于 2022-9-25 01:27
    2 b1 d! e0 v# `* U  e7 A* [3 H3 s你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    8 T# I& a8 Z! {+ G, L2 A: ]
    ' [4 {7 b  T3 r. u4 w3 k
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    # h4 V& l6 G; r2 P% E8 s( D8 M7 q: q& |3 ~$ r# P& F" x
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:477 f6 y. B( K- {" {( N, `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( [5 L7 k, [6 d/ S6 e: _
    时间差一倍的结果可以接受。
    # b( Z1 x( ]- ^( \' [' B
    & v* t* [) |' r. r* D* c) T9 c你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-26 03:23
  • 签到天数: 1954 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 6 t( ?- \2 F$ [1 e- v' _$ o
    雷达 发表于 2022-9-25 04:47
    : I) J1 {# R4 m6 V0 D" X又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    & h6 {9 N' ~0 P6 u3 i6 \; V+ k0 i. b* E
    - C7 ^: {& S9 v" l
    6 M' B. D! N8 V( Z, y9 K
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * j6 z+ p5 N& i3 a3 A; S6 {5 _
    数值分析 发表于 2022-9-25 14:589 o0 f+ h' B+ D4 \% x6 g$ n1 Y
    能不能把这个也贴上来,看看和上一个有什么不同?

    5 u: T; j+ D3 |理了理思路,重新做了一个测试。
    * J) z' d+ {) ^* K做了两个 vector 和 两个 float *, 都长 100000- E4 K: ~% x9 v! U6 Y
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    * p4 [+ ^7 f. c, L9 w4 I0 P) b$ ~9 H$ n0 ^( M6 r2 d
    内循环试了4种方法,
    : Q# f" m, ~9 `6 \1. 直接调用 vector inner_product 247s
    # p, Q) n/ c) \' ^5 f2. vector 循环点乘累加 237s
    + m$ F/ Z0 z; E; l( f$ [3. float * 循环点乘累加 204s* u# {$ Q# `- Q! P3 u4 r+ y
    4. 空循环 100000 次 202s& o) |% L, H; m; ]% R5 N
    9 R- c, h3 |# m
    不做内循环 200s
    / N- `: m- q9 _8 E$ M( V% c9 E! q. _% G, h
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。( ~0 [$ ]4 i6 O4 e
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。  s4 O/ ?, j, Y2 F) }
    : W$ }# E' m! Q9 J! @8 t
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& }( J3 T" y4 I/ ^+ g3 E" U. c
    6 O! h0 ]( j( _7 H( @1 _
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    % P, l: |( ~9 V( |% z, J
    % n8 f3 A2 ^  p0 I2 [% k5 l5 k3 x' E
            std::vector < float > vec1(N);
    6 B$ g8 ]4 R. A' Y' w8 p        std::vector < float > vec2(N);
    - \4 h. Z2 x- M* o9 Q: l$ {% g1 @        float* b1 = new float[N];
      z  L7 {& w9 ^  j. k! y        float* b2 = new float[N];
    7 q+ B: L  W( P4 Y% {  C7 T9 l8 ~' y! I' R1 |
            for (int j = 0; j < 6000; j++)
    ; J0 v) F# o3 e  T# y4 D) Q& F# H4 o        {: m2 p3 @% I& k! ^# g' n
                    std::generate(vec1.begin(), vec1.end(), []() {
    # Y- ?  S/ b! j& ~" G                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 }( [; n3 Y9 Y  A8 m
                            });. {0 U9 Q3 g5 a& [
    4 @. C8 Z8 ^( ]2 ?7 o& i; C9 v2 c
                    std::generate(vec2.begin(), vec2.end(), []() {
    $ _. O% ^% W. S! O! s                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    % p& }& Q5 _. u" \, d! l4 ?                        });* X) E1 m# C5 ^% [* }5 @( {

    / L4 G% M. H, k( y- F                for (size_t jj = 0; jj < vec1.size(); jj++)$ P) A! v# Z3 r, c% t
                    {
    . G0 w/ g4 i8 k4 k0 a" L                        b1[jj] = vec1[jj];4 ^; g+ O1 }' `6 i$ u9 W$ d3 w
                    }
    3 a% X) U6 w) ^5 ?8 I1 ?* {% W. B1 C6 t
                    for (size_t jj = 0; jj < vec2.size(); jj++)4 q3 l! J6 T( F
                    {  N2 G: z5 D% a% K
                            b2[jj] = vec2[jj];
    2 u# P( C4 C2 F& v                }
    . [, w2 h3 m$ X5 c; p% i3 N$ ]- m/ m1 L$ b
                    //Method - 1  N=100000 247s  
    5 v+ @1 l' \& H% ?. T$ }6 y4 o# N                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 x+ N1 \5 |0 U' D" l1 K& ]1 {7 a! X
                                    
    2 x8 m/ K& t" s+ k5 J9 E$ [                //Method - 2  N=100000  237s6 M0 d  B0 C' a. P7 h- O! e8 i4 K
                    /*
    - l% T4 m0 S; Y                for (int jj = 0; jj < N ; jj++)
    ! J: ]: Z* y; l9 J, l                {* S3 u" Z5 R5 @( U
                            fresult += vec1[jj] * vec2[jj];+ o  I; \! o/ Q& V4 v3 ?
                    }
    " w  H4 y4 Q# M2 P                */: z& `# l  l; J, X
                                    
    9 X+ e8 Q0 ?/ N                //Method - 3  N=100000 204s$ P* |/ ~+ s9 S4 G% u
                    /** D; |5 ]& y2 E, q
                    for (int jj = 0; jj < N; jj++)
    5 [" `: T( {/ y: |                {
    , X6 \9 f% c2 S) r+ Y, G" N- V                        fresult += b1[jj] * b2[jj];
    / \/ D0 F, U; ^* z2 o9 O4 u8 t                }
    ' y+ Y- H/ p4 _5 o% F                */: m/ V. n0 d6 u5 e0 G, J& c

    + h0 L5 m" K7 s% \6 a0 k& n- L8 M                //Method - 4   202s
    $ Y7 m' D9 a, ?$ H/ I$ h' A                /*9 E1 V" U8 A, m9 q5 j1 a9 j' ?+ Q
                    for (int jj = 0; jj < N; jj++)
    ) T0 G- c: a3 p+ j' ?                {
    " D; s; q7 u' U3 A0 a                        
    - K: W$ E; d9 M; y5 U                }
      H( ?% O* ^  }                */
    - z; \( S7 `+ @4 k2 O                //comment out all methods, N=100000  202s               
    & }. }6 ?. d; f. ]2 |- K. p. ~  o        }
    4 I5 P# y# m7 i; x. t3 O% v( L/ f0 e; d5 P8 \7 E* e9 X
            delete []b1;8 e+ A( W- G; Z* v6 [* A: t; e
            delete []b2;

    * f; j/ m& \8 n  ]
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?& [- D2 q, y; I. y
    * m/ j, e; d7 W+ A7 _5 {
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?% z. J4 m  \- n& g7 X) @- O: L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    0 R# D8 v% X7 p5 R& P* E- L瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?; |* p  G8 }* _7 g: E9 ~
    ; }7 G9 ~! M: ^5 l7 o
    你第二个试验里面的j在循环里面又重新定义 ...
    : N& O. L+ a6 |5 P
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) n1 m. k( X% N  O9 _7 J% P
    5 G7 S( X7 ~( q7 `0 t不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16, A/ e) v" j: r
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 m8 @! N0 L$ K6 u! q1 T  ?0 S, b' C% O5 q
    不和它 ...
    ; a7 E. t" b% k8 F/ v

    1 X7 `# E  A' h- K; g不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。$ J: M! G' I- B5 z1 I: e
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54( S3 X+ d2 O( O2 C
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ F; T4 X% K* u5 C: D- Z1 g
    {
    4 y: T5 G5 O, l; [9 s, d        comp temp, xtimesy;
    2 S# U9 E$ U& S. v4 N) D8 N2 ~. T/ g2 v
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    9 J' ~. U. ^" J' v内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?$ ^- ~- B. j; {, D$ z
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-5 15:46 , Processed in 0.069772 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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