设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?8 _7 w5 e; u- t/ v( G: h# Q

    2 ^: f: j" M& Y7 |自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    . W/ V6 ?) |8 B8 e  m1 j
    , Z& f4 X( R5 c' g速度优化问题真的很有意思啊。
    # ^- d  _$ U$ e0 g/ S, A! r4 E  k1 u
    ( Y: k" r; B2 C0 a+ k% v欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?* D% L* I8 v: f0 h
    把代码贴上来看看?
    3 Y$ H1 g' u; r( Q- b0 C0 g; f
    " @! V& f, a/ P3 T7 n! x( B难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 2022-9-24 23:15:41 | 只看该作者
    会不会代码本身的缺陷阻止了自动优化?另外,硬件配置和开发环境可能也有关系。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-22 03:36
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    . M" M3 h9 B( J; w* e
    数值分析 发表于 2022-9-24 23:04
    : u' _6 r6 |1 }8 g9 N& G拉下来?拉多少?! H" n  i* _( j# H' H9 b5 e
    把代码贴上来看看?

    - w8 L/ r. x$ U  c: V& c9 u8 }: y" t; R1 i7 g
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ( {- p. E; ^% ~{3 T! G" y& C7 T8 @. r2 V
            comp temp, xtimesy;
    8 ~+ X$ o5 N2 Y8 K  {        xtimesy.re = 0;* k; @" t+ P8 Y2 W1 L6 M8 t! F, l
            xtimesy.im = 0;
    3 _! P; I& s' Q3 ^9 ~0 Y1 }6 p" D        int j0 = lenB - 1;
    - h: C( T& |8 L7 i        int    i, j, i1, reali;
    / a: V. ]; v' q/ T# b        if (lenA % 2 == 1)8 `: L( r4 @9 S: V9 h0 E. i
                    reali = lenA + 1;9 r3 K) C* q/ ?4 @- c5 R
            else: f, F, `  y& a& P
                    reali = lenA;( x1 B& \! @* g  {' h
            reali /= 2;
    " E# A$ d6 N+ C% E: e# b
    + }& T( @& Q9 L! p+ m        int nconv = reali + lenB;; g. V+ {8 a5 k  b: f3 k9 a( r
            //#pragma omp parallel for6 L  o; T% M4 {+ A9 S* Q  e
            for (i = reali; i < nconv; i++)
    - h; n8 V6 ^. `  L        {# J& B# C4 y- B/ U
                    temp.re = 0;
    + V6 J3 V5 h# \/ B5 |. ]  U                temp.im = 0;
    6 d% {8 B( N  ^- R* u+ r' i6 i                i1 = i;/ F, r# {* c) o$ T! j  G5 E; _9 V
                    for (j = j0; j >= 0; j--). _. r3 }! O' b) d
                    {
    $ w- r9 t% B5 Z' `                        /* floating date operation */
    7 o/ b! u  J. {8 s                }

    ; ?" l6 f! l3 \1 f0 Q        }
    4 }: `5 @6 @( J  ]" n5 [}0 U  o* z1 C% _% B+ Y% c7 u
    % r. S% q  O* G& b1 m
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样$ O. D* ~; N% Z
    / e( e! A, R% b. R
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。% _+ M' E/ i' Q5 N; Q# L. w
    现在call xcorr 100次,耗时78s.
    / R1 C2 L( d  ?% ~, I" d8 j; O$ c1 Q6 }. [- G1 |
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 0 Q; o: \3 t* Z9 l% X: T6 j

    + h" }, I6 }5 |/ F3 L
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    / g1 g* w% F! j+ yMaybe Debug mode?

      p! Z( ~. k- g* ^3 J6 y8 D5 [$ d* G+ |" `8 T. |; }; U
    不应该,看我上面的回复。4 r, T! a, J# p7 r! {
    / G* N. D* c; O
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 9 w& d' B5 s- ~1 ^) m$ w: w, Y
    雷达 发表于 2022-9-24 23:541 O; L& i$ q; G% I
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ m1 `" _' q2 S$ j" w1 o5 S{
    / `- H9 r- Z2 K        comp temp, xtimesy;

    . _& Z/ _: c6 M+ \) z5 h2 P1 B7 U1 i5 n; q3 u; G4 _
    这个不是这么比的吧。。。
    , S5 T/ d' p$ o- g
    - \7 {3 J' i$ X) Z: x您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' R8 U& q  X  Q* |/ m% U2 }0 s0 M, y9 }# t6 Z( O# |4 D% t
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    * u* d$ Z$ Q  b# b+ S
    数值分析 发表于 2022-9-25 00:20. L( Y5 m% o$ u, J
    这个不是这么比的吧。。。
    : u, \& M+ i" [9 h: g( x4 j/ E( t/ C7 s# C1 ~
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    , g. B3 R3 S! w( y) |/ }2 S! m; K" d5 h. i9 n: A$ y2 k$ B
    有道理。
    2 c: U2 g7 q+ G所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    * a. j, z4 J6 ^3 d# L! x0 u8 B9 I  J* S1 J6 a5 [
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46, `- p3 J" `. E# F
    有道理。- ]5 s8 Q+ ?0 b1 @2 J8 r
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    * k& w* Y% s. H' O  k2 W
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    * c/ L1 w( a& o: h) u6 IWhy 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. p! H* {  D+ O+ R  }这个不是这么比的吧。。。
    " T7 Q. q# Q" h5 \3 O, W
    ) }# I' U" @" J& m( p您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    6 M1 S! d, O. A$ U. P, b7 ^) T' F/ K, O1 X  [! Y. {3 y2 p  ]
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 : s1 }/ c, ]. B% C- Y
    沉宝 发表于 2022-9-25 01:48
      \/ Y# s1 l2 F现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ! Q& k9 Z& r& v8 |* L8 F. b1 m2 V5 E# ~) Y' ], _$ G
    是的,兄台说的对。
    " t, N! M) d: W$ e: h" r( v. l# [
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。8 p( x2 C# }. w- _
    / ]; \2 U, A& f/ N0 O3 }* V# C
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    # ~5 O# a# e0 \2 s5 Z" I: W# O& X
    9 g+ K) A( b# @/ Y比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。. m5 y3 {5 y6 R. x4 |: @

    0 q, J1 d8 a5 F, e/ C6 I当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    9 |8 {) ~/ G8 t2 S$ `5 F. _
    沉宝 发表于 2022-9-25 01:27
    & `7 [5 P! I9 E% ^你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 a" b! D8 c7 n, X7 T+ b# O* t
    , ]' T' {& k0 R4 W7 @又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    3 H0 O( ^6 Q" D* p% Y/ F2 K: |4 P. D8 [3 r5 m2 [  Z
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:471 C2 w' ], D, u% k, l$ g
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    : M( M: T3 }0 d/ Z8 i! i/ C8 j, N
    时间差一倍的结果可以接受。" x5 N% G5 m6 H9 w$ w
    3 O8 L# P5 a: d4 T0 I2 ~% s3 @
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    $ K4 m+ [# a2 `$ V8 W2 i
    雷达 发表于 2022-9-25 04:47
    0 i  O( \7 N( A. H又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 i6 J  x) _0 Z) |3 g

    ( {) @, [3 U# i& v1 f4 ^& u  m7 [0 s' J5 Y" O+ v

    / X' z# D( s9 F8 X8 C! A能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    : P  O' g; o0 d, V2 N% T' S
    数值分析 发表于 2022-9-25 14:581 k/ I6 s3 w1 K% i% G
    能不能把这个也贴上来,看看和上一个有什么不同?
    7 w$ Q7 {7 A( O$ h5 a
    理了理思路,重新做了一个测试。/ |$ q) r9 R0 f( B3 o" {8 B  J
    做了两个 vector 和 两个 float *, 都长 100000. X$ X+ H4 K# Q& u6 o) a6 h9 F
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    $ a# m( d- }3 w; b
    & |$ R$ H# C7 x! w) h: m" j! m4 K内循环试了4种方法,+ {4 r* J: C; D
    1. 直接调用 vector inner_product 247s
    2 d$ @" v! ]5 y' H9 Q' ~2. vector 循环点乘累加 237s- n0 O8 A% U/ T4 d2 k) A5 ~
    3. float * 循环点乘累加 204s( m; w) M& r5 H, H2 Z
    4. 空循环 100000 次 202s
    ) w* O0 A7 z' P4 Z& w! U. H" `: @4 E: e1 {+ x5 O+ X$ p
    不做内循环 200s" d1 @1 |! O5 g; t0 W

    6 q, V. z# v" l你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 d5 r) w! N( j0 A' l/ k
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! C+ e% r$ V1 t
    ! w. j3 E5 q4 u3 {! ^8 M" `
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    1 s( @" [$ A; {) L8 |/ _3 s' s; s' l
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    7 \/ e: D5 d; n& X1 s( e' U: p5 ]8 `6 o: Y
            std::vector < float > vec1(N);
    ( P" e4 m) x: O) w/ s        std::vector < float > vec2(N);
    " E( X. }! @% w. i6 s' M        float* b1 = new float[N];+ _# s6 K5 O* i& [
            float* b2 = new float[N];
    " o# O1 B% k9 Q* T
    0 J6 l' R  R2 w. B, i6 V        for (int j = 0; j < 6000; j++)
    ( C1 Z. X; j( `        {
    / t/ m3 W2 c; S! d. d1 k8 N                std::generate(vec1.begin(), vec1.end(), []() {
    % H$ A: B* b+ n; P                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 T. }: o4 [' y# L( D4 T
                            });
    9 s+ }/ {* i9 Q' G0 z7 ?) v/ V$ q! ?) w$ ?# |) J8 u
                    std::generate(vec2.begin(), vec2.end(), []() {
    6 f' o+ h, _' q+ e                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    9 O  G9 w8 I  b3 g                        });
    + `8 u) J6 a* x7 _/ J) i9 Z2 T# w4 i* C' j$ W% Y% R
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ) [% I* b! t# @                {
    1 j1 _4 ?. F& r2 c: t. T                        b1[jj] = vec1[jj];
    + s0 A# o/ g9 ~) m' c                }- j( A) N/ l9 F4 r" p! ^' X
    : B" |5 _- M) N! u# E
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    3 L% b, f+ e4 L                {
    * H. ]# L$ N! s0 j                        b2[jj] = vec2[jj];
    * I2 P- a' n/ W( L7 e4 l: E: b. c                }
    # t6 J  p; f- a- Y  j
    ! b8 \3 y  n$ U5 B; l9 `8 i                //Method - 1  N=100000 247s  ' @4 W" n/ e3 X5 E4 v
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    ; {9 S% t$ f. j+ i6 V* _3 `                                
    3 Z2 a' m% t* f* G. o                //Method - 2  N=100000  237s
    # S4 d+ }% l* _                /*1 _, K7 g: d1 N3 \1 V
                    for (int jj = 0; jj < N ; jj++)3 g& F: a9 Z8 o6 l/ y' |- y, P
                    {
    5 ^) x) ~7 ]( D! N8 e3 s  A4 P                        fresult += vec1[jj] * vec2[jj];' }4 |. C) {( w1 V; Q" u
                    }! R( H5 F9 U% ^' t  m
                    */+ e. l+ N; N: P
                                    
    1 }7 t$ g9 m1 p1 h& f                //Method - 3  N=100000 204s. P. }) j3 Y$ Z) m7 U, ~% Y
                    /*
    & z& m+ t* G- _! O: P, X) [                for (int jj = 0; jj < N; jj++)& z+ a2 K! f  H5 z  y( N0 Z
                    {
    3 [# ]. @/ F9 z0 u% z, `: N                        fresult += b1[jj] * b2[jj];
    - k6 Y. t! {! H" O                }
    - Y3 x8 L6 x8 o5 ^, I; h2 t( ~7 W                */
    8 A9 X& u8 q1 U4 I
    1 z8 m  ]% i! i3 j' e' N7 u                //Method - 4   202s
    , n/ R$ g0 ~8 W% m                /*# ^0 o! j6 B) e. H8 s
                    for (int jj = 0; jj < N; jj++)
    * c+ o% W/ X5 x6 A. d1 i5 t, {" p                {" {* L& z, x$ X. g+ n
                            
    ! B. B# o+ m; Y+ ?* o; o                }) d, L( o. y% [; o2 f) \7 K
                    *// a$ q- e& L& r+ w
                    //comment out all methods, N=100000  202s                6 q* C6 H4 I8 I- M
            }
    " ?4 k0 U0 i$ \1 l5 p& y6 ^. f
    / r0 N( i# E! k5 ?! q; f$ f+ a% t8 T        delete []b1;- o9 d: v$ q+ z8 ^6 L
            delete []b2;
    ! N3 X! ^/ {! K, j3 Q0 S5 z! ~
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?( ~9 o. E: K, o

    3 [& m2 R0 @) ?你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?5 G% H. w* X$ a9 l( {: a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    4 C. j1 _6 @/ p. Q: G9 d瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! W: l/ U( ~" s5 p0 I0 o5 Y7 Q
    5 L# ]( T' a) x3 T+ u你第二个试验里面的j在循环里面又重新定义 ...

    3 E& E; I0 h$ V0 g8 B9 H内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL( e* Y  B# C& z5 i: d( m7 w
    ; S1 T$ n# R8 E
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    9 Y. c7 z! [5 j3 Q" I内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) D) B) l6 E2 q5 O3 h$ ]6 K% T6 n8 m6 |2 u2 v5 N4 x
    不和它 ...
    5 ?" c# @0 d; B/ i) N1 |

    7 w, c0 k/ H6 w5 x不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    0 z/ `' z; a/ O& {6 H! {7 v后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    $ P5 o$ n  j' u0 P" V2 qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    4 ?8 C/ \* W) R  A{
    # P% u- ^2 \; v0 L8 h, x1 \        comp temp, xtimesy;
    9 A% h2 ]) N7 z* W- p) p
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
      r' [1 P9 G% z0 d内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?5 w0 P& A+ L" a7 K' d+ h8 c3 c
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-6-15 18:45 , Processed in 0.043654 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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