设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    * {; @4 ]+ h" t1 e6 N6 ]( _; q' \% p; o, e0 o8 K
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。' g3 V% B. C2 m) a
    # D* K  \6 Z* Q8 K
    速度优化问题真的很有意思啊。  C/ U$ {) R' S3 {
    ( m; Z% {+ R9 r9 u8 _: `
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?. a3 t/ M( {. E+ k
    把代码贴上来看看?! E8 t- [2 p; N; _/ {, I) l, j

    % ^$ q6 c6 \# D5 w/ i难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑 * \' M- I3 o( x: _  F
    数值分析 发表于 2022-9-24 23:04$ C9 _! w: J7 b# ~
    拉下来?拉多少?1 O7 {  ]7 N; R- R& Z5 x
    把代码贴上来看看?

    : l, V; H% ?8 H% ^
    ' Z6 C! `2 n3 |' `; A; yvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    3 ~0 M% b: l* s/ _- V  N9 Y- g{$ C7 O8 ?9 Y+ x
            comp temp, xtimesy;
    / o- b. M8 B) @7 M: R' n& f        xtimesy.re = 0;5 a& ], M: X! @. z& ~2 r  f
            xtimesy.im = 0;1 t4 Z/ G0 c' T7 Q
            int j0 = lenB - 1;, J0 Y# Q  a8 \" Z6 y9 a: o3 b
            int    i, j, i1, reali;; T6 m+ W9 o+ n3 x2 Q6 s( B- I9 R
            if (lenA % 2 == 1)" Q1 N( F, j4 ^, y
                    reali = lenA + 1;
    9 O) J' ]% C5 H: v5 d8 r+ e# A        else
    5 T0 t* Y1 m" G) W5 N                reali = lenA;* w% q0 {: y# Z; \2 w
            reali /= 2;5 r2 m( O! W1 T# R/ b' }) M0 Q
    / b7 \0 m% b- z* f# W
            int nconv = reali + lenB;) H, A3 D# \. Q5 v7 R
            //#pragma omp parallel for, y4 z# c1 K, z# s
            for (i = reali; i < nconv; i++)
    8 y2 ], y3 O6 z$ A1 I  I8 T9 Q' O        {
    & B5 \2 {2 D4 z4 c5 X5 k" }. J: f( ]                temp.re = 0;: B4 r  T  o: b
                    temp.im = 0;4 X) C1 ?# D# T6 |2 v% n
                    i1 = i;* E- ~! K% R7 d& u
                    for (j = j0; j >= 0; j--). E8 U" E" m8 p, G. R8 G
                    {1 R: k* G7 `5 l2 @* X
                            /* floating date operation */: o% o; f; R# O) z' P1 N
                    }
    9 T; c, q8 _+ t8 A3 `
            }$ J, j' }$ y0 Q* k
    }+ [; s- q- @6 N' H  |
      a. D8 F" N% ~$ ?
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    6 O/ \$ ]3 |3 d9 H' ^
    8 V4 u* X& Y: [4 v6 t* w红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
      W( l7 w. L' s现在call xcorr 100次,耗时78s.
    7 t9 ]6 M* ^$ @3 P4 h8 W5 w, I/ ~, h6 e
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.   m; |: ]2 f9 D* _3 J4 B

    / m8 L5 h. E$ S$ a  S2 k
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ( v. o$ K7 ?5 }Maybe Debug mode?

    ) }# l! \$ f1 Q4 F# O1 `. G2 ]: m  S; c/ \& P1 W9 X0 T. z1 B+ g5 Q
    不应该,看我上面的回复。' p1 t! b- E1 l" ^/ H
    $ C, G6 h. S$ [& F9 N
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 8 n% i# N. b7 ?
    雷达 发表于 2022-9-24 23:54- C" g" {( h% w+ ]
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)7 N" g4 I) o1 r1 v' y
    {
    5 D  y) r5 h' {  i        comp temp, xtimesy;
    ! d' |/ T4 G- \: z

    6 m2 {8 v9 z$ `% b  R这个不是这么比的吧。。。, j0 o5 S% Z& u7 |  r+ j

    4 i5 Z! A# H" i+ c8 ?8 }1 d% x% W- g您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。; w/ ~4 G) }; }0 f7 K( C5 I
    , j5 D+ N7 o  g; s
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    + ?* _0 q. ^4 U0 K" m4 A+ b- d; }3 w# R# ^" u
    数值分析 发表于 2022-9-25 00:20
    $ J$ f: h4 M5 C: i9 r5 j; G2 {这个不是这么比的吧。。。
    & `/ ]" K" p3 G) G6 A) P
    5 V# w& Y% c% O, [3 f; a& b您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # p5 |4 H7 f( e# o! ?& c% T
    4 d4 A8 r0 P- k1 u
    有道理。
    2 x% J  u, v6 U6 u! c5 n! U* Q+ [) U所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。' u+ e% \9 d9 v5 Y5 l# _: s
    : \% ~( U+ F" Y- Z* w
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    1 r9 ~5 n' \4 X6 E! b. {有道理。
    ! N% F) N+ ^+ T9 Z( w' o" ]: x所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    " K# i" Y3 Z3 _# S' g" k- J( b
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多" j5 X3 T& e) J+ j
    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
    : O+ `! H/ [& b1 O  y+ e# i+ D这个不是这么比的吧。。。" p( n: I$ K# N( y! p9 H
    ( Y+ Q  R1 ~1 @+ I* Y/ E
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    9 ?) R2 Y) q3 |, U2 V
    4 A1 g( v7 g+ V& i( C现在的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 编辑 : p) f  @8 l% D1 E' j4 x/ m! C
    沉宝 发表于 2022-9-25 01:48
    4 x* n, C! G- z( ^2 x现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    + @# G$ C8 U; F

    . w( b+ }/ ~! Q是的,兄台说的对。
    9 a; u/ f) s: p( _- X0 I
    % j2 \* [' r0 j; t- |  a+ u% d5 n其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    ! |% u/ E$ L0 }7 Z: }7 ]0 u! T* r5 ^/ e" R- |
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    : a# |. L- x: V/ x/ N/ D, t& o6 M, d+ {
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。' W  y+ s8 f7 ]+ U8 X" L

    6 `- [8 v; u' ~- f当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 ( ]! m1 U+ L! s( ^; W: O
    沉宝 发表于 2022-9-25 01:27
    / W& F4 O/ K" C7 B你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    8 B: g! ]0 \. `1 \6 k/ s7 A9 Y
    , A( \) m$ y) g0 f: G1 e% p9 u又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    2 l$ j: h3 J8 J1 ?5 f1 P# g. G
    5 M7 B) Q8 c, Y4 E3 ?" u8 ]& b/ W* b我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:476 P6 I* y6 q: T0 v. h5 H7 ~) J
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    * h: u& E. o& u8 q时间差一倍的结果可以接受。
    8 w) a: l& N7 J5 N/ O1 ]: w1 Y1 L1 H5 w. T
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 + v: G& S, K4 k
    雷达 发表于 2022-9-25 04:47
    " h7 X7 @/ J: [! }/ ?又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    8 R1 N+ L; l+ k  E
    , V2 `5 `/ r, v. q% U

    " _- `, T* [6 o& C
    ( i+ J* o( F* M9 V9 Y5 `* _能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    0 |3 ^* g& m( Y# o, U& w! l% ]* L# j- m
    数值分析 发表于 2022-9-25 14:58
    9 e, T5 Q- Z6 h能不能把这个也贴上来,看看和上一个有什么不同?

    2 s3 u/ N% X& q' e$ D理了理思路,重新做了一个测试。8 t: f% C9 V5 ?2 O' V* Q
    做了两个 vector 和 两个 float *, 都长 1000003 l+ d, U  X( U! c2 y  Z
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. D( b5 x3 I0 F( J  ]) X- |- E

    5 o& f) K% L& c, p  z7 V内循环试了4种方法,
    / g  F3 A* G& j2 f$ E8 I! W) @1. 直接调用 vector inner_product 247s
      @' {# F: b+ n* j( r2. vector 循环点乘累加 237s
    0 d, g+ V+ [+ Z! W- O3. float * 循环点乘累加 204s; H# ?$ ~- b/ e2 _! q% Z; X/ R# ?- W' V
    4. 空循环 100000 次 202s' _0 O& {; r. e, J. u
    ; D! o! M5 [0 o7 j2 E( E1 X! N
    不做内循环 200s
    % Y8 R' \8 \2 U8 Y8 r' Q; [0 G$ p! P. r9 v! [0 t
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ E: ]* |8 I( A$ e7 C$ H
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* m! N& {7 z( H9 o1 N( [

    # y6 J) ~+ s' r- l; C) P至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* l6 v1 |7 w6 \0 p9 u: p- P

    7 ?. ?) }5 |2 P3 e4 [(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)  C, P7 r1 S/ t4 E
    ! Z4 J9 S5 N0 {& p( J1 i3 Z7 J
            std::vector < float > vec1(N);
    ' o7 @2 d5 }6 C( V        std::vector < float > vec2(N);+ W, k3 x) S- Y$ `
            float* b1 = new float[N];
    : A7 C/ ?$ T: _% ]& k& E" o5 O+ m        float* b2 = new float[N];  ]# ]  x+ b9 _+ Q$ c8 Q5 L  f+ u

    0 [( j2 G, U# \7 u! F        for (int j = 0; j < 6000; j++), Z* H$ k( T/ n8 J; x3 H, }! E
            {
    0 t7 r9 M# Y: e  q' N                std::generate(vec1.begin(), vec1.end(), []() {
    % `, W" P) K! G& x                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    " E- K1 m9 H" m0 _/ \% F$ d4 v                        });
    * i( o) g" O: x0 o8 r
    # p* N$ ^( ]3 Q- I& w0 b                std::generate(vec2.begin(), vec2.end(), []() {1 q8 H) {$ \; Q( z2 `: e
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ) z; t: G$ e! e! p) ]+ A6 V                        });8 d5 H2 P; P/ Y/ M% V
    * {( i+ k$ _1 V
                    for (size_t jj = 0; jj < vec1.size(); jj++)5 N& f& ~5 U! D
                    {
    % ]5 C( H* z, ^/ v4 ]5 P                        b1[jj] = vec1[jj];; D' j/ s3 ~+ k2 O5 n0 K$ L
                    }
    1 \" d8 d8 X1 _* N( ^5 ]
    & F6 F& o/ O$ J, u                for (size_t jj = 0; jj < vec2.size(); jj++)
    6 R' @6 T$ A: X* e8 z! Y; Z( p                {8 }( Y2 K1 k$ h) R8 X0 `  P
                            b2[jj] = vec2[jj];$ X* b, i, C4 [  U
                    }  I8 M7 Z7 h0 d4 K0 b" _
    & n, z" s9 r  ?7 }; u) t! l' e6 {' t
                    //Method - 1  N=100000 247s  
    # p& o+ r5 M  Z! k# |                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    8 Q! a2 W: W: K, l: W                                % g0 x+ F. j# ^9 f1 F  G
                    //Method - 2  N=100000  237s
    6 f4 I0 _% L+ P) U                /*9 d- v' T4 y- j
                    for (int jj = 0; jj < N ; jj++)
    6 \2 ~5 [+ h- W  S  l                {
    0 ?/ v- V1 J1 {1 f/ K                        fresult += vec1[jj] * vec2[jj];' C  W! ?5 M& k+ m5 g: J
                    }6 N6 |# c# e$ w; @% U) \
                    */" @# K7 c# u3 g( Z9 P' T0 t2 L7 p
                                    
    9 D: `2 P2 S: s) g/ ^                //Method - 3  N=100000 204s
    % a/ m2 x6 ~, R8 ?6 N' H                /*
    + l; ]( L3 l$ p                for (int jj = 0; jj < N; jj++)
    # s; }. H, @2 i- j: K7 _4 |5 [  i                {. N! u6 n+ u5 Y. N3 U" `2 c
                            fresult += b1[jj] * b2[jj];5 L$ U5 L0 b% q9 y8 ]. {
                    }
    + G2 x4 \6 o+ U                */
    $ Z2 a/ c- b# R! i# d% t# K+ U/ |# h
    " t' W* k# s5 v5 {" ]6 {                //Method - 4   202s
    ! f  P# q3 C  F                /*
    5 _9 J* A7 D# {( j) `                for (int jj = 0; jj < N; jj++)# I- P( g( R, A! Y
                    {0 E3 {2 f0 C/ `% f* r! x
                            ( M* Q! Z5 q/ j3 R3 B
                    }- [8 f6 z- `& `$ v0 K
                    */
    0 y8 t  v: L; n. e! }                //comment out all methods, N=100000  202s               
    * l3 h* I' Y1 [8 m3 S# R' X        }1 S8 T0 i& q7 l) j$ d7 K4 ]

    ( o3 o% H6 E$ i: g        delete []b1;) H  a2 c$ f' |& \
            delete []b2;
    - T5 `4 [: t3 X% _# {! U0 f9 r
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    / t+ A! o% k7 c8 `2 [3 ~/ f( }) D: D( e7 n5 }7 |
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    ! ]; M- _4 O1 |( y8 _+ U( N# Y- a
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    ( [4 m: B7 H/ b; M1 {瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ' I9 k& B8 }* ?7 j
    % }% |( @1 `0 V4 h' [$ [) Z你第二个试验里面的j在循环里面又重新定义 ...
    ' y5 I; p3 x! B7 g& i8 T1 U
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL& e8 T- [/ ]6 ]

    ! Z1 m- X* M8 K- a7 L! Q7 W不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    , |5 K& l3 J$ v# a* [* i0 b内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL8 ?4 r3 ~: E5 I, ?* x( F7 E# R

    9 l- Q* }* h: W* }/ q不和它 ...
    # N2 T! X# C" u/ V+ h% {

    ( a, a$ N: `5 b- i$ K0 q" s不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    4 M/ E6 a) P8 {9 t后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:541 u7 |( t4 ?% k2 E! Z) e
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" C9 `- [5 W& i
    {8 w# i3 U+ v6 i  q) l
            comp temp, xtimesy;
    ( E' M! [2 V# @" j) R
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    ) u2 J0 V# C, D8 B+ U内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    : E- I7 l" {9 _! T$ EVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-25 14:52 , Processed in 0.077629 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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