设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?9 i+ Q0 e0 s" P* x8 @

    ( [% P) y% M' {, K9 H+ d4 ^+ D  H5 j自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。" d+ u. }5 g9 z

      [. a- b) V* n! ^( f速度优化问题真的很有意思啊。
    0 S( p0 t( b: q' |4 T0 O( g
    4 ^% C4 Z8 I& I6 W欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    # a  X: f7 @2 ]1 l  e把代码贴上来看看?; G* S; Y$ O" v+ o8 F* |
    4 k* P0 t- X% \+ f7 C
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    0 Y3 @0 F2 b; S
    数值分析 发表于 2022-9-24 23:04
    1 {+ u0 B' f. ]2 q+ v1 C拉下来?拉多少?8 n: e! F4 _1 H. C- X
    把代码贴上来看看?

    # S4 z% x4 @% Y" M
    + d1 V3 \1 c2 N; u  {1 q/ C6 fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    8 K# N$ r% l7 j/ U2 V{9 e8 ?! _8 n9 n9 F
            comp temp, xtimesy;
    9 z& g( u8 v, j, V2 {: t8 P# l: k        xtimesy.re = 0;
    6 D  ~7 Y) k: ^& i% O        xtimesy.im = 0;
    ) _: c: s1 _" n9 G% P9 i7 R        int j0 = lenB - 1;
    ) K; j" @; q3 o% M0 ]        int    i, j, i1, reali;  q/ ]& e+ d  H
            if (lenA % 2 == 1)
    2 E' k, u* P2 x" s# Y6 q+ I" u7 n                reali = lenA + 1;! z5 d" f; e; T0 w5 d6 d
            else3 ^2 Y4 C- ]' c- }8 K
                    reali = lenA;
    ) @. s2 \8 {! n& E+ R4 x  g        reali /= 2;
      M6 I  z9 B3 B  q
    + D% y9 O  }: Q  S        int nconv = reali + lenB;
    * V2 u' w- {* c. X        //#pragma omp parallel for4 {: Q# B1 h: n. z( u! p9 O5 P. ]
            for (i = reali; i < nconv; i++)1 Q/ F, _6 i# R& s  P. a
            {* x2 e* j; v3 c% z# R7 S
                    temp.re = 0;5 X* J5 q' A$ F% D% {! e
                    temp.im = 0;- o$ Q9 g9 U% G6 F
                    i1 = i;
    : r6 P1 v# E4 O                for (j = j0; j >= 0; j--)4 [/ {. G5 B7 k; H; R* W( ]+ O" l/ r
                    {$ |- H* \3 O& H  K! Y8 C
                            /* floating date operation */
      J" S# [# I, `1 j/ E" t. Q  o                }

    ( X$ m2 t8 t' ]) @        }
    ; c. G, e+ v0 }5 M0 U}8 h! `, Z0 Q# U1 f: h- \
    5 i* K, J- s- ]! ?) A; D- J
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样) y6 q$ {. n3 J$ O

    3 F3 c) [& {' z6 q$ m; C; O  B! J红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。. F! x# g+ b% r# ^" D' t
    现在call xcorr 100次,耗时78s.
    8 m7 D3 Z3 A( W" I, V( Q; O1 ?5 e
    8 c6 [; T% P( J' Q3 T如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. , W9 _2 e& y! m2 Q+ l* B
    5 R/ d* X' J6 u7 M4 f6 }4 [
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    : L- I& k! b6 P5 CMaybe Debug mode?
    ; X7 D" q; g) s0 ?

    7 C3 r5 r9 {2 [( F5 {不应该,看我上面的回复。
      L1 E' C# ^7 \; `: L6 H
    7 J( J; L1 O- s4 ^% d8 S9 Z( J& P我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 . G1 F/ z2 q6 r9 V3 h
    雷达 发表于 2022-9-24 23:54
    - K) |& o) G: N* Z( Lvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ( }1 q' M2 U+ [9 u9 F{
    4 a+ f. }- o5 ]        comp temp, xtimesy;
    : X. e/ W2 }4 B8 O8 U3 W

    7 J4 Z; A, f9 N" V这个不是这么比的吧。。。& v- k8 p) }* A% v5 Y+ \' T1 |, J1 O

    6 Z. @( I, {3 L0 k; Y: v. s您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。7 A+ ?0 V/ }+ d1 }5 s
      f& j: B" C# 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 编辑
    " g4 Z% C# c" `, c/ `7 @
    数值分析 发表于 2022-9-25 00:20
    3 x2 S; M% [6 P/ g" {) e# g* D这个不是这么比的吧。。。  y3 |6 c6 K8 K7 c, x5 M/ M
    + {% ]# T6 h- F3 M( z+ r5 k
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    " y8 J0 m+ i  F2 p4 f- x( G( I* H* h; b  R; _1 h* o6 I
    有道理。' g  M6 g! [( b% i8 ~
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    6 {9 n+ B5 l5 e3 a( A; k
    , z; U7 F) m; }$ s5 d我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    6 H9 X: s& M, T  p& Z- D/ g' S有道理。! E! n$ T" F2 z$ b( ]6 t
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    9 Q: Z4 m- l% A0 H0 d
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多+ C- ~' e, M0 u3 ~
    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
    0 ]0 G2 R/ M+ c: E; i4 x/ \这个不是这么比的吧。。。
    1 R# p6 j8 Z; Y- H. S. W8 ^
    * ?7 @- U& c# B( a2 B9 a您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    % q3 t( r6 a# M8 X9 p7 I2 }
    ; X0 E2 P+ B( [7 I- ]* [* P+ p7 ]
    现在的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 编辑
    % I. I% E% I& T
    沉宝 发表于 2022-9-25 01:481 u# C5 O7 p+ Q( B) a
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    ) q4 u+ p1 a8 R- l: K" i# s' _4 K+ L  K% ]* G: C' a
    是的,兄台说的对。% ~, _  ~: S% A% ~. l  Y5 }2 x

    % J) t% [( f  D其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。: ]8 k: ]# c5 f

    . K5 O8 U  y; }4 S雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。- a" R( E1 `, f0 n" c* w
    # l8 m: C$ v  Y' j
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    % ?- _3 m6 M: I8 r0 J. h3 U4 w1 X! |
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑   Y, V& [& ~/ j# p1 ]
    沉宝 发表于 2022-9-25 01:27$ l7 A, r$ g9 G$ r' N6 L
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ' M  C' x/ W. ~: h% A. a6 E
    1 o+ z; p: b+ W8 e; m  H% L1 N5 B; P又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    4 B' H+ Z" \1 j/ ~5 o2 x  A+ E+ H* ]
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47" n8 s$ E4 T4 ?+ g$ }+ c/ L3 Q
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    / @8 r0 r+ g+ X2 {1 e时间差一倍的结果可以接受。
    5 ~! ]1 s- }3 A3 I" L) h5 A3 S* a2 Q1 ]' b
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    - v" V" _5 k6 g7 \# c% W/ U' d
    雷达 发表于 2022-9-25 04:47
    8 A- e* T5 L9 _" o0 K6 ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    ( {4 K) Y; d" B3 v1 t

    & C6 H( G7 _; \/ @% w9 [
    ) [8 B, D7 j" f8 p- W8 }  `& x5 J! S& m
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    2 q, U2 ^$ a# o
    数值分析 发表于 2022-9-25 14:58
      F4 _+ j. M! ^5 c能不能把这个也贴上来,看看和上一个有什么不同?

    7 N8 Z8 f# B6 w8 j理了理思路,重新做了一个测试。
    2 s+ f9 w2 B" d( v  V做了两个 vector 和 两个 float *, 都长 100000
    ; ~3 h$ ^, @' T外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) Y- H& J% H+ N# F/ b
    $ l9 h% l6 K( i+ Q
    内循环试了4种方法,5 q: \2 @" D7 H% N: F) c) E
    1. 直接调用 vector inner_product 247s
    & n2 u0 c& I5 I, I  w/ ~% v$ ~2. vector 循环点乘累加 237s
    2 e2 L- A7 }7 F8 J! u4 `2 Z$ {3. float * 循环点乘累加 204s
    1 {# X! n! `: [# j' J4 ^4. 空循环 100000 次 202s
    ' c! J+ e- Q$ R3 w- I1 B% |
    9 z8 e2 J0 c# b& o! e不做内循环 200s8 {1 M' A$ j1 |# K

    : ^: n4 \, x4 X你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ B: E8 D/ ]! Z" p, z) ]% R
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* P, N, b% X7 _
    5 T* e9 A5 R: z- D, I6 ?2 x. b* v
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    1 ~: B" v/ U2 z- s
    ( E% o. v! m% L+ u(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)- U; x; O' ^% v+ v1 K; I' s. m
    0 q) W( g% u2 }. s4 V1 I  ]6 J
            std::vector < float > vec1(N);% B: ]' k) P+ n: l: s6 S
            std::vector < float > vec2(N);
    ; g4 _( b! `8 \, p; x1 o, E        float* b1 = new float[N];
    ! A( E- v$ B* s$ k: z        float* b2 = new float[N];
    0 ?* d5 V; t5 t( v2 H4 d* z3 c. ?6 B. Y* o: j
            for (int j = 0; j < 6000; j++)
    5 O6 v4 a! b% @: O2 V        {
    9 j9 ?3 b# s& B9 {/ M) u. J                std::generate(vec1.begin(), vec1.end(), []() {
    3 f' S1 Y$ A# k                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;9 q" W& D9 G8 t
                            });6 z) Q7 ^& a$ x( ?, ?7 L. c: I1 q
    $ p! A3 q1 M( j( P/ w$ q
                    std::generate(vec2.begin(), vec2.end(), []() {
    / K- I! n% K: L                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ! d: ^% V7 G: _7 @2 ?                        });/ j! I+ I4 o! F) g/ Q2 s
    , p: ~. S& C1 s' X
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    $ q$ X; b. _4 E                {
    7 W: N$ _. W& R                        b1[jj] = vec1[jj];2 D" T8 R& Z" I2 y
                    }. i6 M0 _- ?) R, x% y! c) v
    4 l- ?" }! ^& W0 ]$ S4 y! i
                    for (size_t jj = 0; jj < vec2.size(); jj++)
      Q9 e! y0 a2 ~                {# a0 N' e  r6 H5 t1 C" x
                            b2[jj] = vec2[jj];. q8 `* Q* r, g4 M- p2 I- P
                    }( ]; {' K& Y2 l; m: Y3 B
    ; {9 |! g+ F# z; ?0 ]/ k+ _. l
                    //Method - 1  N=100000 247s  0 t0 `3 Z9 F: u5 M- t
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, X. N$ ^$ W3 f2 E: t
                                    1 p' G# x  c0 W: y0 x: F% x* J
                    //Method - 2  N=100000  237s" e: b) `( V3 C# W; W, `8 ~, r5 g
                    /*
    5 }7 R0 n. _' z. A+ b' X' a! u7 T                for (int jj = 0; jj < N ; jj++)) `, k8 F+ y. Y& Q1 K$ f
                    {, V" D; {' m6 S$ |+ y; ?
                            fresult += vec1[jj] * vec2[jj];: q9 S( ~( b3 |+ i7 D8 w+ W' s
                    }5 z5 e9 o# F; y0 j) E! k
                    */7 _4 f/ V& c  f( Q8 h5 W
                                    ) {2 ~# U# N( U
                    //Method - 3  N=100000 204s0 L6 q2 ]! ~6 S4 O$ m
                    /*
    7 T4 u) ^) ]- B! y                for (int jj = 0; jj < N; jj++)8 q, F+ G4 K1 A
                    {
    0 N# U  Y: l# F0 S                        fresult += b1[jj] * b2[jj];
    , e0 t$ x9 n9 R' l2 B" q4 n) N' Q                }& w" o1 B( C3 [0 A$ H7 B
                    */' {2 I; K5 r1 A% X8 `; k% X# d' n/ u

    6 l3 F3 v' @, w4 R% g8 S. {                //Method - 4   202s) w' B: L1 t& I+ D1 `  z
                    /*# W  ?) D7 t; b" v* k% Z
                    for (int jj = 0; jj < N; jj++)" S- |+ ^; B: |+ k) c2 e' l- f
                    {# Q+ O0 @7 U. l4 p5 Q
                            6 K2 L7 z& C1 t6 N% J* H( ?' ^2 I
                    }
    4 R' e+ A7 m: H1 k; m$ a( A                */
    ' a) B5 C  Q, \% d- S                //comment out all methods, N=100000  202s                  }) q, E& \: D  ~: a& E
            }: k1 W9 k' [7 p) r4 N
    ! w( ]7 E' y8 F4 R, x5 c2 O0 \
            delete []b1;
    ) J" T! _6 m5 B) o/ L7 q4 i0 r& ?        delete []b2;

    % T% P3 C0 s9 V
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?7 Y) l( l; N* L# v' W" T' ~

    " K, w, @* O! q* z. N1 g你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?6 }$ V9 r* e' j+ `7 I2 Z+ r0 u
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    $ l" i2 t; M0 n瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ) b1 o; [, o$ P; v. K/ E9 k3 _* \. O& Y2 p7 U2 G# P  F
    你第二个试验里面的j在循环里面又重新定义 ...

    # h2 M. n  ^1 ?: B9 b内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    & [+ n$ u) |1 {  x# N3 L) ^& ?/ M1 e" Y! c9 k; S
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:164 L2 }+ @- S7 s
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    2 G2 m5 M; ?0 L$ }" ~& r& j4 G3 q. Q/ F# @* I$ H
    不和它 ...

    8 D8 d! s2 ^% d4 k3 m2 D5 v+ q3 c
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    " C* c* ]0 x1 _& ~后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    5 B( |) [- A1 d9 Y& ?% o* r' H7 B/ uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)6 l, A, X; z" G; S8 }
    {. [, d9 F. Y# ^/ W' S1 P4 I+ Z
            comp temp, xtimesy;
    2 E/ `* |5 r" X: \8 D: v5 t, b
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* o. n9 z% @9 M
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?1 P; @0 w1 A6 Q3 Y
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-13 19:46 , Processed in 0.071101 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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