设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ) _' W2 F" ?/ ^, z. d. R
    3 t  C; B5 M) z9 z- @" ~' P( J3 i. n自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    0 N+ y6 \' s) v0 C; y. E
    $ I4 ~. X" {8 K" D# b速度优化问题真的很有意思啊。1 ]2 v9 R1 i- h  B% }- o, [
    & j) K1 Z$ }$ b0 g! J
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    3 ~& r- p- [3 R: c  p  _7 J- k% e把代码贴上来看看?" j) P0 q$ f& d4 r7 y/ [

    ) }5 e7 g$ j* Z: q3 O3 ]难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    4 a/ }# n6 \3 j' t. o! c4 R
    数值分析 发表于 2022-9-24 23:04
    % q% f- h- n+ G$ s拉下来?拉多少?, G. d+ w- o* A' G/ d
    把代码贴上来看看?
    ( K: q4 R+ z2 o4 y4 E

    " P/ K* Y. U& j( {2 E! uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ T9 }- s4 {9 X; G9 v6 t
    {
    8 B+ _9 a7 ~" p* @        comp temp, xtimesy;4 `3 o1 ^( c4 Y5 j- O1 f  T
            xtimesy.re = 0;
    ) H. f% m+ m' O5 i/ w$ l9 t! i2 S        xtimesy.im = 0;
    & C9 n/ X5 H; A- e3 d7 m* J        int j0 = lenB - 1;
    6 y$ E$ {4 i3 y$ Z$ Q9 ?; D5 y% B        int    i, j, i1, reali;
    7 `: O0 q: j8 i( O        if (lenA % 2 == 1)8 Z: m( {$ L+ e8 g1 n- y3 n
                    reali = lenA + 1;1 U: g( j0 |1 p1 j& R
            else, x# R2 W; D* |# b
                    reali = lenA;
    # U6 e5 w' S, f; T% U1 c        reali /= 2;6 Q  f# u: d5 ]
    , s* l1 g- z. i, i! ]8 k9 B
            int nconv = reali + lenB;* F2 a6 Q& A) ]- |- }5 \
            //#pragma omp parallel for
    5 ^# G' c( N7 h9 y9 ?* J        for (i = reali; i < nconv; i++)+ b: }9 u7 E0 Y6 S6 Z0 z
            {- c1 R* d$ i5 u
                    temp.re = 0;% k& g8 ]9 v* g0 t" Q
                    temp.im = 0;3 X4 u# {( i0 ^# f
                    i1 = i;
    , [) W* v4 `% k                for (j = j0; j >= 0; j--)
    . F& r. ]6 I8 j7 @' r% p. n2 H! i                {5 u0 d% g2 i/ i! C, D2 W8 b& K- U
                            /* floating date operation */8 ?- l* d8 t8 g3 p7 e2 |% B
                    }

    % B# u" d9 K2 A9 o        }
    0 b( e0 K5 U, A1 T}0 J0 [7 `6 Q, ~8 S
    * |" O& o& {0 U( t) |" o+ u
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    " Y0 n5 r" o2 {# }3 I% M
      S) P! _; |' u6 Z! k红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    8 v& a4 b; ?7 J; ^6 C6 f现在call xcorr 100次,耗时78s.
    : O4 f6 \% z4 x# D8 Z- Q4 o  s4 c3 L) B$ V+ L4 V
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. 7 r% c& [# V$ s3 u4 T. j
    0 o* t8 y0 W/ B3 W9 P6 Q
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    ; p, x( w5 v! g8 H8 ~4 AMaybe Debug mode?

    4 @) a$ t" h& `" L, e( b, J/ K5 S2 [; x/ V! g# U
    不应该,看我上面的回复。
    9 h- n9 @9 ~7 u% i" {0 p! B; s% `( \9 }# p9 _3 S
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    - t, O1 |; G. z3 V& {% D3 J7 t
    雷达 发表于 2022-9-24 23:54
    . Q( q5 O: d- }1 q5 Dvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& h7 X$ s- G! X
    {
    0 G* k1 q# l) Z! N* F        comp temp, xtimesy;

    . X- ~! U. m9 H4 R; t1 H, }" l, ~) P" |4 J
    这个不是这么比的吧。。。
    ' n% D2 F3 b3 S: K& S7 [1 e( P: p4 d% ~4 i' E. n
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    ' f& z6 c( R) t$ p7 \3 e
    & N* i) P$ }" U( I3 ~1 x( B而加上内循环,光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- @: O0 L5 n
    数值分析 发表于 2022-9-25 00:20, x% @& d8 v, o2 c2 _' g
    这个不是这么比的吧。。。
    7 F2 F' V; F% j# a& k
      @) Q# j) A1 G% R您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
      G6 Q2 l: J& z6 n* b5 T. i

    6 J% G* h+ S: Q3 B有道理。; V! g) f( [' R. n
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    2 v3 h8 [) }3 J
    1 j- `6 H5 W+ {5 l我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46+ c9 u$ X& x2 `. {4 H9 g
    有道理。
    $ j: K" m0 l- A/ \* B所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    ) \. D, a% j/ L& _  T3 P你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    * G/ v% R8 I8 W7 P% {+ j/ G& g' b; CWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
    2 n$ A" T: A4 u这个不是这么比的吧。。。
    . T7 G5 Q$ q& N) D! V1 A" `- {) n/ O! A
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    , y1 x# u0 a7 i5 L
    7 E. G: g0 h/ l) y! J0 t
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    + g; Z+ u  G  X' `1 }- }6 ?8 ?
    沉宝 发表于 2022-9-25 01:48
    & ]5 ~* Z# p9 v# v  j- C* }现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    + l9 p7 e2 f- d/ T3 X
    8 q8 m$ F5 t9 v4 Y+ s1 L! q5 t, V# O
    是的,兄台说的对。
    * X2 t% F5 t9 }  ^# D2 z+ j5 E6 g/ D, v' ^: O% S
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。3 M. A9 |- X6 y) Q% S; J

    " F- s4 I9 I5 I  p雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。+ H9 J: V  O, }1 \0 P
    + c  Q7 x5 }% ]! F, B4 m' Z4 L
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    ' O3 n$ O7 O" x9 c2 N
    & W$ ?' \$ r5 R0 |7 {7 v. b当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    $ T; t( C" }) h3 F6 ^; s0 ?
    沉宝 发表于 2022-9-25 01:273 ~5 l: e( O, [) W/ L% C9 H" U
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    9 b* o( B9 B, k8 S/ j
    6 Z1 D2 `: f+ m, O1 J: S' z
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。: e: i) W9 X% S% [- k! z7 _, S7 U4 @

    ' l3 w. V$ W! j1 |3 _$ j( t3 g我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:473 C) Q4 G! t1 S9 V
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    : e* y% b/ J# }- R时间差一倍的结果可以接受。) l& V" [4 O8 l2 U0 c

    & y5 Q% o, _8 w6 `你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    ) v! F: t. m& U- Z
    雷达 发表于 2022-9-25 04:47
    9 k7 G8 q$ N# s/ B5 k7 ~. [7 `* s+ ~5 S又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    . k# _  s+ ~5 p  M7 @% [! \4 s- c0 U3 h. m1 {

    / I% y! x. A& s3 Y3 |3 \8 ~3 w; w1 Y2 B3 `# U
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑 & w, _' }4 J$ W
    数值分析 发表于 2022-9-25 14:58) B$ D' I7 i0 T9 ^1 Q/ \6 c
    能不能把这个也贴上来,看看和上一个有什么不同?
    & G( x3 N, w/ z4 k. `# g6 j" @
    理了理思路,重新做了一个测试。3 M$ f( P% G7 W
    做了两个 vector 和 两个 float *, 都长 100000
    4 t9 @. ?" t8 l; v$ V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ ~" `9 c6 ~! ^! P* u& e

    ' M5 J! P8 t8 ]9 M8 a内循环试了4种方法,2 g5 y2 i) H1 R- K3 F
    1. 直接调用 vector inner_product 247s
    & D! R- q% E* C; J2. vector 循环点乘累加 237s# \4 l9 F1 r2 U' u* f' B
    3. float * 循环点乘累加 204s. j/ @: x' d$ c' T" A: `
    4. 空循环 100000 次 202s
    3 j+ [- o: l6 d
    8 {2 V* E0 t+ G/ I# Q不做内循环 200s
    / W0 g/ W; t6 q( v: ^" Z" F" y$ A
    , @$ V( P' Q9 F你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    * o. ^: a  J* {1 _" E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    - c  f$ E2 p: X: S5 o' Q' S2 N7 b' j- o
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 d5 [  s( f! s

    $ b1 A5 q2 e# B, ]$ C(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)5 U/ D2 [# ^7 c9 J# ?

    7 a4 z5 b- A8 a# s  R' U- e: D
            std::vector < float > vec1(N);& R. `) C# H) j  i8 s4 T
            std::vector < float > vec2(N);
    / N- \/ D/ s; H        float* b1 = new float[N];
    6 A- h! \5 d9 \( [8 y- A        float* b2 = new float[N];
    1 w) p7 ?) n. K( U+ m6 c9 K( x, `  R9 ]7 v/ A, K
            for (int j = 0; j < 6000; j++)+ a1 ]! U3 r: o4 d& r( t3 Z
            {
    $ f8 k* P& X( |( Z3 z" C( D                std::generate(vec1.begin(), vec1.end(), []() {
    3 e& G; _" r4 {: z4 b9 k6 R                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ; [  l) R; P; e$ D7 P- k                        });* G" T( [! i$ K; p5 n' e

    & x% U) |. a4 i& l  {  n0 |2 q                std::generate(vec2.begin(), vec2.end(), []() {
    " e. n9 z0 u1 {9 r& f( p                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    * ^: c# k9 @- Y" S4 W+ J9 y                        });0 v5 o* n& G( c2 u3 y! n
    % @" l; q- V& `
                    for (size_t jj = 0; jj < vec1.size(); jj++)# z( @) g7 [/ f! p- w; B
                    {* a* E6 F/ i# e% S5 }0 l& P
                            b1[jj] = vec1[jj];3 `! S5 W* K2 n, d
                    }
    ' D% Y- ^# j+ k$ |; D4 ^( N: ^3 j$ o5 X. Q. [( f
                    for (size_t jj = 0; jj < vec2.size(); jj++)$ F1 |! a  b' C$ X) h! [
                    {) `& W8 G' \3 n& ]0 i7 k3 e1 p
                            b2[jj] = vec2[jj];
    1 k# B" j8 \% |: a4 P                }
      e, R, D- P# A" _3 I, Z) ?0 ], v
    - }5 q0 o, E) x. w5 ?                //Method - 1  N=100000 247s  
    ! W0 I" k4 O# r; [0 {" A                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
    2 `) }# x! R" u/ w+ o, @  x                                - X3 i  V$ y5 w& m+ b$ _# a8 m
                    //Method - 2  N=100000  237s
    1 m* e1 y5 I& o! W8 Y) z                /*
    5 I; e9 c2 _+ U/ Y                for (int jj = 0; jj < N ; jj++)
    $ N! F1 U# I+ E5 G. Z( f. a                {2 M* W3 W7 ~5 ^- F5 K+ Z
                            fresult += vec1[jj] * vec2[jj];3 Y# r0 E! y; K; y
                    }
    ; J# u' B% M9 g8 D4 c4 Y& K) w                */9 w  `) D, S& r/ `. o0 l: X
                                    4 B- x4 \) L5 e! C# {( \; A1 b; }
                    //Method - 3  N=100000 204s
    " s. J5 C" G0 Q. d+ H0 q4 Z/ C                /*6 L/ ]5 j" k# j1 N7 \7 w0 O1 Z/ A
                    for (int jj = 0; jj < N; jj++)0 d8 y; g6 _# o; v. e1 t" e6 A) A
                    {
    + Z8 n$ t' V7 c+ N                        fresult += b1[jj] * b2[jj];
    9 x8 ?. {& C8 z1 t. U3 z* M                }" }/ N. D& L5 C
                    */0 a' U2 B3 G! j0 N/ y( B% {- |0 Q4 E
    ; @1 b, j; c' z) H7 e; E/ H
                    //Method - 4   202s
    + I1 s9 r3 P  L5 e# p                /*2 @" B' P2 M) s, U
                    for (int jj = 0; jj < N; jj++)* c. x6 H. \; c, P: \$ c7 z
                    {
    + n  ?- P, D* J: s3 ]                        2 v7 v: h0 e6 S% k* \
                    }
    . f0 k) d2 H2 e* ?, J                */
    , p* |% x$ @7 D9 b- t                //comment out all methods, N=100000  202s                # y& H5 w& \- L3 d9 S; U4 T9 |6 v
            }/ X& Q" f+ B7 I$ u* f) ~: P% ~; o

    2 z! s; f0 \5 l8 F& r# G9 }        delete []b1;7 g5 y# F' ]7 H/ [
            delete []b2;

    2 w/ I4 s! U  ?2 K( ^% ]0 A
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?8 p* p& P8 N* Z8 I, i+ }" P6 p0 x3 j

    , Z8 _6 N# _( A5 Q( K3 o你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    % y+ F) P/ b+ }5 J8 }/ E( H& W
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15; [% p9 ]& U% J7 L# N. l
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?% h. Y, t1 q! s& }

    1 h3 x% K) R) F) I, C# ]你第二个试验里面的j在循环里面又重新定义 ...

    5 ?/ h% P3 E* B, F: b! p3 K" p内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL9 n1 O3 s( Q' D- |9 _
    / p& T2 a! d  x3 ?
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    7 ]' n2 N( F6 I/ x" l! J' Q内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    , M/ P/ L  T, D9 p' _7 d9 u. H* s- w! x7 `( @3 R
    不和它 ...
    6 I' F6 L- y9 D- C. I

    , H8 S2 o2 I1 Z0 o7 d不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    0 T9 |; j' n4 Q1 J' Z后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54( O; [' m* h. H7 }6 J: ^: ]
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)' |$ |; Z& p, e! k8 i; C2 b
    {
    % @. j& K) o: {- t$ @$ Y5 a        comp temp, xtimesy;

    5 C6 f  c' T4 w3 w( K这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。  l; P* A/ S2 {  Z4 g
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?+ b2 b* ~" F) q+ Z0 I
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-11-23 06:10 , Processed in 0.046369 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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