设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?& I# U% H) m! J  D
    1 D- m1 B! k2 I. Q# M  s" {
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。: A! h+ J  a' s; u- P7 ?
    - d2 M3 l$ ]- k( c
    速度优化问题真的很有意思啊。" T# a$ G" J' w6 J; r$ Z3 z
    " d0 a4 K8 X% K8 j( B
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?, X9 k" u2 U- I+ j3 T+ e# Z- v7 g
    把代码贴上来看看?# M* O; k, r& e: H4 A$ n2 ^

    # z; p: i5 O% k3 h难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 : J; I1 J2 ]: V+ m
    数值分析 发表于 2022-9-24 23:04
    $ H: X5 H5 [6 T- l8 D; B拉下来?拉多少?0 J9 s9 P' G+ f) o6 L
    把代码贴上来看看?
    + F0 x  F* F, a$ y7 G: T5 J

    2 s0 k- Q4 `9 k+ V# Fvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB); H( K- S5 o  G. {" w, x
    {: A! F# T2 v: r% `! s
            comp temp, xtimesy;
    ; K3 H3 C5 s9 p7 [        xtimesy.re = 0;* H2 ^6 i8 b& \$ z+ {9 _
            xtimesy.im = 0;* f7 k: C/ E7 S, K$ [
            int j0 = lenB - 1;
    : q. T  c1 M6 X1 c3 E0 C        int    i, j, i1, reali;
    6 j  `" x9 i5 g1 [; l$ T        if (lenA % 2 == 1)9 X! {/ K( V$ e0 t0 c
                    reali = lenA + 1;4 i3 M8 [/ {& T1 l
            else
    * t/ @( A& X  Q$ e                reali = lenA;& r( o! N7 C8 l
            reali /= 2;4 }" m3 k) o6 z1 S

    & M7 B, O9 m  c1 C' v# J, l' J        int nconv = reali + lenB;
    ' O9 I2 s8 g$ l6 ]% @) K        //#pragma omp parallel for: ]3 e- w) c$ f/ o
            for (i = reali; i < nconv; i++)2 w$ s4 Y0 g$ ?# e
            {5 T/ n; ?* y& a- u/ ]" L! `" O
                    temp.re = 0;& [& d( D8 ~& a0 ]4 D# m' |
                    temp.im = 0;
    + h9 c' N9 s- j/ z9 i: [( S; F6 c( R                i1 = i;& {& q3 q- B& {! c
                    for (j = j0; j >= 0; j--)
    7 V' o7 Y5 P5 M4 w1 ?4 }. d                {
    % b* `- j: q" G                        /* floating date operation */: ~, B# L( X0 y! ]
                    }

    * T" P- C0 R1 S  o) t. |0 Q5 M5 N        }
    9 ~9 A* G1 a% J3 F# o; d! g$ f}
    3 b$ R# c2 N$ C4 n' w; }, H5 }: C! \. f
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样0 D  ~! ]9 i# L' E5 n

    # F8 Z* W9 \2 j# G红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    5 y2 n, L' Q( ]# a! p* Y现在call xcorr 100次,耗时78s.
    . i6 A; `% ^4 G4 }" H' a% G% k1 b3 ]* ~( [, k* A
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    & w6 L& S7 _, c+ v' G  w
    7 f$ r* y, ^# i. F4 I8 G7 @1 F* W
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:337 O" U! F0 {/ k$ H* C7 F
    Maybe Debug mode?
    : t; m% D8 ~% H3 v4 E) l+ V

    ! A' v) ^' M4 H( x" j( u不应该,看我上面的回复。
    9 |; G' r* }- x8 y) }
    9 T8 i  S! ^7 E. @1 R我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 + ~* F' f- [" ]: d! C/ H
    雷达 发表于 2022-9-24 23:54
    9 ?" Z9 W/ {! l7 O$ xvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    $ e# ?: l) u4 [( A5 `0 Q" S{  Y4 w! `+ ?+ h
            comp temp, xtimesy;
    ' y* M) i6 W, ^1 @- }
    4 z% l1 _1 O9 y7 F+ g9 t$ h1 x* K  s
    这个不是这么比的吧。。。' ^5 w# t9 \& r+ B
    " ^3 ?$ l0 w* [, d3 f' Q: O
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ! I3 i# w* l. a6 |. K$ d- h; R% b% ~! m" m
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    % @& L; o( Y0 G) _& _4 x% U, S
    数值分析 发表于 2022-9-25 00:203 @0 F: e( Z) W# ^& R8 u2 Z/ d2 }7 N
    这个不是这么比的吧。。。
    % x7 e8 T" ~& g( J3 v
    ' \; z& f* N2 c* T3 ^# f" H您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    3 q* j9 p4 N* Q- O2 ^2 T

    : Z' A* y2 Q" p$ b有道理。
    5 a" p+ T6 e0 v9 V2 T所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。1 F# s7 a: g$ K5 `! }6 h- \( |
    : c& [: r" h( X( L) O
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46: U& R; i$ @( t) y) x) L3 R+ i0 ~) A
    有道理。0 P* ~1 i/ g9 B$ a8 g
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    " T' d* y9 m$ M  t2 q5 ?  x1 C3 Y: v
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多8 O; |1 }% Z4 @7 N# P
    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- _+ Y8 y+ l( m7 H
    这个不是这么比的吧。。。
    ' s$ Z( ]$ V: e
    & |! ~7 D0 J8 g2 c您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    4 ^( ^5 F( L6 l
    $ e* \2 V) }" l8 j# p) P* [
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    * O" {! }6 T/ e2 P2 b
    沉宝 发表于 2022-9-25 01:48
    5 _6 K0 c& u4 S现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    : l, ^. g# r$ f$ T2 P1 V1 R$ p
    是的,兄台说的对。  E. e! S, s( f

    ' R% c' l# _- c* C) R其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。5 k+ S9 R- l' z" H

    6 M; w5 z' @/ H% s: {0 ?( u! R3 B雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    1 d2 r+ R# _, Q" Q. G
    ! K9 S4 o; W0 H" R4 X比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。; s$ E! v, \6 A! h0 b% b# Z- Y) \

    1 {2 x+ S( c6 E" E# V8 X1 }! |当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    ) m; W. r! t- Q0 l, d
    沉宝 发表于 2022-9-25 01:27
    ' l0 m8 K' I3 e% S# F( U你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    $ Q0 t: n, Y4 y. ]
    ! G% K  Y, B0 s5 y0 ~" d" ]2 s又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。( e$ d6 b* D) K3 x$ Q3 ]% f
    : V" h; R( U- S) l' M# X4 v
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:475 t, U" k- B5 D5 ?9 L  q, f
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    + p$ R4 c2 g/ o: [8 `$ i0 l* K: S时间差一倍的结果可以接受。! _4 \3 d7 r  t' A' n

    3 |- B. B9 Y, A  c+ n( d你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 3 C$ y1 [; r  E5 B
    雷达 发表于 2022-9-25 04:47& y) v8 K! s( V/ {4 Y8 d+ x, o
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    9 @% c5 g+ _& W! T4 m
    6 E( s4 x* }/ p

    & B2 G: F' q5 }0 Q# T2 J6 |! y0 j
    / z: b4 L# P( a* ~. b" B能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    - o7 }: z1 ~, ]6 q* A
    数值分析 发表于 2022-9-25 14:58
    # H) U( w) G1 z能不能把这个也贴上来,看看和上一个有什么不同?

    $ C3 G/ |  r4 t0 T+ t) G, g0 R  q理了理思路,重新做了一个测试。
    8 {' E0 p; `8 E做了两个 vector 和 两个 float *, 都长 100000, N7 {  A' o/ H/ l* K$ Z9 }
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." j% t: D# d  I
    7 _; j/ B6 y$ M  n: s/ }
    内循环试了4种方法,4 h( a- v- l; q
    1. 直接调用 vector inner_product 247s
    : j5 P  ]* [9 L  h% `2. vector 循环点乘累加 237s$ \. o% D' [% N5 H8 v" y
    3. float * 循环点乘累加 204s
    4 Y; ^6 t( i  U0 x$ D  r6 i4. 空循环 100000 次 202s
    9 ^  ^+ A5 ]. |2 \9 e2 J1 n9 l! g2 j: L0 b) o: n
    不做内循环 200s( I- ~+ A& o' |1 L+ U
    ; _- x' `7 P2 i% }( P$ m4 M2 U
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    6 U9 o8 w1 C- Z+ L1 Z2 |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 F* c& F( h! X
    " L6 v( E' Z- g# e" x5 A% h2 r
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 o) }# D; L2 @* R$ t
    ) m8 S" N5 y( T3 Y" [
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)( S  a3 o  O( d- a5 \, I1 m

    # `) b3 [7 w9 g: L; O- s
            std::vector < float > vec1(N);" w& D! C! x0 P2 d! V
            std::vector < float > vec2(N);
    # j5 @1 \  v$ L* ^1 y        float* b1 = new float[N];2 e2 I2 j8 o/ E. H6 \! [
            float* b2 = new float[N];
    ! t/ W, [2 c8 s
    ' b$ H0 q/ {' \2 d) l        for (int j = 0; j < 6000; j++)
    7 i1 U" c9 q5 n% J* l  E/ l        {
    & L* E, \/ z0 ]                std::generate(vec1.begin(), vec1.end(), []() {
    : k; S( B0 B. `2 y( Z                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 \, K, `5 S& Y
                            });
    1 ?/ o7 c; m3 C9 @; a7 B3 o" y1 ]
    ( N4 a" W' z# z! \' Z- i, {                std::generate(vec2.begin(), vec2.end(), []() {. X8 X" M4 `$ K1 q7 ]" A
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    8 _' s- R% s& {9 s/ M* F. `                        });' h! i3 q$ V- k5 }3 U2 Q8 h
    % _$ G3 k% j1 X  p( p0 L# h; \
                    for (size_t jj = 0; jj < vec1.size(); jj++)
    ) j: |$ h+ N3 a2 w                {% b& N# i( B' T, T* X
                            b1[jj] = vec1[jj];
    8 u  V1 u3 {3 e- ~  I. ~5 [& P                }4 G+ Z) V; J5 A& ?2 k$ J% d! W7 B

    9 a/ I3 R- G. Y6 B* s                for (size_t jj = 0; jj < vec2.size(); jj++)
    7 o. ~2 W; d+ ^                {
    3 B' q3 _  X# R: A7 [7 ^. t                        b2[jj] = vec2[jj];1 b8 }- H& [) D2 u3 x
                    }
    " q& s7 F4 `8 r
    ' ?+ Y0 X5 n( c$ t: D                //Method - 1  N=100000 247s  
    9 ], G' w  `0 m                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' T+ m& A5 p% R7 k
                                    8 n6 O; S; {0 {9 E7 s% Y+ X/ g
                    //Method - 2  N=100000  237s* H" M0 A7 N' Y) R8 H0 v
                    /*9 j9 H+ _5 P3 X/ s* ~, X% T
                    for (int jj = 0; jj < N ; jj++)
      n9 S  b# f$ G" h                {
    6 c8 j2 b7 X3 |& L. _                        fresult += vec1[jj] * vec2[jj];
      g: p" P, R$ j                }
    3 k8 r% E; V& [  _* v5 \. Q  `                */
    ! P4 C6 R$ d4 @7 d) n' \                                
    8 q# G' ?. ~' C4 a, m. E! n' E$ s& P                //Method - 3  N=100000 204s
    3 S) [5 S2 F# x2 C5 \                /*
    4 L% J6 F- u+ N8 X, n9 K) P2 G                for (int jj = 0; jj < N; jj++)
    ' a0 U9 _. T% I0 v                {& a1 y: p; t- w" |# Q# q
                            fresult += b1[jj] * b2[jj];5 E. W: N* ?& [/ F% t
                    }
    : y4 q( Q8 z2 v* {( {4 }                */
    $ ?: n6 B$ o* C- |) @; h0 E! j+ }8 P$ v% n/ ?6 |. j( i
                    //Method - 4   202s
    & y! v4 ?- ^6 U' _) h                /*
    * s, J- w; V9 s# B, M                for (int jj = 0; jj < N; jj++)
    ! K1 L, U3 x7 H3 T/ l                {# o) S6 ?0 _* s% G& j+ a
                            
    3 e' |  K" q! ?3 Z/ i& ~& J                }+ |* j7 c; S3 E8 ], S
                    */
    6 b  }& b6 y3 a7 L/ l7 K* f                //comment out all methods, N=100000  202s                ' ]1 M# n' i  _' E& a( }, H* c# T
            }6 M3 C3 Y% B* f" `' H3 ]

    # o! d# A" t2 w4 E9 G+ r& V% G6 ]& H        delete []b1;- h5 ~; a3 \9 i7 @1 t0 ?# Z" y
            delete []b2;

    2 Z( {. d) ?6 a; y! K  S
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?9 a2 h/ \1 N3 k9 i  `
    # ], Q  A: q  o, H0 m
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?# y7 `) m8 C; O3 e( T
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-9-2 21:30
  • 签到天数: 1181 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15. M' D  u! ~( I+ F+ R+ T
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    , x! p! W1 n8 ]8 I& D: t2 [7 }% z' X2 s  S$ X
    你第二个试验里面的j在循环里面又重新定义 ...
    3 r6 x; ]: T7 @" |
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    3 h' D0 H1 s* l8 o
    8 h$ ^: z- o2 [* |4 C, v( B& ~不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    0 C( S6 I8 E- w- K: \( W内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL+ b( Y' r( t7 ~8 G% Y" M, d/ K1 v
    ! A4 Z7 c( h7 `! }4 w
    不和它 ...

    $ ]! e& S7 T' \6 l1 o- A4 p. Y' ^1 b; ]- m2 _
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    " C8 o/ v9 y$ P! m0 Z5 t后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:544 p, ?0 b0 ~8 n3 w. n# f+ t: ~& ]
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 [- ]3 Q) z9 M8 d: o{  I* S8 m; S$ `
            comp temp, xtimesy;
    # K( Z% F4 F' ]9 d3 z
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    0 D3 T3 T4 T( O( G# O内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?# }4 \) _. F; o! s
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-11-24 13:01 , Processed in 0.044423 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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