设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?) {" Q6 N( t/ `8 D

    * ~2 }0 J( i" b% J1 A& V5 ]自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。6 R" ^4 k" q! s" T2 {5 Q6 S
    8 C: j# G  D5 `" D& ?
    速度优化问题真的很有意思啊。% a! `4 |2 S* A; f3 K- P

    5 n" a7 }; `4 r' U) ]; l- Z欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?1 C( k; _# h$ c- h; _
    把代码贴上来看看?' S3 Y- ^- |$ H$ {/ H

    8 D8 ?2 m) a- c' g4 A( K* q! g难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [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 编辑 4 j! B- f8 V; I; A4 F: R. Q/ E
    数值分析 发表于 2022-9-24 23:04
    , \7 a; s) I3 n# p8 N; m9 K, t拉下来?拉多少?
    % ]+ e( `; I* m1 ~# r/ ~6 t把代码贴上来看看?

    % z2 o2 o0 Z+ I7 P- W
    & s2 w, g3 ~$ k, ?% a3 }+ Svoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    , \+ p; ], B7 G: n" f  f2 d{8 A( I. q8 V5 ]- d! I' U) l& R
            comp temp, xtimesy;* h0 J; [: f& Q! w
            xtimesy.re = 0;  i1 \2 \; H6 C3 K9 f; K8 I
            xtimesy.im = 0;
    7 t0 q5 M. e( A9 D: @7 {        int j0 = lenB - 1;
    6 _1 m$ f. t( W% _  t1 ~        int    i, j, i1, reali;( N. f( I0 d$ w0 b- M3 X6 {& t
            if (lenA % 2 == 1)3 ?# u$ U" h* R( @4 B; \# e
                    reali = lenA + 1;
    6 E  e0 E  C* G/ J% A        else% D: l' ^- A3 U
                    reali = lenA;0 P: ^) S- d& b* g
            reali /= 2;  Y% ]8 K7 @5 h# I
      x  q8 q" [+ ]9 E
            int nconv = reali + lenB;8 E. l) B, d+ q! M* g" u
            //#pragma omp parallel for
    " n0 R& h% C' J. u$ j  C% j9 Z8 {- `( k        for (i = reali; i < nconv; i++)
    4 A% k1 D/ \9 ?% x6 L/ P5 z        {. s8 w, c/ O1 \2 Y
                    temp.re = 0;) H' `, m. y) j( K5 F' W, [+ `0 \
                    temp.im = 0;( Y4 e" I# _' Q% T5 t' r: |5 ~
                    i1 = i;
    + A. |; u, {' }" Q: I8 k% }                for (j = j0; j >= 0; j--)
    : O5 n: v- w; I; L& r5 S: T- V                {
    3 F* s1 d2 [8 X$ s' ]                        /* floating date operation */
    ( N, u; g7 W7 F" H) }2 S: L. y7 }                }
    * K6 g6 Z/ Q/ U7 t* o: @
            }
    7 n3 V# }5 g1 I) Q: M9 k) i}
    7 B, d( V  a  U7 n$ ]: F6 x, ~" m- _
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样) F! T6 S; o/ q$ C2 e+ W& P

    * n# T+ v- e) l* I$ h- R) r- R) Z* F红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。1 J/ S* Q; T0 b1 u4 r
    现在call xcorr 100次,耗时78s.: }  b, i/ H  n8 \: E
    + ~  e' z$ d/ K" x; L
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. - o( b4 n# q! M: d" y# Z
    $ F' M6 B2 e* H7 z3 X
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:332 ]! }+ \" ^& V
    Maybe Debug mode?
    . P# U. e6 h$ _* f) I$ A% ^, q

    . i: I" w9 z3 Y8 c/ v4 `2 z. o不应该,看我上面的回复。  N1 x' h7 d4 C
      X8 F, ?* C- N" B+ I6 q! u
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 8 g' t' ~/ a* [& a) d" u- i
    雷达 发表于 2022-9-24 23:54$ Y1 E3 r( H: X5 O# Q3 F
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)2 \5 d+ ?8 t$ W, r8 {# @& o" v
    {* J5 u8 _4 P% a# o1 i
            comp temp, xtimesy;

    6 }& Y  u- D: k4 J2 {9 a& G7 ]2 ]: C1 b5 M! M
    这个不是这么比的吧。。。
    ( o3 d' i7 _: [' |0 j
    % o0 r# p0 ], D. |, P您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。  ^3 w+ g6 C: z, {, f2 [
    % O9 n! m; m* j
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 : m7 i* [7 |- l, p, m* m
    数值分析 发表于 2022-9-25 00:20
    . I& i3 r9 ~% ~! {2 S3 \) E1 v* q这个不是这么比的吧。。。
    3 T' s1 F  ^( Y) G
    & v1 u7 V' _$ {9 u8 Q您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    + J3 O4 h, f9 @' \5 B
    3 C& ~4 x5 W$ U: q4 o5 r4 Q有道理。
    3 @7 y) x( S6 [* \: j$ y& N( _) l所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    9 K* V: N, j' K; \7 I! ]4 _- N( {! h3 S; G" r& Q
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    ) ?  h1 F& l6 F, e有道理。
    : L0 |! ?5 T) H; _8 a所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    2 _% ]* T# ~/ A( ]  R; V你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    5 x7 S2 y! \1 B' y* B( HWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    . Z- t6 ]8 o$ f! S) i这个不是这么比的吧。。。
    : G4 [$ l7 U4 y% t! d( c& F% p* B8 ~& ~- H* |4 s
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    0 q! ^- v( C' F( E2 P
    % J1 W. I" G& M3 J现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    8 \& Q9 y/ C" P7 J; {
    沉宝 发表于 2022-9-25 01:48
    ; P# ?- F  d* P9 m8 h9 y: R现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    4 r; E  x# }2 d2 G8 N6 ?" P

    6 P+ _& g9 o, m4 ~$ L! S是的,兄台说的对。
    $ ], [# Y1 J2 t" b7 f8 d9 N: q5 {5 g: G* Y9 H7 h
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    " {* k  j; c; Y: J& s
    8 b( _4 H! C: I( {3 v3 T雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    ( N1 ?+ |" P% }3 I
    , |1 e- ]4 J, }' G比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。, v* v4 k$ M+ C9 h& f3 X
    3 n  D. `& r4 g4 w  p( V8 t
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 4 F: k9 r0 l2 L6 |/ Y! E
    沉宝 发表于 2022-9-25 01:27
    6 L- Y6 g+ A2 U5 Y. P你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    6 n* R+ X# z6 H) a; c" C  t- {$ A5 y, |) S
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    " q. f5 A' f  l( s2 a2 x
    ( f6 @7 `3 h! K/ P( i8 X' E/ U2 P我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    ! F( |/ Z# U' q2 d3 `时间差一倍的结果可以接受。( {6 {* v$ U( u
      p  W6 o  |0 s2 ?
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-7-28 23:17
  • 签到天数: 1935 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 * T1 n: u2 z* \4 S
    雷达 发表于 2022-9-25 04:47& S; I6 \  w( w# o6 U
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 W/ X- _8 V5 S8 q2 M1 d

    & D5 S; b! a; P' i# z, K- _" j4 A2 H/ n/ \

    3 h5 ?6 C0 S/ ~6 b; ?能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 n" ^; P: i" X* P, r
    数值分析 发表于 2022-9-25 14:58
    & s* c, L5 z, }- ?) @能不能把这个也贴上来,看看和上一个有什么不同?
    9 R: c$ ]$ M7 _! _6 E2 t: ]
    理了理思路,重新做了一个测试。
    % E1 {4 F+ l) G5 N做了两个 vector 和 两个 float *, 都长 100000
    ! A; L3 z7 ^' n' y" N* z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    $ c& B: t4 _" R/ i
    7 W1 u  T& W! T; W4 l内循环试了4种方法,
    3 D& C' \5 h8 }6 o- d% i: G6 @2 \1. 直接调用 vector inner_product 247s
    % }$ J# J, f; {0 J# D# w2. vector 循环点乘累加 237s! A6 \9 q4 p  j! }, ~
    3. float * 循环点乘累加 204s" G" K' E) d( B1 v& a5 Y+ g
    4. 空循环 100000 次 202s
    ( A7 O7 I6 @& h( D& w! q( l) b  n. v; c$ H1 J
    不做内循环 200s& P( @$ w0 V& h8 ?! f0 p

    % f" A* n( g3 N1 |% u! _你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ) C# v  D# i% o另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( v. Q! Y3 {+ U7 H9 P, N
    . {. [# q5 i4 L4 M
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) g1 G* N5 Q0 P! X4 N# x: m
    & ^( l/ K- O1 ~  i; r
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)1 f/ A) S0 K: L$ E  a6 f

    ( F& m2 H& w. A/ l( n
            std::vector < float > vec1(N);0 k8 ^) r$ F0 Q4 r6 x
            std::vector < float > vec2(N);
    9 I: J" y: R3 T+ d) @0 r        float* b1 = new float[N];
    1 n( U$ a. X9 ~8 m        float* b2 = new float[N];
    . ~% d3 p# u% o0 C
    / |6 N* X( O) \2 n2 W( T" p        for (int j = 0; j < 6000; j++)5 j8 R, D3 k# B, @6 {9 L
            {
    ) e/ a- J& a* ~8 C  i  K% ?8 j( l) n                std::generate(vec1.begin(), vec1.end(), []() {- t! W4 Z6 S; n9 E/ m( L' O$ z
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 M) v9 _$ y' ?
                            });+ s. z. U. N; G8 R' [
    : o! J( x7 t; }2 z2 h5 i
                    std::generate(vec2.begin(), vec2.end(), []() {9 u6 ]0 R: Q0 ?
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ( ~. f* u2 c9 R3 e) L                        });
    " _7 s1 R2 V; ~. y3 I' b* q, F4 {
    " Z' w+ G( H/ X1 `8 _$ E                for (size_t jj = 0; jj < vec1.size(); jj++)' M: R7 m: s4 [0 p
                    {1 S- P8 j# t( D4 C0 I
                            b1[jj] = vec1[jj];! M, o; Z+ D5 l7 H% v# `
                    }8 Z$ Q$ K" f# B! w! p
    % l* t; z$ f: t5 n, w% O
                    for (size_t jj = 0; jj < vec2.size(); jj++)
    9 E# c  U( w: N3 C& z  V) u1 [4 k                {
    - U( x) d! C6 \+ X                        b2[jj] = vec2[jj];9 K$ v/ K9 r: A) O
                    }
    : e' _' T) Y4 b- f$ |
    0 E0 P6 A0 }0 a# ]" U                //Method - 1  N=100000 247s  
    6 O6 N5 y4 W& V$ C4 @; \                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    $ K4 }( Q. ~9 Z, G5 K, T- |4 h                                3 a: Y# P7 V6 J, Z
                    //Method - 2  N=100000  237s
    % K5 C1 L! c0 f7 d0 W% L) g: l                /*
    " ?8 Q9 r5 n9 Z! V7 s2 a. |6 l7 p* b                for (int jj = 0; jj < N ; jj++)- ]6 H( |  R2 V. V3 f! ^3 ^* _& u
                    {
    % h; Q! }* U, `5 z7 `9 \9 H                        fresult += vec1[jj] * vec2[jj];
    6 r" f. ]- K, @/ J! d                }
    $ O! y( u: U  i  i( k. Y% |                */9 a2 V; A6 K. ?$ f# k: X
                                    
    7 k( l3 v8 E: U( J                //Method - 3  N=100000 204s
    $ t" v2 @+ Y* Z# [: @                /*' E( n8 w; T1 n/ ~; d  h- x4 }
                    for (int jj = 0; jj < N; jj++)7 y' N3 @9 a' v, R) ]
                    {
    + B9 e, N+ r3 ?- P; @5 l                        fresult += b1[jj] * b2[jj];
    1 P: ?  W8 Q  h7 f                }
    / B& A3 k1 I7 D# d                */0 J/ i6 ]# E% q/ B

    6 t% I; X1 f9 D, G! ~                //Method - 4   202s
    3 I; f- b9 u: @/ {                /*
    % T8 j) w& @! V! F$ |% p' G$ \                for (int jj = 0; jj < N; jj++)
    ' a7 d$ ~2 c% r" k' g, [6 f) K/ n                {3 ]% P0 n. n, ^( v9 `4 z3 U% E, B
                            1 J7 @$ V! @. P5 ~  ~1 ]
                    }3 D0 W& e. N: W" Y
                    */
    7 X. L: \/ W" @7 S$ N                //comment out all methods, N=100000  202s               
    7 E( D& r7 u2 I- T5 l8 j2 l        }
    1 T" M8 d: ?9 ]/ l6 A% H, {( B6 }) f* w- t: i# ^8 j5 _, U. |
            delete []b1;
    8 F* L8 R$ Z: ]; E2 ~/ k8 v2 {        delete []b2;
    & X6 ~# A: ~, F7 H5 j
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?# D+ q, @# d# q
    $ q$ t  Z2 V) c1 _5 ^3 ~
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?/ `" H: v' F4 e
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    7 L  I+ q7 |2 G2 T4 i9 D瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 V& B2 M% d- N: {

    7 h9 v+ r0 K8 H# E# R你第二个试验里面的j在循环里面又重新定义 ...

    % Q, o% v1 {1 [4 `, s内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL7 x( T% _8 [. j+ j& Q
    8 ]$ {" S4 o) I6 \3 K6 `
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16, C% t0 C7 C0 C) Y4 X. S
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL% u# K) `- H3 B& r. _, F; F
    , T8 b  a: P& ]& S
    不和它 ...
    + H) S& y; ^7 u1 e- W2 n

    ' p: ^, m0 V" J! Y4 w( g4 @# C) h不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。/ v8 M+ x: S2 s) z8 |
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    + S" m  X6 W5 `/ X7 W, c; b; ]void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)4 F+ I, V( E( }
    {
    * E) n: P; x6 H+ c- H4 P; g        comp temp, xtimesy;
    + n9 w) ]6 P) y: ^
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。* B* N0 o/ {1 O7 |0 `- C
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    ( A, `9 e1 f9 _: |# D2 w4 i8 RVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-8-22 04:23 , Processed in 0.051619 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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