设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?* [) L( P0 @& t% D. O: e' j8 a& i

    # R( g! ^1 j8 |  X2 s自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    0 P! N# ~. ]; s5 h& Z* i2 V. k; K# l! I
    速度优化问题真的很有意思啊。
    ; y9 X  |8 Y- U  ~" U7 m% O! t$ j7 W# r9 Y* |1 Y
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1908 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?7 _" _* Q, A5 ]
    把代码贴上来看看?
    & O9 S9 `' }6 U; Q! b- ], g+ W7 w. k1 M- O6 P
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 00:52
  • 签到天数: 123 天

    [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 m$ E* `% k7 V0 Y- l
    数值分析 发表于 2022-9-24 23:046 E* H' H' N6 u
    拉下来?拉多少?4 |5 i: Q# w" }, `+ `" `
    把代码贴上来看看?
    1 X9 |# g' q5 Q3 V* E# S

    : m+ a; g' E* b: uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    2 q# V& {" L2 Y" `{
    / Y8 Q: R! d* j, b        comp temp, xtimesy;6 h6 l8 c1 s2 n. R- P. m4 ^' _
            xtimesy.re = 0;
    " G& u0 W1 x( v$ K" V4 p        xtimesy.im = 0;
    / ?5 G9 w/ A1 F5 u& N        int j0 = lenB - 1;; ?, q5 P+ U4 O  }$ [7 J2 I
            int    i, j, i1, reali;5 e: @) d$ m2 i: a( ^0 z$ ~. M0 h4 N% r
            if (lenA % 2 == 1)& E! `5 r- }$ m. B5 P
                    reali = lenA + 1;' F. t9 w3 C' z0 @
            else
    - d. Z: `9 G6 U, f, K* t" |$ T                reali = lenA;) t3 Z2 `9 C- R$ G- d: K
            reali /= 2;/ Q( c; ?) q/ j) a/ M% C) C2 |" E8 Q

    6 B! A% B2 U, Z, M        int nconv = reali + lenB;
    2 v2 c( m! n: w        //#pragma omp parallel for: |5 i! U/ b, Q% y9 o2 N
            for (i = reali; i < nconv; i++)
    0 q5 V3 O, U3 K# I        {+ ^- p/ n6 Y! k3 H. h  K+ m
                    temp.re = 0;8 \! O! V$ L9 y2 o9 |5 {
                    temp.im = 0;; T, f% I$ x. e! d6 V
                    i1 = i;0 s+ g( n4 }: j3 A
                    for (j = j0; j >= 0; j--)2 l" `8 f- F5 e9 V
                    {
    ! t2 t6 }$ W9 B$ F4 i, o                        /* floating date operation */
    ; L: q5 y* W' K! M* h                }

    / f  t9 _2 k! k3 [0 i6 P        }( |4 ^7 @& n3 ~* W
    }
    , C( x' v: t( |! Z- L$ \
    ! u, n. `3 L1 l5 V" A! Q) o' W, Axcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    4 O. p- N7 r' Z- w
    0 ^* k9 i& g& L7 G红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。# k( w2 i* e, I, {$ }- {+ r: x
    现在call xcorr 100次,耗时78s.
    1 y' g, l; j; q, o- r! @' M" h, v2 J+ \' l
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    5 l3 q( G+ M2 E$ ~" H- N2 _# d9 y( G" D
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    % M1 i( X, f- x: D0 S# mMaybe Debug mode?
    ! l% V6 @+ |' S0 e
    1 i9 Z3 g+ T! z5 Q
    不应该,看我上面的回复。, P' b' H& p5 T- ]

    9 q7 W9 P* b, D2 G- w4 L$ y8 z我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1908 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    & t1 Y4 C* O& |1 s' H
    雷达 发表于 2022-9-24 23:54
    1 I, c- g' u4 x4 }: v/ @void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" S/ y- }: S) ^: h* E5 R( R
    {
    ) K2 N  F- B$ y  l3 U: D* A% b        comp temp, xtimesy;

    7 @1 Z" W$ W2 D) ]
    0 Y) v6 p  n! @. m1 E) p这个不是这么比的吧。。。
    ; s0 y( E: f: t& p
    9 e7 v' L$ O* y4 v; e" n; c您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    , e- n; o9 z+ \# h+ E9 s; U; w
    % P; s7 h$ _: J4 K: e9 [而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 ' E. e7 k2 ^  Y" m  t& l
    数值分析 发表于 2022-9-25 00:207 e4 V1 r/ @4 p! \5 d
    这个不是这么比的吧。。。
    1 J! Y( Y% U' H6 a7 k! i0 C; l4 a, p+ W. e
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    . E- C- b4 i- @$ f! \
    : D( G7 H7 Z3 B8 y" V- U5 j有道理。
    * O) f. T2 k5 G& m9 |所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    7 H0 n3 D2 ?0 `2 Q' i
    3 p# c+ ~1 `& k, P" b) \& V我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ' r$ V4 D0 q' Y5 `有道理。; ?$ B& g7 [9 j3 o" D
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    7 o9 w/ s1 h' b. _* B1 f( b
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多: S( h$ Q& {, W( n, ]5 \
    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
    ( ^/ L3 x4 g, L2 e7 {这个不是这么比的吧。。。( p8 o% C" a! V7 c1 Z- C. r
    2 z4 V4 P* Z" l; G! w
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ( z( d. I& `$ b: |1 w, f, P
    , D3 x% n' w7 y  T2 e, R; a2 l
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1908 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    4 P' n. ]; A" [- v
    沉宝 发表于 2022-9-25 01:48
    ) b* ?! Q  k; ]( Q' a0 K现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    3 }1 U' `+ U: l, n) [" V  M" ~5 e5 _) j7 Y  S
    是的,兄台说的对。
    ; y* P3 x& ?" o% O( ~" |
    - e0 s$ b& P5 z' L其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    7 h+ ?$ @: Z  `( L% M
    9 i/ k8 Y7 h+ P( p雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。6 f$ r. r( w& A3 ~4 t+ h9 x2 _5 B

    ' s' N8 t, b) Z比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    6 K) j1 C# t! H3 h& a
    6 w+ z) ]* n  k" G! l当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    3 O) a) f0 M" O4 @& i
    沉宝 发表于 2022-9-25 01:27
    9 W# l+ @! o) m/ ]  ?你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    , ?; ]3 k( Z$ v) q1 l' N
    * ?- _6 X3 U) G- \; i' G) w( f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    2 Z2 |; P- l, v# L0 F$ `8 w, j- r
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    7 c, S) U8 z- u2 f4 Q) s, A" d- M1 |又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    5 Y4 x5 b. H# a4 U5 A
    时间差一倍的结果可以接受。; W8 [- [$ D5 T3 w# A$ S/ j7 h
    0 A& |) M: v$ ]1 Z
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1908 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    4 |0 k1 ?% I% U7 e' r+ F) F7 Z
    雷达 发表于 2022-9-25 04:47; |1 e! b* T5 G8 k9 R
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    . C8 A' S: F- T1 @! C9 ~

    : ^3 _4 ]; T( |  G1 Z
    ) m$ S1 ~8 h( z: v  n+ @9 S  g4 n3 s9 U/ {% E+ K- t
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 0 L3 p3 S& b/ H, \  c) M9 d
    数值分析 发表于 2022-9-25 14:58
    ( T0 `( ^, H0 S2 O能不能把这个也贴上来,看看和上一个有什么不同?

    ) @) r6 m0 ^+ R' p理了理思路,重新做了一个测试。( `7 j& A9 B" R0 Y( o
    做了两个 vector 和 两个 float *, 都长 1000006 ]6 `& f' \" i7 Z& z  r/ j
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    & R) @/ q. q* z/ c7 X- s. s8 C( a& W
    1 b* Z- a: H" O8 G( v- a, t内循环试了4种方法,8 X. V' H. z1 ]- w+ q! u% {+ D1 e
    1. 直接调用 vector inner_product 247s
    : {) M4 C0 p( }1 a! H/ [" G2. vector 循环点乘累加 237s
    & I+ c4 n; {; i: k0 p# E8 Z7 ]* L3. float * 循环点乘累加 204s
    2 \- {5 H' y6 n' p4. 空循环 100000 次 202s% `# l% U4 h+ m4 |( @1 ]# K

    ' F* R1 d9 [3 s9 I不做内循环 200s
    % T# K7 q, I; c- \$ y' y8 h  e9 x8 u6 {" M) F
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    4 ~+ u, `$ S4 h/ {( s另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    5 R# R, O: P' K, v, j, X
    - r* [7 s( I: y2 p$ F, |% [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    5 ~: F  H! X7 }5 w! c
    $ k' ]: u8 ?  q. V(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    8 p; F$ E! W3 e8 a
    * B0 q' h) |8 ~0 t! K$ O7 d* N# k
            std::vector < float > vec1(N);
    % V$ u4 Y! S& n$ E2 o$ F, v" z        std::vector < float > vec2(N);
    % F1 x8 _) ^, M4 B        float* b1 = new float[N];
    ! V0 F4 x  B2 ?+ V5 G1 t* y        float* b2 = new float[N];
    9 y( S! u7 A8 f0 @3 i
    8 A  U2 ?3 X7 G        for (int j = 0; j < 6000; j++)- w5 H! G9 G9 {5 u+ P; t
            {9 [7 l) ^6 T. t: \
                    std::generate(vec1.begin(), vec1.end(), []() {
    - K' r3 u' w  n7 T                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ( T" {0 b5 w# m5 K; J                        });; P7 K7 q" i6 y' }2 s
    8 A- K$ }- \0 L4 o
                    std::generate(vec2.begin(), vec2.end(), []() {
    + H# y/ n6 E2 L" p0 K  A. c                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    0 {- `% R9 k7 i. [) o  z                        });
    , s* X. U5 h! _$ O: i
    2 _2 C5 V& e8 s                for (size_t jj = 0; jj < vec1.size(); jj++)
    1 H8 i0 e" P. y! T, P* k1 g( q                {
    , K* V. }% c. Q5 ?% q; J9 V                        b1[jj] = vec1[jj];
    % P- a4 Z3 G$ Y* p% P$ P9 T  q$ P3 Q                }
    , \5 x; l/ b, s
    0 H, {" }5 B4 O3 v4 b& F6 m7 L8 ~                for (size_t jj = 0; jj < vec2.size(); jj++)
    0 T3 {: z. R% S                {
    " Q0 X, o6 m- o0 D5 Y" S  }. Z9 }                        b2[jj] = vec2[jj];
    1 W$ v) L7 h7 O- J# Y                }% ]0 C6 O# {7 x0 f
    0 i) Z# ?0 l. ^3 A5 x5 e, j" `6 R- d
                    //Method - 1  N=100000 247s  : F) z' l# L; v' R) ]1 C% t8 V
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; s3 V' \; W* `) \  c. M
                                    
    # K6 T: c" z! K' q; h6 g! E                //Method - 2  N=100000  237s
    9 X* J; g6 Z4 m2 g; D% @                /*/ w4 K8 x. t6 c2 b
                    for (int jj = 0; jj < N ; jj++)
    . V+ m$ p8 z7 {$ x9 o9 N                {# S$ n+ z  ^2 i
                            fresult += vec1[jj] * vec2[jj];
    # {" B/ O+ T) ?& ~$ E  l# f                }
    # g, R, h' K- Q4 O- o; v; K                */( V) a- c& J1 U
                                    ! P  @" h9 p. V7 l' Q' V: L6 J
                    //Method - 3  N=100000 204s7 A: i6 ~0 O0 K2 Q! I
                    /*
    % B1 s7 Y+ \, n. N$ L                for (int jj = 0; jj < N; jj++)
    7 K2 N# d4 ~+ O7 S: J4 i1 x7 I                {6 {9 A8 r' v0 V  B- F! }
                            fresult += b1[jj] * b2[jj];" C+ W% |9 `7 C' |" a: q; U7 I* l6 h
                    }
    , e0 ~1 L% B( `$ }                */
    1 j% {' o  K7 z4 M
    4 J8 h8 c1 ?) F2 j- R9 ]  t' \                //Method - 4   202s
    # Q" _& l9 P! |# {' b0 F                /*
    7 B2 u6 x2 H. y- s( Z& J$ K                for (int jj = 0; jj < N; jj++)
    # a4 r/ W4 @: J! N0 N* i* j. B                {
    4 k9 p+ b: L& g7 \: \$ v3 V/ B                        + @* g; `0 Q5 o8 o' N
                    }/ s  _- v# C: @
                    */+ G4 [6 B- ^' g& {% k; B
                    //comment out all methods, N=100000  202s               
    9 \+ A& U; r' n/ R& x* a% V+ E        }( X% f* h1 e( L

    ! e1 j8 c8 w9 S, h        delete []b1;
    & V$ |4 u, H9 `: h        delete []b2;
    6 e7 X5 [/ u/ P+ s0 h3 |
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    $ ?( k7 Z% y3 Y8 B1 v
    & j+ p( r  y& C3 [- f. Y- [你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?& H6 Z2 A' r( l' s
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15- e6 T% H& l+ N3 ^4 o: C1 A
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    2 A* J: Q+ k% `- ^
    9 j+ D5 h" o& g& q你第二个试验里面的j在循环里面又重新定义 ...

    8 }# h3 ]$ e0 M: T内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL2 m4 D- G7 }: w% U+ T2 Q
    . \$ m* b/ ~: s$ |9 F4 m( i2 n
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    / \' ^' r: ~7 k$ p9 J* o内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 |7 y1 ]4 q6 H. D: ^- q" [4 b4 X2 o7 ^# p3 J
    不和它 ...

    5 j$ K) J4 y) P2 X4 z$ z) D0 F- [3 i  k
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    * I$ a. g9 Z5 g2 C6 |! b' W后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    2 I" D, v& o7 [/ @3 N; nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ; B6 L2 v- s' i- ?{
    ; r5 F5 j  E' L- H( x        comp temp, xtimesy;

    $ g1 D/ F' ~" J1 K; G/ ?这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    8 M+ F! Z  d2 M# z内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?- w0 q5 b# q8 M% |) i$ k) L
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-6-9 09:34 , Processed in 0.053476 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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