设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?5 ^7 ?- l& A$ a8 P; Z

    " M# X5 @: I* W. c/ g. B) u自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    7 w5 ?6 r9 D- N+ Q8 y
    # ]! p+ A* G! p3 a0 i" X速度优化问题真的很有意思啊。
    7 E9 U; f4 X2 y4 l" p
    % a, T* k8 o5 N; q- I8 |欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?1 w# [+ O+ o2 f3 r/ y6 o# ?; ]
    把代码贴上来看看?' K0 o' E: w  s! D0 s. u  J+ `

    . T; ?& W; `5 u难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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 编辑
    . Y; U: k3 {/ e, K# P
    数值分析 发表于 2022-9-24 23:04
    + w. A, ^+ t7 {) E9 L* m6 H, r拉下来?拉多少?* R# f5 I6 W; ?1 w) ^/ G6 U
    把代码贴上来看看?

    . W1 |6 z7 w4 }+ P4 R4 q
    1 Z! ^# g: V+ [, A3 Uvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    9 [, E( W# G5 z) N" x: T8 O{
    & r! h( M8 U# K7 G( s        comp temp, xtimesy;
    / Q& R5 r0 w! K" l        xtimesy.re = 0;
    + }8 c, Q  q$ X* ~        xtimesy.im = 0;$ W5 E8 y' ^; K1 j3 D: N, z+ ~  s/ l
            int j0 = lenB - 1;
    9 Q, r  \) l& {1 \# ~* V/ L        int    i, j, i1, reali;
    : k  r) N- Z8 L1 [* a1 K        if (lenA % 2 == 1)
    . g0 b1 u6 M- H                reali = lenA + 1;- r6 X! {+ r7 V/ q( Z
            else, s; l; m( [, U; z; C. i" c3 x
                    reali = lenA;
    2 X6 G$ G+ v/ I0 f/ P0 Y        reali /= 2;
    4 O3 g" f6 s8 \6 k% D( K2 x) i  r1 h
    2 c* A8 x+ r* @, |        int nconv = reali + lenB;
    9 q& s- v; t& b( q) U. |6 b        //#pragma omp parallel for
    ( m. m- {: H: @7 H        for (i = reali; i < nconv; i++)7 t" T& [. p7 N
            {
    $ v1 T$ \1 z; [# L$ f7 h. d                temp.re = 0;  c, x4 J9 w* l' v
                    temp.im = 0;+ o& Y% P  R% a+ x' M
                    i1 = i;
    8 V+ a" m3 K; j: y                for (j = j0; j >= 0; j--): g6 A6 @: F; Z0 t% }
                    {
    " A- X+ }* h8 F# |: ]9 k                        /* floating date operation */
    4 a9 N8 T; o2 F: W  I                }
    6 G7 ~4 h  I( B7 Z+ `- {+ ~
            }
    & G9 r2 W/ [6 l) a$ Q}
    # t4 ?* c$ d6 d8 H2 S' e, d0 h( P" B8 Y6 T
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    % ^4 v- f' G7 A& i1 D  [+ u2 N9 i# ]) _( C2 H) v9 p! y  t
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    3 ?  [' G2 t2 d0 T2 s$ s' c7 v5 K. M现在call xcorr 100次,耗时78s.
    0 O, }8 u6 @; {" u; V' A
    & \5 X) @' b  R& E$ E如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    $ }1 X! s3 F( ]( F2 K
    ( H3 S2 b0 g  f: a: y" }
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    # W/ |3 U$ N0 c/ cMaybe Debug mode?
    3 t( l5 A0 [* ?$ u& P

    . `1 G2 b, n" R不应该,看我上面的回复。' o* q4 q: Y8 t$ M  q. G- m& N
    5 `' C4 L9 a; v3 @2 y6 r8 s3 P
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    * I" u: L+ Q- w: {% z
    雷达 发表于 2022-9-24 23:54
    2 G/ g! P& T, c3 J3 F0 p. bvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) I: s) B6 _" T{
    $ H$ m9 W  b& W# U  P. r" o( j; e        comp temp, xtimesy;
    : m" U7 u$ y# G

    3 @# q/ W  k. D0 Q# H' R这个不是这么比的吧。。。$ [- o) \; W0 Q7 d
    * Y7 @7 W4 d5 }) g) x2 l5 T) [3 `
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    8 a; x/ S) K4 a# M
    ' v1 \" Q  T' C! }而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑 7 O8 t1 e  h3 G
    数值分析 发表于 2022-9-25 00:203 C& M9 C' l& u' I
    这个不是这么比的吧。。。
      t2 |, A% R  ~8 p: {8 S2 A' B' d1 O& a3 v* D, r# O
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。

    " |/ q. U# a- q6 t; O4 r
    1 e- ^4 _. J. W, J% _1 V有道理。
    / p; |; Q; M+ p3 b/ x5 W+ p. t' n所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。7 c6 X+ D2 h4 e6 D# z; T& s
    , Y9 D: n. j* n) H
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:465 v$ J$ V9 _3 H9 I: I3 K+ C
    有道理。
    ( x# O8 D0 t- G. w2 d' X, c所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...

    4 l6 Z+ t7 O6 I+ @你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    0 y3 N! z3 {1 t; m; T6 jWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20
      L7 o  b/ c8 P* F7 N3 [这个不是这么比的吧。。。
    ' @6 `# t$ z5 u
    " @( @& h! o( u0 Z* K# E6 J8 k您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ! M8 Q  ~8 b; f+ ^$ q. v: y

    * b! X+ H+ t6 P现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 8 _& \9 q5 O1 S8 ^3 d
    沉宝 发表于 2022-9-25 01:48
    5 E3 e/ v8 Y$ y3 k5 z* B现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    * d( m" q& s) }8 I
    $ T2 G) n6 i! A9 L  D0 k- \0 X
    是的,兄台说的对。2 u$ C1 O5 J/ k
    $ N' c' D0 c6 K2 V: [  Y8 X, H3 q
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。1 W1 b7 Y; Z0 x' [

    ; N+ ?. L; F1 {. Y+ V雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    + o/ G! Q# B) O8 y$ X8 u9 o) j' o8 B: x  x8 w+ M# p, k
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。0 l0 e1 t6 P% p4 _9 K! d
    ! N2 x; Y) [% x" V; x  n
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 . k* X( |$ J9 M- M
    沉宝 发表于 2022-9-25 01:27
    9 C' @9 K3 ?! ^. F2 I0 _你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    % F0 Y) b$ C+ t0 G+ E! y3 k

      H" A: z' E, w. T# B" d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。2 q" X9 g: L3 }% i+ c2 F0 Q! r

    ( \6 ~' p- Q0 f5 D4 `2 Y我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47* @: k4 p5 S0 K. b/ G' n* }
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    ( o1 K: _; Y* C- p时间差一倍的结果可以接受。
    , g3 w# e& J; s
    ; ?7 V& v! K: i- y' Z你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-10 00:43
  • 签到天数: 1707 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 1 e, [# Q5 ?' \8 d6 o
    雷达 发表于 2022-9-25 04:47
    : r' }6 l9 k+ `6 T3 V又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    7 `% w+ E1 v% p2 p6 B

    , n" X9 h. x  r! O2 D3 q! p( M/ p/ R1 p

    # y  S3 d: m; I( |& E  i4 C能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    2 P- [8 B8 u/ m; o
    数值分析 发表于 2022-9-25 14:58
    , [8 w& E3 ^2 N1 q能不能把这个也贴上来,看看和上一个有什么不同?
    ; w2 h0 K; V* g5 O
    理了理思路,重新做了一个测试。! A; e' J* X4 C( b  O0 v
    做了两个 vector 和 两个 float *, 都长 100000# x0 N  J9 z! C, L2 Q
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. h6 M/ z/ e6 y/ F) F) x
    # \, d) C0 O/ s" t0 }
    内循环试了4种方法,5 |% p6 M  e) C2 ?
    1. 直接调用 vector inner_product 247s
      C! c: d5 M5 \: t! b  S2. vector 循环点乘累加 237s
    , @6 U+ ]8 Z5 u3. float * 循环点乘累加 204s2 K7 z) y! e4 d! O
    4. 空循环 100000 次 202s' S/ v! w4 Z* v3 E2 K" i9 X

    , y, H( ~# k9 E" S: x- l- L不做内循环 200s
    6 O* ^% q; w  O( w) @6 y$ @5 c: U* x* z- x6 ^" Z& f8 z
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    5 ^9 V. S+ Z9 p9 P/ ]' M另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ t# y+ M1 E& g/ X; R5 r
    * S  U/ s. `; T% `- X
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ; g* u( l+ I0 @8 V/ B4 b
    2 S1 s$ ]' P6 Y2 D# Z(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL); R5 l. A1 S; u; w) J( Y3 N
    / D% ?& R# Q9 i
            std::vector < float > vec1(N);0 P& l0 z8 \. H5 S
            std::vector < float > vec2(N);1 c& p8 x- F0 a' g* P
            float* b1 = new float[N];% g5 L! T% L& S# c
            float* b2 = new float[N];
    , s( B5 G  ?' ?3 _. E9 B/ n# C# F7 h2 a2 ~
            for (int j = 0; j < 6000; j++)
    8 Q& z* {, b# f        {2 L! J3 ^0 ^: `  k: l- g
                    std::generate(vec1.begin(), vec1.end(), []() {
    1 P: B# r6 ^% T" k. v, A                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ( q( Z( G" B# Y4 f/ D                        });
    - f  L: p9 F+ d3 O# p! O: r% q& {. d0 Y+ `9 N7 B  v
                    std::generate(vec2.begin(), vec2.end(), []() {# Q% [. n2 G& z5 J6 e1 V: {3 i
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 x2 X( d( Q( C* f' c3 D9 y" H
                            });
    ; m& f9 E2 ^! c3 i  F. v
    , ]/ I2 M& X1 ]8 D; p                for (size_t jj = 0; jj < vec1.size(); jj++)
    - v# h- A: D9 w' K; G# W                {
    ! Z* V) D, @7 X! P! a                        b1[jj] = vec1[jj];
    ( Z4 y4 U7 m8 q, x                }9 a# _7 O3 B& _
    4 d( _4 P( M5 V% [3 Z% y  y' a
                    for (size_t jj = 0; jj < vec2.size(); jj++)7 s( A1 X: k8 L/ p8 o
                    {
    % [+ H  m$ {: w0 Z                        b2[jj] = vec2[jj];' L2 F$ l% V/ \) {4 r
                    }6 I6 ?; j2 F% k+ @$ P9 Z( j" Q

    0 i+ n+ V1 S5 ^                //Method - 1  N=100000 247s  
    2 O: r0 E2 z4 J, o9 Z' [                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' G" O& N; ~: f2 N1 {% s+ S& Y( A
                                    
    ' M8 ~9 X$ F: c+ q8 T                //Method - 2  N=100000  237s
    3 V8 z2 v. W3 }. s5 L1 x4 A8 n) u                /*- Q* V! \: p. M8 n: a5 v
                    for (int jj = 0; jj < N ; jj++): w# |9 O. w% l) d# y# q
                    {) f; @  l( Y. `' @7 c( U) {
                            fresult += vec1[jj] * vec2[jj];
    % R' D. P) @4 J2 v$ g3 S                }6 z1 {  X/ z  H/ \
                    */
    3 L, o2 ^! B/ m0 ^; v9 F5 Q) m                                
    / l. z0 v1 |3 _4 a                //Method - 3  N=100000 204s
    , W* e  K: _( N                /*: {. n; V2 L( F3 b
                    for (int jj = 0; jj < N; jj++); P0 I8 T% }, b$ p$ W' Q
                    {
    / C4 T5 }; P0 P/ x                        fresult += b1[jj] * b2[jj];
    $ `$ v! q6 e( C: y7 m" J5 T                }) u. c4 L$ I& t7 y5 M
                    */
    * @* i8 T& v3 w9 _
    / B0 @! u1 I5 {: `2 r' r                //Method - 4   202s0 D+ ]4 F6 q. T$ G* F7 r
                    /*% E! L7 B9 ^% f( _! ?
                    for (int jj = 0; jj < N; jj++)
    ) B0 I; h6 d$ c4 v                {" |3 |4 e" D1 K$ H# D3 @6 v
                            4 a5 F, I6 q2 m8 e: v8 s% x
                    }
    1 A6 `, g* e' u; l+ ]0 @                */
    % A  g' J. L. e, [+ W$ T                //comment out all methods, N=100000  202s               
    & x3 v( _3 j3 r: u. M8 V        }2 ]9 e/ {% j# e0 S8 a# p

    % K) S$ X. B- N& G- Q        delete []b1;
    ( z# u/ a0 i& T: z8 K        delete []b2;
    * N. M# s' @7 }( b9 R
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?# [6 M$ p6 T  Q; m0 C" \
    ; S  p* K& ^8 Y$ Z
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?6 I% }# A/ _4 q# Q5 `; e- U$ g
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15/ t, u1 k2 V+ P
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    $ a1 r# f- `* S9 V) [6 L7 k# g
    $ @9 y; T4 }" Y4 v你第二个试验里面的j在循环里面又重新定义 ...

    1 ~& u/ b8 U( o/ X! d2 U0 U  u$ W内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 ?% }5 G: H' M; g: I  ^& G1 _2 C& W, a* V
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    . `  t2 D# Q$ @内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    1 W+ b2 g3 e! _8 m' ^# B. R' c; y. O: W- O0 m
    不和它 ...

    ' |* j2 X( \5 {9 {6 @; u2 `0 M9 ^
    8 \  E2 t* ^' e; a; s( h0 H' }8 I不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    ) ]) H" Q. `  N3 t/ ^: x0 J后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54! Q1 ^* ^% V8 p/ O. F7 }
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ( ]2 ^1 L& l# z8 Z! {{, C/ f3 e: c3 b% p4 Q1 D
            comp temp, xtimesy;

    8 b* m8 Z1 r, ~- N. K这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。
    * D( P3 F5 ^! V9 ~" `内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?8 v. T' ?- O2 f7 y) N$ w. ]" D/ S
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-9-28 01:21 , Processed in 0.044705 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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