设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?8 k) F* y7 g% X2 P0 K) n2 ]1 @

    % g( k& ^8 O/ |& d( a1 X自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。$ z1 ~2 t7 X8 c- h. K5 \

    / _% g) U1 p9 Q速度优化问题真的很有意思啊。
      \5 a- E: m+ E4 @& w# ?% i& ^# x
    $ ^! _* h6 \$ z, `& {# q欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?$ K0 T" O2 `1 Q, Q7 [1 o" |
    把代码贴上来看看?. w+ ~1 g7 `. m/ U* G8 C& _* U8 N* H0 f
    . p% |' q2 N, y
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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- ]2 r4 s& S1 a4 L. e4 d6 b
    数值分析 发表于 2022-9-24 23:04/ }: _  x, K# p- t  r
    拉下来?拉多少?, K3 ^: z$ ]* m
    把代码贴上来看看?
    3 y( V9 a) X1 Q1 e/ g
    # Q4 F5 }8 U+ `* O, R0 z! u3 n% k1 s$ W
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)# [$ U; i6 X: B: T5 d3 U5 E
    {
    # F& S1 A, y. r3 A* Y8 Z        comp temp, xtimesy;
    . h4 h1 I- H% W& M+ V1 M        xtimesy.re = 0;
    7 I& y" O' i- q: \4 o, u1 e4 S/ m# g; {        xtimesy.im = 0;
    5 `! g( F6 J% p" Q! M6 k2 I7 R        int j0 = lenB - 1;
    7 z& d  D4 E% q2 B9 {( I0 C$ B/ U+ ^        int    i, j, i1, reali;
    1 K* F1 x' U  d) n( c$ ^        if (lenA % 2 == 1)$ [  n; q$ B1 d
                    reali = lenA + 1;
    4 N0 x# S& ~. r2 c3 {8 Q        else( N9 i/ {! s. d5 B
                    reali = lenA;
    . z" U3 ^7 P  K1 k" E& y        reali /= 2;
    1 q+ m; B! G' }  b& r; v6 f# ~$ |- V4 p6 Z$ T$ |9 F7 Y
            int nconv = reali + lenB;
    # {7 o: \1 J( m0 i4 F% e- l        //#pragma omp parallel for
    - u9 p% d. m' _) N+ g4 f        for (i = reali; i < nconv; i++)
      K  }  }$ l7 h5 M, H3 t1 Z        {
    2 @* s* z  V' X/ `! K2 q7 ^                temp.re = 0;
    6 z5 W) v0 ~: Z+ R6 G: ]0 O                temp.im = 0;
    , z1 B* h* z: M# ^  E, w                i1 = i;9 {9 `6 Z: V  [
                    for (j = j0; j >= 0; j--)' T8 h# V  k4 C, _8 I
                    {
    ; ]: S' h5 U3 c- d, M- t7 _, X                        /* floating date operation */# T- {6 J7 }. a' H3 s& A
                    }

    9 o5 ]& z- j9 e$ {  q1 N        }
    . [8 \* d7 v" Q6 {2 [2 n/ D4 G4 d' B}1 p. C! d  J8 B: }: T  a

    - {2 T$ w3 l6 g+ L) _xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    ' b. t: G' p( P+ h
    . D8 X( U- M) ~" o: f红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    % @, E& a/ T/ P8 M+ }$ v现在call xcorr 100次,耗时78s.6 C5 Z3 L& C* Q: v" y% {

    2 n4 s# n+ z, r$ {如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    4 ]/ W" F* J+ ?" X, I/ r5 e; X) m' \" N9 n6 F/ ]+ W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33/ U8 m; p' n3 ?* @/ Q
    Maybe Debug mode?

    & y9 @) T3 y% L* _! C0 x+ ?# i/ j( K5 v  T" J& Y2 Y  F
    不应该,看我上面的回复。; l/ ]9 c: v7 d9 R
    % |" t) _/ h: w* X
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ; ]3 v) `1 T  Y8 z  {0 ~! k5 h
    雷达 发表于 2022-9-24 23:54
    / [0 }2 N! O7 l' M7 ?4 cvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    + Q, _2 ^9 ]1 u{- u5 W2 E) o4 [+ A& ~# ]3 w
            comp temp, xtimesy;

    ) |' D4 [  R4 `/ S: Q- J) u+ X' a# k# g" e) d6 C6 q
    这个不是这么比的吧。。。
    , B9 R5 @7 Q$ @9 g/ n: u  N. N/ R2 ]" L( o" @
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。/ F& r! F" a6 o$ Y$ E; T
    ; A9 V, r4 q4 q! d" a
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ) }9 F! j  N* y1 X; o+ g
    数值分析 发表于 2022-9-25 00:205 [0 }# W, P. l0 M' W
    这个不是这么比的吧。。。
    & f: H& D2 p$ Q( B0 n$ H9 V, K
    0 q' k* ^% M7 ^0 Y您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : K- ?: d  I9 E# S
    7 u. y! N$ Z; f6 w- c! j
    有道理。" I# m/ p1 |4 J
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    # Q& e: N, r" J4 {! Q2 M/ V
    8 ^# C, ]4 G9 D, \' Q& m% O6 |我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:469 Q  q/ B3 a9 k% l7 p
    有道理。
    5 S+ f/ |# j  P" L" S$ O+ C所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    3 N: ?2 W# Q' N& d8 ~5 O你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多- k6 @8 r+ ?9 j9 i; @
    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
    ' u7 k- p$ h, Q. h9 |这个不是这么比的吧。。。
    8 A/ G0 T  J$ `! O+ [5 Y$ \
    0 L7 A$ w: q5 Y# U您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    % _1 |" y/ a+ H1 B, j/ Y+ ?. @
    9 K! O. Q+ B0 \# m
    现在的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 编辑
    * b% c" s7 l7 g
    沉宝 发表于 2022-9-25 01:48
    ' j+ O. W- J1 s* n$ n2 Y; t' Z现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    / K9 A6 h2 F) Y" b
    % T8 V! q  _, |+ o. o0 w$ {- l是的,兄台说的对。  \' v9 P. S" n4 c$ i

    % t, W/ X0 {) e2 @" M0 Z其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。% J5 |5 [- T/ S( r& b

    ! {4 h' o/ {$ Y雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。" }5 {" v1 ~  }2 W$ X

    - L! X9 R5 Z8 T5 m$ [3 |! N比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。8 ]6 w/ _3 `" k6 m) I9 H8 c2 u6 u

    6 J' d/ N3 w. {5 \) s7 |当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ; q7 {: E6 _: \) V
    沉宝 发表于 2022-9-25 01:27
    # g& n: K9 y" U$ T  e你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      E# `/ L8 j  l
    ) J" Y1 G% i0 u
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    5 ~; q, f# S  W% b0 c! X$ J5 Z" U3 y: R& W9 y
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    - w0 ^, K$ Q% Q5 ]- k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    & T- x' l5 |$ x" `. c& |时间差一倍的结果可以接受。* K) d1 H  ]. E2 @' n0 e
    : I- F  A1 V- y) f. F3 }
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    , @4 E/ f% i- Q
    雷达 发表于 2022-9-25 04:47
    % h+ T2 y4 m; R# g又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( Z, Y, X- d2 ^1 n' D

    ' Z% ?$ ]/ g" B8 g7 x& j" d( ?" ?6 E: A3 ~2 d% Y% q
    : d1 [: v# x5 d* ~) M
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    9 C9 T5 ?& t2 U4 V2 x7 h
    数值分析 发表于 2022-9-25 14:58
      n4 V! v; {; s% [3 H; ^5 ]% ^能不能把这个也贴上来,看看和上一个有什么不同?

    / ]& p( U# a& x# @1 i: ]/ Q6 p( G理了理思路,重新做了一个测试。$ ~/ @3 T( r+ x# f
    做了两个 vector 和 两个 float *, 都长 100000) g% R( _( D6 [4 R- w2 P/ Q0 H4 V# a
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 }: ~1 ~9 S8 ?7 B, R, y; W$ x5 T
    5 W. ?0 u0 G8 f  [) x0 t
    内循环试了4种方法,8 _& I; \0 S' w4 S, X9 [* `$ z
    1. 直接调用 vector inner_product 247s
    * H0 w! Z. d4 A: q' P4 F# ?2. vector 循环点乘累加 237s' @" Q4 O5 k. o  U  e4 Y' d
    3. float * 循环点乘累加 204s
    % u6 k7 K; u  J4. 空循环 100000 次 202s
    + v5 b! L9 Y: w0 M9 p' i1 l6 {6 g3 z5 u
    不做内循环 200s' S0 s) i: i: H1 O+ p

    ! M" `# s: O0 @8 K你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    / D1 \6 e6 s0 a: X4 M9 [另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    ( W! M) G) m! _
    0 [& H) ~5 L, K+ }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% T: K4 f" a( z
    4 @, F: ?; R! E  s% B' U+ r
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ( C- j3 F1 L4 `3 ?" Q4 p" l- @' E& C( W9 |! [) n1 p) {! p* y  g
            std::vector < float > vec1(N);* b  N* X% d3 a/ r
            std::vector < float > vec2(N);' W( K* ]0 b: a3 `. A0 `3 w
            float* b1 = new float[N];
    ! D6 ^4 V3 k9 f        float* b2 = new float[N];; N" v4 p& X3 R% T8 D
    4 c+ a6 h9 p& D. h) h, D
            for (int j = 0; j < 6000; j++)1 s! n0 f( y* r) s: h( l$ Z
            {
    - V4 i* p- S  A. ^* a7 {9 j1 |                std::generate(vec1.begin(), vec1.end(), []() {
    * R4 p" |+ f7 A* [3 ]3 w& V                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ! p0 Z! S( ^: F2 A. ~" i! a5 V                        });4 V; Z7 D( K$ i$ y
      Q8 \  W( L1 h' [5 M- Y& m
                    std::generate(vec2.begin(), vec2.end(), []() {
    4 ^; c" x# |! C! z, c% Y                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 |4 I, C6 U+ h* c1 M
                            });
    " M7 t& @! w; `5 s2 G8 t/ N$ ^1 \7 Z  o  s7 Q8 U5 ?- _) G
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    / s# G) {9 z& ^9 R2 S  w  O                {- ~- a. v# y/ ?- p
                            b1[jj] = vec1[jj];
    " ]# k- @: Z7 T6 M                }, v6 a, ^; d& `& O# S( S
    6 o' r% A0 d  n6 d
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    ; o; S+ x8 P9 f$ R; w                {
      S& H+ i( `0 f+ c                        b2[jj] = vec2[jj];
    , `8 z5 A0 M4 \. a                }
    , w  @$ X. s9 L. ]( o  q5 J* j. |6 X$ f
                    //Method - 1  N=100000 247s  
      \# S3 L. W7 m3 r* o                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 v0 H/ ~5 U$ E: f8 A/ s' |, e
                                    
    ; }1 ]- i* k  i: P5 `# }0 s                //Method - 2  N=100000  237s3 G" n4 m2 F7 y6 a0 T
                    /*
    2 @- [5 Q. f% W% f4 [0 ^                for (int jj = 0; jj < N ; jj++); ~' m) @% ~$ n* I
                    {$ s& L0 q  k# Z1 `  }" g8 T
                            fresult += vec1[jj] * vec2[jj];
    8 Q5 T7 d* _/ i) [- \                }
    . F* o( ^1 d# Y. N) g4 w& k- P1 E$ y                */. j$ u. ^$ c7 G+ p" r+ ]
                                    3 J7 m- I& G( B" P9 W
                    //Method - 3  N=100000 204s
    - f* U: g; v9 x1 K2 m                /*2 r' G) a( \! ~
                    for (int jj = 0; jj < N; jj++)
    , Y+ E9 d  `+ r                {
    2 }! R( o/ o8 S+ ~                        fresult += b1[jj] * b2[jj];) h& q  }( M/ R7 _7 {
                    }
    - s6 b, {# ], Q* c7 ~" Y  @                */) a" a. l+ P, X9 ^6 Y
    5 S& W8 n% Z1 E
                    //Method - 4   202s2 f( V+ ~& H! E* O# K
                    /*
    ; E% W% i& j" {) S8 p( T                for (int jj = 0; jj < N; jj++)4 D* J3 f- b# u" B; q$ F! r" D
                    {
    $ j- i/ g) V! t+ N                        5 U8 |, h; q) C3 S5 U1 `, B' F( P
                    }" G% F: C4 u* t
                    */
    : e) m. i5 g0 K! k# N( e, Y                //comment out all methods, N=100000  202s                3 @" ?4 b0 L; L/ r% t$ ~
            }
    2 G% k- R3 M& V- U7 g1 N( [" d. ]# k5 R$ t, P( ?
            delete []b1;
    4 `2 Z2 Q4 T5 T  `        delete []b2;
    9 C9 k' [' V, }8 J9 Y
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?: h3 w; O) g- d  `
    $ y5 }9 P" `* D' r
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 l- \) @; i/ g$ q. D4 f
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15) Q) F. L$ A7 W3 E: o  |
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?  ?# K* [% E2 G6 E
    ' _# P2 i! n7 a
    你第二个试验里面的j在循环里面又重新定义 ...
      |+ a6 F. e/ E" n% d( h
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 }, K: t  |/ n
    : S: X0 C8 Z) F& R! h
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:161 c" C: W) W" q% z: o3 A2 t
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL% i3 r" O7 w# J

    ; Q, W3 x% r  R1 J  p不和它 ...

    % G0 U' j2 k# i& X( ]5 K! `) T  F( r5 Q3 X$ z
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    $ `$ ]1 z! }9 D后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ! U2 H1 l: |' E: E0 ?* U- uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    . B1 k8 J5 ]4 g{9 v2 o# Q8 {& f3 d6 Z
            comp temp, xtimesy;
    * `) C/ \* }' h
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    9 |0 s* i; u8 z  ?内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    4 v% X* D$ a9 h' ?' hVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-23 05:10 , Processed in 0.080346 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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