设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?* T0 N3 e; `" k2 h1 @  l6 ~" v

    3 p; T# Y: {2 m自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。0 X6 B3 j6 q! `. b

    * b+ v% U% H* j' D! q: {- [& X速度优化问题真的很有意思啊。6 G# r  k, \- S3 k$ D
    ' D# N1 ?% t, g( G
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    * ?5 [, I. m3 K( N: Q! ?9 n, M& ^& Z' L) V把代码贴上来看看?
    # v% k) Y# U% ], c: n+ ^1 V% G2 L* i: A( r3 T' }. G
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 7 V+ C7 e) ?2 ^$ X3 w; J  X
    数值分析 发表于 2022-9-24 23:04& r' R. p: e2 S1 \+ \
    拉下来?拉多少?, F' Q% c% X6 [" s' C
    把代码贴上来看看?

    , X* K, K4 N9 V* @' C6 n
    9 X8 k. F  C0 ~. ?void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)( P6 s# o! K; P+ c: u
    {9 x) |6 R5 b. v* b$ b" c
            comp temp, xtimesy;8 \2 d$ j2 p2 D, k8 p
            xtimesy.re = 0;
    $ u# y" r3 r' o+ a        xtimesy.im = 0;3 S0 V3 I: T8 K. c
            int j0 = lenB - 1;/ ], J& W3 |0 v6 l$ I* T3 ?
            int    i, j, i1, reali;
    . A# k! y9 z3 T; r7 M) O& P* p        if (lenA % 2 == 1)/ Y/ ?: k4 E4 n( m7 S; m  r
                    reali = lenA + 1;. \8 h  p' l+ i; D
            else) g, a  q4 L8 g  P7 e" _, X
                    reali = lenA;# f$ _/ u  A4 e- M- K0 p
            reali /= 2;* |+ i& g7 N% i+ S: K
    4 O4 M' d- a3 D/ [1 R
            int nconv = reali + lenB;0 |( a' u& r' f. ?/ T( Y
            //#pragma omp parallel for' O6 I% s- h) [
            for (i = reali; i < nconv; i++)
    5 M8 G. i2 I4 A3 B        {
      x9 X! P& A3 K+ I4 {: c# y                temp.re = 0;
    . \1 d" {3 ?' U& C                temp.im = 0;( Q+ P  O9 S8 d' j. [- G4 U/ Z
                    i1 = i;
    & [0 T9 M. u) Q, I( H# a% j  U4 e                for (j = j0; j >= 0; j--)
    . ?: y8 W( `" L                {8 I' l7 y' c& y" S5 `
                            /* floating date operation */
    8 b, H$ g. U$ r! Q% G3 g5 \* y                }

    5 q" X- E, e/ k7 R, j0 _9 a  d        }
    : H$ D  X: ^: @1 @+ C}
    3 u, |# t% T$ E% h2 |* O/ I
    9 H- p9 T+ N5 }/ F  K; w3 \# bxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样( Y( J: }, Y0 h8 [; `% H
    # a% U2 \# c: o; _
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    % T- t: ~5 e2 ^1 r现在call xcorr 100次,耗时78s.- y0 I$ L& r2 N5 o
    " M# {, c# B3 p# j& c2 U
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.   N" G; [" |/ z1 v

    7 I- Z) ^& B0 k% v2 u# A
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:336 B9 J" e4 f( g
    Maybe Debug mode?
    - s6 M2 o6 Z  `3 c5 y  ^  T5 Q/ e' f

    ) D* }+ ]& r9 {- G不应该,看我上面的回复。1 x: `9 G" D& i4 s' e
    & V) Q; p# M' C/ W" [8 c
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    , u% M* `# W8 c
    雷达 发表于 2022-9-24 23:545 ^% K7 a! \  T9 U% W4 I
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 N9 [6 e- `' s, x+ F) }{  e, a! ~! \% Z  Q5 w' k
            comp temp, xtimesy;
    , T7 L5 m0 N. u7 s% y2 T

    5 Y' F# t: ~0 O2 b这个不是这么比的吧。。。
    4 H; H8 d2 l! z# k5 `  b& d" U
    5 F/ d0 M: ^; f9 a3 [8 I: `* B& s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。% E3 F9 {4 T: ?0 c% o
    , z. j( A6 t8 p, c4 }
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 8 g- z, W( D; E4 ^# _
    数值分析 发表于 2022-9-25 00:204 h- J( Y0 z! ^( e) r3 t3 U
    这个不是这么比的吧。。。
    ) A5 m" C/ x' P* F4 p  i5 p0 t" j1 x
    , z) l8 Z# K( ?, J' T7 j" l" Q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    5 O5 `3 C/ E' x9 @
    7 Q$ @0 M. ^' L( ~: l" @+ q
    有道理。
    ! t" y6 Y) R9 R/ R4 l; I; a所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。' P2 S$ H! u! b. H1 P" d! G
    / U% g. E) x. ]0 V0 }
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:468 v* }; V6 M6 ~; Q6 p7 k
    有道理。
    ( r. R' C2 D9 ^4 o所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ! r" m. `" I2 [. d9 B* [5 E( D你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多- u$ y) B. h2 s7 @9 T
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:208 c# B9 P; }) z- T) z3 u
    这个不是这么比的吧。。。& x  ~+ g- e, b4 `- O

    4 ]( N4 Q- f0 y7 P& c您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    & N/ U% w# P; K! d$ k  F& r, y; O& j0 G3 p$ s
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    4 b: h( q7 R5 B1 A* }" N7 Q$ v
    沉宝 发表于 2022-9-25 01:48
    ! @! h- [3 O. O4 U; g5 _, U* o; ^现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    ! F; |$ ]% y- U# \4 n

    - n: A" G1 f7 E/ h是的,兄台说的对。, `6 k+ i# Q  Q2 u3 b: M
    . E; l  U) G" W/ \# u: O  _
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。  F1 Y. D) p7 P! y) t, k4 C4 }

    6 V% F9 X# P% V雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。, M8 w, I" V  Y# L/ S
    & ?8 o4 [, L9 @; E  U: h6 ]
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    0 Y9 `! v1 M: H5 b7 o7 p
    : Z2 ^. [* H! s2 P当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    * i. a% G9 K8 r* |: v% J% V5 _
    沉宝 发表于 2022-9-25 01:27
      ?9 ]# G: u7 m& C  P5 p你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      {: a  b5 b+ j3 |
    ' H/ l* X% t% |  _) Y6 {8 y8 L
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。* P/ k+ M; B+ w

    ' O  C' H! e0 q2 ]  _8 W6 O我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47. q3 v% d+ p- g4 g3 \* g+ M
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ; }! `$ |" L9 o0 \. S2 r
    时间差一倍的结果可以接受。5 `: g3 H# V+ w' ^' P
    9 _! @% H# {2 j# y# q* P9 {
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 1 l9 p& v6 F9 j6 L
    雷达 发表于 2022-9-25 04:47/ V6 i! r* u5 O
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % @6 m. A( W) D! p0 \  ~1 _8 L0 S' w4 z/ |
    ; f7 O, y; e5 f7 ^
    0 x+ K! X3 `$ g! K3 k+ o& G' D
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 . u7 V. Z+ Y& ?0 O3 S7 E1 k; a
    数值分析 发表于 2022-9-25 14:58% \$ b/ }! w" p, S+ {: _
    能不能把这个也贴上来,看看和上一个有什么不同?
    ; ]$ K5 E1 {. M* z# @1 V; J
    理了理思路,重新做了一个测试。1 _; I  e5 i9 R: k0 I9 q2 \& U5 e
    做了两个 vector 和 两个 float *, 都长 100000
    9 a) X, a# J/ T3 Y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. k7 X# @$ b) ]4 F" d
    % M  R# z% S, b6 M8 H9 P5 Y7 ?7 Y
    内循环试了4种方法,
    1 E" M& D6 R# g; `" s1. 直接调用 vector inner_product 247s
    $ j* {- u) Z" {0 x2. vector 循环点乘累加 237s0 q& o1 l& @0 l5 g0 j, {: [8 E
    3. float * 循环点乘累加 204s
    2 f3 T7 N8 O# |& J- H+ N4. 空循环 100000 次 202s) P% \: P! Z" {- w! q$ j' N
    # p- @, j) L* W; Z
    不做内循环 200s
      t5 r, G4 w5 k* ~# G( t, D, }+ n
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 D8 c+ A' a4 b$ q! g, t- v
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    / G* c1 A. n% |( ^! r& E5 i
    - ?8 \+ D3 G; e2 w+ v6 w6 V. ]  [+ k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    0 {& i9 w0 z3 r& ?/ q9 d7 l7 P5 l5 J
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    * x: l6 j* d5 P. {+ i
    4 G! R' n' O7 T- ~) \, R8 B
            std::vector < float > vec1(N);0 Z8 [8 k# d7 g; X7 ?" K
            std::vector < float > vec2(N);, V( o" {5 b0 |' |
            float* b1 = new float[N];
    ; X  E+ x2 L0 W        float* b2 = new float[N];
    * w/ u7 s8 O# j9 g
    - x: A; }: W9 X        for (int j = 0; j < 6000; j++)! ^, }: J2 u2 q" s
            {
    - S5 D! o' I- y/ t9 `: a                std::generate(vec1.begin(), vec1.end(), []() {
    5 _! t5 ?/ R! v9 S                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    3 r. M2 f+ x4 a1 v* J) e                        });( @, ]0 O+ ?9 O& D

    $ H: z0 v1 F* P% l/ c( Y9 e1 G, `                std::generate(vec2.begin(), vec2.end(), []() {
    + K, M. H5 v/ Q$ {  ?! j                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: f/ \( T1 p4 I% _/ ~6 d8 Y
                            });, p2 p+ [9 t+ F. M2 n+ G$ @
    : c/ w# h" l; B% i4 @% |
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    % a: P4 F) u! V" b2 ^+ G" y                {% ~" K) n- ^7 ^, O- K6 l6 f
                            b1[jj] = vec1[jj];3 A$ _7 v! w8 ]# ]4 E7 o+ _
                    }
    % `4 C, \+ M5 Y5 z( I) ^% s  Y& ~. z
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    $ l9 H% F" a) t) |" g2 g/ G                {
    1 i# c8 Z2 k4 G* p                        b2[jj] = vec2[jj];
    + [# N# D5 ]& H2 Z. N8 O' ?" y# ?3 I& a                }
    / m1 J6 H; a0 ?! j0 \* T0 J& h3 v2 s( i. r  M! J
                    //Method - 1  N=100000 247s  - r3 W5 w: h; L; j( s3 j
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; [; P, _: y( E
                                    
      Q6 [. |. H+ Z+ H6 I2 y+ D                //Method - 2  N=100000  237s
    7 Y9 y9 }6 l6 V; j1 x: k                /*
    # k  Z" [) o4 m0 P( z8 J5 z( a                for (int jj = 0; jj < N ; jj++)
    9 A8 J4 J# A! `6 z1 m                {5 A3 s" R2 A3 |. B% j/ |% {) a) Y
                            fresult += vec1[jj] * vec2[jj];  ]1 H5 K7 ^/ u/ x2 G: n
                    }
    : H; ]8 @; [- T3 L' c4 S3 J                */. w9 f) B2 @+ [/ f9 l
                                    
    1 ]0 x- |, w8 ?8 Z( V                //Method - 3  N=100000 204s4 B" M- m, n9 b. x8 W* e
                    /*# F+ P7 e$ |5 E( Z
                    for (int jj = 0; jj < N; jj++); L0 h, h! Q& c
                    {; v# I4 t9 @3 l! M
                            fresult += b1[jj] * b2[jj];' S  |2 A4 W0 Q% x% d' [
                    }% I6 i5 \4 Z- n6 \$ @# `! z. `4 [
                    */( K2 A- A& x. [" Y1 [3 s0 x+ R" r) Z4 K
    6 R, F% k+ D( x8 u! b
                    //Method - 4   202s' r# D; M+ J& z. q( n
                    /*- x/ W9 N7 K! a0 M1 V
                    for (int jj = 0; jj < N; jj++)% I6 Q$ B9 H" n! @, G$ d
                    {) G8 Z, E( g) \
                            
    # C$ o9 @* I  B5 q/ L                }
    $ f. F3 ^% a0 Q; S                */" O4 [/ u  [+ r# G; U
                    //comment out all methods, N=100000  202s               
    ' b- Z+ `8 w) T* R7 `/ B3 M/ m! L8 X+ T        }2 J( R  U9 m/ n
    ; [6 _- C. h3 F
            delete []b1;
    5 Q$ T+ i% d4 F( ^        delete []b2;

    0 q0 K+ P0 h& ^: z  M- L& c' C" {! L
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?0 O7 V. G! S/ f4 d1 G* [7 T

    + z) `8 U2 \" S: M你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?$ w- ^( [; H' ?0 j& M
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:152 {2 D2 T; D, x6 u
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    6 o  W+ x) @7 q& Y7 `
      T) T# c: W) n5 \) ?8 ~你第二个试验里面的j在循环里面又重新定义 ...
    # A7 ]! e! ^, v
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 H- H+ a' b7 o% h  n& h
    # i3 ~/ E, ]1 W3 }* U
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16* Y# {: ~& D' s4 U' d) E4 k) ^
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL0 z4 I3 Q) }8 k3 W0 m& G
    ' q) ]2 `+ B  g
    不和它 ...

    : O5 t  W" e- {& l, k
      F6 s4 m8 Y) A! G. i& V不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    6 y# H! G# R0 \后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    9 ?# C/ P! C( @6 Svoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)9 w  J' X1 `: z5 _7 R& {
    {% C7 s3 D4 J0 e# A9 s
            comp temp, xtimesy;

    % l+ J& x* ~4 p  b  z  c  ?这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。7 i3 \: v. Z: [, K5 d5 w7 c% Q
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?' a/ L* o  Z8 a& ~
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-8-22 01:55 , Processed in 0.046837 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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