设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?, n# v2 G4 W; t- t: `; p3 S
    2 G) E/ _: p3 |8 |
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。" G' F- @% d6 b8 Y, k% H

    ! Y6 I8 p* G+ I3 k3 a6 u速度优化问题真的很有意思啊。
    ) u7 L0 R% R- q+ i& x8 x$ B  ]; Q3 ?: ~& I  K5 i
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1637 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    " p3 {! C. t4 ?4 [# h" r# ^+ b把代码贴上来看看?3 G& W5 l" M  `

    ; X& Q. g5 Q2 Y7 R# \难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 120 天

    [LV.7]分神

    地板
    发表于 2022-9-24 23:33:02 | 只看该作者
    Maybe Debug mode?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    & H* j' m; s; w, V+ s: g, X
    数值分析 发表于 2022-9-24 23:04
    * H8 c" Q' _0 L- s/ ^1 b  j拉下来?拉多少?
    0 G8 q$ I% U. f7 U0 W) P/ l0 U把代码贴上来看看?
    , n% Q$ b; L7 J

    % @1 K4 K! n4 O  r; ~void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ V. E; y4 T# e) |$ v
    {: a! N* e8 M* N2 U9 l  E4 B6 ~# ^& W
            comp temp, xtimesy;0 k2 P. U% l* C) ]/ d3 i3 v
            xtimesy.re = 0;7 a; l) L# Z# f  T* }2 G
            xtimesy.im = 0;" r5 t$ ?6 [, e
            int j0 = lenB - 1;+ h! v$ W2 f. X! K% v4 a. ~
            int    i, j, i1, reali;
    2 g& d0 W2 `2 p        if (lenA % 2 == 1)5 r* S$ N2 e4 a4 }  B
                    reali = lenA + 1;
    ) N! E  g# \  q# y) r: R( \7 p# y2 o        else
    ! ~. L! H5 O1 A, H) {                reali = lenA;" F- T- T. \4 l0 V4 N
            reali /= 2;- F$ _" C5 V! y9 y$ R

    " G! w6 [2 C. E0 d0 h7 o        int nconv = reali + lenB;
    ; W+ ^; Z; Z8 |        //#pragma omp parallel for
    ! K$ G8 w- i# E. j        for (i = reali; i < nconv; i++): d/ ^( q' g/ q- b2 u: l/ D
            {
    4 D: E4 M- A+ H  `* S                temp.re = 0;
    . ?' ]% A3 }  P8 I                temp.im = 0;
    ' i2 t, O5 Q1 x% P                i1 = i;
    4 o/ V6 l- k, X                for (j = j0; j >= 0; j--)
    $ \3 {, s) m9 i* }, B# P                {0 @" ]. H. }( _0 b! ^
                            /* floating date operation */
    7 I6 S; Y. q, q8 D                }
    ' u5 k1 ?4 q2 i5 V- e% [$ n
            }
    - P# i9 @! k4 [7 R, w$ s}
    / Q9 g' H5 d1 Q% h2 b1 t# w2 M. E1 J4 u) F
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样4 w& \7 K* }6 Q2 A0 K# D
    / I$ N" h( G  u% F9 a% E% Q5 c) c
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。# H0 w5 q" ]# @) K0 E9 Q
    现在call xcorr 100次,耗时78s.( y: D9 W3 w' G6 G! V6 F
    ! F8 H3 |, L3 F
    如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    0 e9 @5 b, C2 B' F! D7 E
    # Y$ n, b; s. F
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:333 m3 U8 i4 ^- B/ u; e0 z9 w. O
    Maybe Debug mode?
    # S8 m) q$ a4 T- J! L' R
    / O) q! E+ N1 O) A' s: m9 Q. r" I1 l
    不应该,看我上面的回复。" j& ~$ Q( s; A0 x# K
    # T  ~3 f* s+ B$ P7 r8 v3 N
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1637 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    0 l* A4 B5 w  B7 H" L1 X1 k
    雷达 发表于 2022-9-24 23:54
    + C9 W: Q6 m% i9 Z0 Nvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) T8 F+ F3 R5 b6 x$ `{$ F8 F1 e/ y, v1 k3 }1 s
            comp temp, xtimesy;
    6 M" O$ m6 P, ~' |& K; b
    3 @9 c% N5 \; }! u- c& g% l' a
    这个不是这么比的吧。。。
    ) T; N+ F3 d/ g1 {
    , V3 L, W7 U/ H您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    & \5 G9 R% @8 f5 i. f8 A
    - @) O( p* {4 Y# \而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑   R: Y/ \0 L9 V/ |
    数值分析 发表于 2022-9-25 00:20, f8 ~' s1 k; x* l3 A( u1 M
    这个不是这么比的吧。。。
    % S) q1 m; A. p& n5 \1 T: o  Z6 P, S# h5 m3 F2 w+ r" B
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    3 ~8 u, p1 _+ Q- F
    2 s; {6 h+ V- k% F
    有道理。  t. `* Z1 o& @, j
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    4 M# H. o/ f" U7 R  D
    $ t& ~% L+ K" d+ e我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    7 @0 o2 r% B  j: F$ U3 l有道理。
    2 r7 V5 y! p0 u' W所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    . f6 b, J5 U) L. N  r
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多: ]/ m& x* W; M" R
    Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:207 b3 c$ w4 g; ^
    这个不是这么比的吧。。。' a9 O- W' j3 Q7 z/ [# h5 U( J; b
    - k/ p( [. p/ C" k% j
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个

    - ^4 ~, g0 k. M4 d3 I' _9 \0 q+ ]8 Q  X- `1 U
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1637 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    + E8 m8 B4 [% [, W2 S2 ~+ K+ c
    沉宝 发表于 2022-9-25 01:48
    ( x& O4 F$ m. a/ T/ z/ c现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    " Y1 J; f* a' O6 a
    , r: G6 m) W9 |% M: b0 V  N6 F1 u
    是的,兄台说的对。
      q$ j4 u" ]0 V: H0 J; Q3 J: `2 q  v* L5 o' [0 G) ?3 m+ [3 x
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。3 J: s3 e7 ~  @' W  X* A% P7 g

    % u  ^8 t8 |( g; [) g: ]雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。# }; j, {( g: J1 J. I/ K1 W
    9 N2 p4 N/ u; {, P7 i8 n
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    8 _  i" t' ]& }$ ~# p
    6 _5 C$ s: B/ H* A当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑 7 O, G, ^! T1 C" Y/ I) _
    沉宝 发表于 2022-9-25 01:279 ]  q9 z1 |' X: f/ f
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    2 b/ [. ~) F# z& |% T
    " e* Z- y+ C1 X( n* [1 ~" a3 `
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    ( ?$ P# H$ P" l* g3 A% A- w7 k
    2 t6 Q4 C. e( I- S* ?, n% P% s我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    ( [3 j" T; \/ E9 B$ d又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    6 O) s. _; V3 _6 A
    时间差一倍的结果可以接受。
    3 y4 e3 t5 d; j2 z# Q
      N, S* W; F" s& M( d' q3 r你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1637 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    1 g0 A: r& C- y/ h
    雷达 发表于 2022-9-25 04:47
    $ u! B) I0 O0 s1 k又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    1 f' m3 \. L9 N: a, Z
    * ?6 D5 R; @, c" H  S/ ~9 d/ \# I# k( u/ c, j) H
    $ L9 W  k, Y7 F$ N# m
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    * Q9 s: S9 ]" i6 M  m
    数值分析 发表于 2022-9-25 14:58
    ' M/ s: D' c. t/ z5 g能不能把这个也贴上来,看看和上一个有什么不同?
    / a0 @, [1 u  e. T* ^4 {/ l7 _8 I
    理了理思路,重新做了一个测试。
    / H+ B- B7 [1 |  I+ T. p/ n2 U做了两个 vector 和 两个 float *, 都长 100000
    ; ]. r0 a; W" F, O/ ]外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 Q. v5 m: J. {& o0 I5 K1 i
    ( w+ v) q% _3 }+ y. Z$ {
    内循环试了4种方法,
    4 O9 n. Y, ^  }% e1. 直接调用 vector inner_product 247s 4 k" i: R+ B8 t  C4 e9 s: [" `
    2. vector 循环点乘累加 237s: [( w0 ~9 f# J$ w" v5 F
    3. float * 循环点乘累加 204s/ K: y% x8 U  o# y4 B- K4 _
    4. 空循环 100000 次 202s2 [0 W9 F% F) f2 V
    7 x8 S( W7 O8 z1 q) S
    不做内循环 200s
    4 p8 n( a: q/ D
    3 w- s9 l( j9 H$ E# E( n. w. B7 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    ; o1 ~% u( y3 }3 J8 k3 A另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, t' y- g& b% |' @2 F' }& R8 x
    % Q% M2 b( {5 \* ~$ y: @( ~9 P
    至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ p- f' Y# [* }: T

    6 \0 Q# H3 n: i0 h(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)! G7 k9 t( m$ x* {; d; a9 L0 P

    + S1 E" ~: I# f; R6 A, \# G
            std::vector < float > vec1(N);8 A7 {0 {8 b9 q, h' J  B8 L2 F) _
            std::vector < float > vec2(N);
    - i/ z0 R, a' o: t        float* b1 = new float[N];
    6 W3 k6 F3 p/ K        float* b2 = new float[N];2 Y' l1 E4 s6 q7 a

    * G) }0 M$ t1 X0 e. l        for (int j = 0; j < 6000; j++)4 i% Q4 M6 v! z# C+ f+ K" {  w5 L
            {- K7 l+ J: Q; `
                    std::generate(vec1.begin(), vec1.end(), []() {1 T9 V3 u5 g5 Y5 c8 z0 _7 ]
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;  |5 w; u& |( i
                            });
    ' Q! g4 ~4 X1 u/ g" i2 `+ N+ n4 p: Z* J% f: l
                    std::generate(vec2.begin(), vec2.end(), []() {
    " W8 Q) x8 I: ~: l9 a4 P% X                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    - F; t% j/ \* W7 c; Q9 F                        });9 g2 B& N6 }2 y; ~" U% x$ ]

    $ K5 r& b/ m; c* V                for (size_t jj = 0; jj < vec1.size(); jj++)( M$ I4 P/ i; g" D
                    {
    " Z+ W0 H, [- c& L& |, c                        b1[jj] = vec1[jj];
    2 C9 F3 @' r  M: l9 l2 U8 Y                }
    ; P' n; h1 r& O6 P
      ]  @) f2 s% A, s                for (size_t jj = 0; jj < vec2.size(); jj++)
    2 T8 O% k2 m* A- ?$ E                {
    + G8 S4 Z" \' N- A! k! B' z( {7 }                        b2[jj] = vec2[jj];
    . ~" Q* c% Y# j+ ?                }" @9 T) v& i* l
    % V' |& k& G! G# C# u. j
                    //Method - 1  N=100000 247s  1 ^8 @  l7 o3 E9 d2 ~; ^
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, G/ u- |/ o3 V$ l% a% ?! Z
                                    
    7 y7 P1 D4 o4 e9 e# M9 {% h* j" n                //Method - 2  N=100000  237s
    , x; G% a% }' }                /*0 s, f& Q8 B5 f4 {* i- P
                    for (int jj = 0; jj < N ; jj++); ^6 J7 B# x8 g+ G
                    {
    : B2 @- P% l, {% t                        fresult += vec1[jj] * vec2[jj];
    8 X% J" |. t5 {- ^                }% Z+ \" R  K+ B) P7 b
                    */' g; I  \$ w- f! n) a  |
                                    
    8 O4 C$ ^! l: W6 [" }/ d                //Method - 3  N=100000 204s
    - U0 K* S5 m+ _  D# n+ G; j+ Z; N# W                /*1 B! s; R1 U7 h
                    for (int jj = 0; jj < N; jj++); Z* u( f6 ~! a' l0 _. I+ n# j+ S
                    {
    8 n& r2 E3 g8 `6 B                        fresult += b1[jj] * b2[jj];
      e, g( [# b. u/ C3 X2 g2 r. q                }
    4 P7 p4 [% l% }                */9 P& I8 T# c# j& |9 i

    ( w1 N0 c; i- C% \; B                //Method - 4   202s+ n5 S) v& Z" g* S2 {1 _2 P
                    /*: B# R: ^( \: D6 k$ Z* [
                    for (int jj = 0; jj < N; jj++)
    ! H' h, c# A  `$ T                {" y' i7 V" C, X9 d2 @4 |2 g
                            % G, w( k% J( e& `1 A
                    }
    ( g) c  u1 }  ?: q! {1 z                */. k" x% F7 _7 E: @. ~# W  x
                    //comment out all methods, N=100000  202s                ' @& v. w+ _1 l
            }1 k* C& a% s8 W4 r1 F$ j0 o- P, U

    ( n' A. X! n3 `4 S/ g4 l( m" Z1 U% F8 p        delete []b1;  U& G4 V1 k8 s5 R# W
            delete []b2;

    5 f/ _! B1 _9 `! ]% |5 }) |
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 j' m! i7 U" S% i8 g, F% d
    2 J+ B2 K) _7 X6 T! P
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    5 y7 U' ?/ w/ L2 }) z. J
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    . c3 r( Z2 g! K瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    # O5 Q0 M/ ?: |' {8 h
    " J4 Z8 r( L, c) {0 v你第二个试验里面的j在循环里面又重新定义 ...
    - \8 a8 k- ?2 |; D" A; R
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    0 B) j: y" N; m7 Q; s* R
    9 u  F, B4 g: N* L9 B不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    , l3 k8 ]" F$ q' e& w内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    ) x$ O  C1 A2 ~0 G% ^$ O- T& o5 x9 E6 x9 q0 j+ D
    不和它 ...

    ' `* p2 [: D# d9 I" r: V2 A' ?
    ) ?6 p  q# C% b不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。  E5 |3 P4 ]* x
    后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54; P- \4 e! ^) a4 n8 k9 K
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ) H  U7 b' Q& n% [( a* d{2 Y3 i; i0 b; ]: f- i
            comp temp, xtimesy;

    3 ?6 ^4 e4 c- U* I% v# f这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。$ Q- a" K- \( B& b9 M
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 F! `# l) s$ Y+ ]VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-4-26 01:01 , Processed in 0.050440 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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