设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ' m+ p  J% P( l/ W5 B- K7 Q" o
    4 d- r; s, g8 I! o. q8 {+ U自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。! @  U, u; b6 U3 v- [! ^
    % [8 G* [& I1 E" E0 F+ F
    速度优化问题真的很有意思啊。
    2 B. j8 z1 p& h% U2 [) ], ?: m- Z5 \+ i" c% l. h
    欢迎大家继续讨论

    评分

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

    查看全部评分

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    # b8 u; K3 ?# d" q1 p把代码贴上来看看?; r6 P1 T7 j" V0 T+ h5 o
    5 a) n: l! H. J: L  N: ?  y; y1 T
    难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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-3-29 05:09
  • 签到天数: 1180 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑
    5 e4 S/ F; [/ z' G) n& ~9 I
    数值分析 发表于 2022-9-24 23:04& b! q* v5 ^3 r8 e7 h6 m
    拉下来?拉多少?
    $ E# S4 W4 a' B把代码贴上来看看?

    4 X6 c6 \7 R: r4 p7 U2 g
    , W8 X' k& ?! d% g0 `( \1 Y% @$ {void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)% a; V  A  e) H/ {! }" }# O
    {
    0 ~7 u# H- t& {        comp temp, xtimesy;1 h% o  l3 T! }3 X
            xtimesy.re = 0;) m+ u1 t0 E- S
            xtimesy.im = 0;, s( E. w$ R  ~# ~0 s
            int j0 = lenB - 1;
    ' o7 u" A, i, H/ ]9 n5 ^        int    i, j, i1, reali;6 S: e0 v% T. O2 K- _4 r/ z0 C- q
            if (lenA % 2 == 1)
    4 y3 c& _& o* f7 _* g0 ?  s                reali = lenA + 1;8 y& M' L4 C1 l) ?/ W+ Z1 ]; l
            else
    / o: j5 g0 M5 `/ S) r0 R- e2 X                reali = lenA;
    3 h6 G+ H, k% L: i        reali /= 2;' S# n9 [" x1 R& N
    ; b9 N9 a+ R  Y' O1 _8 K
            int nconv = reali + lenB;
    ) w1 D7 C2 M! F. {        //#pragma omp parallel for1 T5 J  S8 ?. [0 w5 g" E- @
            for (i = reali; i < nconv; i++)# w6 _4 N' e) J% B- E& O+ X
            {
    ! B" e1 U7 D' f1 S6 }                temp.re = 0;
    5 s" G- z/ e* S0 m5 K( j                temp.im = 0;! i) ^, A$ g* g2 i$ @
                    i1 = i;$ f, B1 g5 m9 y$ {! l# A' {
                    for (j = j0; j >= 0; j--)
      G1 a, W5 z( T4 U2 o$ T                {0 Z$ l, T6 B% x
                            /* floating date operation */
    * j# U0 K3 o* v3 ~; `                }
      ~3 G6 n6 S- @2 ?- ~# [
            }" s" l" z: c! [# |; G
    }! w& W9 v; O. V7 ^& i& w, a

    0 M( M1 j1 {9 Z! fxcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    & U) \5 g2 _1 [7 O3 P) _9 _# t% p- _0 ]! e1 m% j
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。- K! o6 Y  K' B+ G" i2 @. V4 M
    现在call xcorr 100次,耗时78s.
    0 D! R, Q* [* {1 Z& i$ G
    ; ~+ K$ L* d* T- Q( i) ]如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. . x/ h4 \. h" a& r

    6 {/ |# L' N! Q( Y( m
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33/ |; H2 x+ p. J  b
    Maybe Debug mode?
    0 u1 o1 h- P4 P8 j( R& s( O
    * t+ Z/ J5 g0 q, W$ y! G
    不应该,看我上面的回复。
    " Y% R# m3 ^$ i. P# V+ P% c1 [. l( a% g8 G4 _+ P) U
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑 ( f2 A: x2 |& K; C
    雷达 发表于 2022-9-24 23:54" t, _/ l; ?) J1 A9 ]2 w/ {: x
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    5 j* }$ A# x$ T* ^2 c5 w; q+ F{
    8 q6 z; r1 s4 `7 O        comp temp, xtimesy;
    2 r# z1 d% r' B

    3 {1 T: O5 g8 f( B" n这个不是这么比的吧。。。$ {1 S1 X% {% g& R+ d

    / }/ s, ?, u8 `- a' `2 _- |您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。- j0 i! T6 V1 ]$ F* F

      n5 P5 x- ]/ v& U# [. D而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    : g/ t1 v5 p) c0 c+ J
    数值分析 发表于 2022-9-25 00:20
    $ y- V0 Q1 n* M3 T) q. ?这个不是这么比的吧。。。3 Y* [7 L1 h! }. _

    . c  o1 n1 d9 h$ Y6 j8 ^) H您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    2 }8 E5 ^# r6 z( j) c! U

    1 p  y. }- C* m# K1 B2 T7 P有道理。4 f- t1 {6 ?- J3 s
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。% ]. y1 N- B" G5 E; F

    % r; C% S) o: w5 r我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46/ H7 R5 _$ f0 A1 e$ v- R
    有道理。
    + M  D7 L# f( s! P$ P所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    % `, J2 e9 P2 e0 R; s% J
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多( @& q' Y/ w% h: H- ]9 X
    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* I9 E4 t' P" @* h
    这个不是这么比的吧。。。
    + l' v3 k. l2 l+ a& _* e
    0 o- ~, _3 v8 W& f您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    1 Q( X! `8 {$ Y  I

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    ; u' n& C1 A7 Z: t8 u
    沉宝 发表于 2022-9-25 01:48
    ) l  U8 h- l1 y# V) I' F/ i3 V现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    / N: D' Q% q: N+ S( ?+ {% q6 s
    5 @6 v, k! A9 V* W$ v0 H5 e
    是的,兄台说的对。
    ' J4 [- @7 J$ i8 I0 @" z: a- i2 B4 t6 {
    其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    , ~5 Z1 \$ o. _; Z+ q" y1 |0 x  ?& a5 L8 r
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    9 B; ~, r+ C) P* ~7 z9 Q
    ; h( o" P# a. B! D4 U比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    " r2 r# A! q9 S- H* e' P
    ' F- }0 _2 T# P2 F当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    : r5 H% j( D7 r* r1 `
    沉宝 发表于 2022-9-25 01:278 c' z1 R0 X; m
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
    ; }1 r8 v$ E( X; u, _0 X
    " A8 d! ]$ @4 n0 m6 I0 P
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    : j. q, M  T. b5 s, _+ Y
    8 f- ~6 |8 P; N( `: f/ H我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47! W3 i. u& u0 g
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    * |. o* U# a- T
    时间差一倍的结果可以接受。
    5 Q) c" T; Z% c, b" t& @4 T
    , o0 [+ a# _& \7 M你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 01:57
  • 签到天数: 1683 天

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 , ?& V1 A6 t; z) ?) w6 b1 i
    雷达 发表于 2022-9-25 04:478 Z, z2 a/ @' `: f) c% Y1 v
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    - r9 Z6 P& Y8 A3 [4 ~7 l! E& u7 c4 S( P/ t" v; Q7 P0 Z1 i
    % |  s: ]8 z! l" W# ~; }
    ' N# k. |! {  V# b
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    / p* |* Z0 T( C" \3 M2 V
    数值分析 发表于 2022-9-25 14:585 b6 Q/ u8 s# A2 ~$ O8 F; J2 o
    能不能把这个也贴上来,看看和上一个有什么不同?

    ! P( f% g( X9 Z# c( q  V7 M理了理思路,重新做了一个测试。" Z! n7 t) s% e' l3 C
    做了两个 vector 和 两个 float *, 都长 1000009 _9 u( k% @  G1 Y0 O6 P
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
      z" O. N  t. h% ?. y, M' v8 e9 k: W0 e2 `
    内循环试了4种方法,
    / [3 [+ f7 `5 r4 K* x' a  \6 K& N  k1. 直接调用 vector inner_product 247s
    0 b8 r7 |. r: r8 F: k8 `2. vector 循环点乘累加 237s( [* q7 G" I. [
    3. float * 循环点乘累加 204s
    * ]& M$ j) @  \4. 空循环 100000 次 202s+ V6 N& a0 `8 o: b& E$ Q

    ! Y5 z+ F! T: l1 R% K. w% c不做内循环 200s, S0 ~* @  u( }
    # N3 M9 X9 u9 ]$ S' b3 a9 H3 D
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    $ e  ^, ]+ Z) |1 e8 V另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
    4 i5 j: t0 I$ A5 a
    : d6 ]: A4 ^# H+ \9 U8 M6 x; b1 L至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
    ; [* ~. F# m0 P. j/ H. Z: e; Q7 ~) V# K0 D
    (为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL). p2 E5 l& Q7 g% M8 y) N3 A
    / W" F+ P  H6 }& X: s) C
            std::vector < float > vec1(N);1 m( G8 s  V7 C% Q, @
            std::vector < float > vec2(N);
    % S9 q8 t1 Z  M2 Y( [        float* b1 = new float[N];
    8 c! ]& K* ^. r        float* b2 = new float[N];
    + M' v3 q) M" Z- f' E0 ^5 Y5 b1 {; t5 y# z8 i( {
            for (int j = 0; j < 6000; j++)
    + u) r$ I, C' [6 e: t: J' I/ X$ b        {
    $ ^9 S% x1 D  h2 g! h+ L                std::generate(vec1.begin(), vec1.end(), []() {: x+ Q& ], b. T! N
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    6 E. n. U% H$ w& o                        });0 n3 p! Q; y2 o: O) y) N

    0 z. `, D9 V# ^/ j7 ?                std::generate(vec2.begin(), vec2.end(), []() {( V% i2 m- m  F6 Y4 P
                            return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
    ! C0 o2 w4 H0 o. V( j$ ]$ j$ T% e                        });$ ~$ r% H3 A2 }1 ^9 z+ {- _2 A

    1 {) S6 L" R! z( Q9 `7 B                for (size_t jj = 0; jj < vec1.size(); jj++)' N9 P$ z4 t6 F( n
                    {
    8 u, H; q& s) h9 E$ Y9 T8 {: Z                        b1[jj] = vec1[jj];
    $ |6 O* e2 {7 G, I( V                }
    ' w  m* {5 K% L3 t
    5 M* U1 C5 r3 m. F                for (size_t jj = 0; jj < vec2.size(); jj++)
    . s1 B3 w& A* \2 Q2 ]" ^                {
    3 k: d) M* S1 [3 V' U! t                        b2[jj] = vec2[jj];5 M# g: f9 J$ y/ b
                    }& F4 A+ n: n8 ]4 O- ^
    ' }5 h, G  R. y0 X/ V6 o* `
                    //Method - 1  N=100000 247s  
    1 x# s- v/ m: z/ T4 r* Z& @% ?                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);8 G6 k' s& M8 W2 v
                                    
    : N) p6 d6 c3 {/ U0 G8 i- _' s  y4 D( }                //Method - 2  N=100000  237s
    2 ]1 o% f9 j" E" d                /*7 x, W( L8 d! l- G2 c
                    for (int jj = 0; jj < N ; jj++)
    ! b( k/ P# a# M! P7 t                {: O9 M+ Q) v$ `3 a" K$ P
                            fresult += vec1[jj] * vec2[jj];
    3 `+ @/ Q3 t, T2 d* W. c9 Z. J                }
      ^/ @: z, T8 {8 m  P: ^                */
    + s; k& K( E$ X* K( X; Z                                
    + t8 W- Z( `/ m                //Method - 3  N=100000 204s
    2 e8 {! X0 N; R& g* F6 z                /** q& I6 b# E" c; u
                    for (int jj = 0; jj < N; jj++)$ v3 ]) Y! v$ ^2 [; U  q
                    {
    4 z9 r: k4 J5 K                        fresult += b1[jj] * b2[jj];
    : ~' M! ?- R% }( J1 M, l6 e. u0 b                }7 D, b1 B' S2 S+ A- r0 y1 m
                    */
    , K% L5 e- z1 W& r* ~
    , Z) P+ y5 j* ~  ~; x5 K                //Method - 4   202s' e4 t2 k' M- s3 i
                    /*
    3 d3 A/ k+ G# L+ L' Y                for (int jj = 0; jj < N; jj++)
    % C+ \: K# s' }; m1 j% W                {
      q! f6 x+ l" ~( p: O8 h                        0 G8 }/ m" y8 y# o3 [
                    }
      K8 @7 r6 Z* w1 o                */
    1 X; f) R+ ^5 x8 {6 H                //comment out all methods, N=100000  202s               
    + \7 s5 |- O  C1 e        }2 g! c$ C; R' P; J
    . T5 }6 X& [# Y
            delete []b1;, n+ E9 L  Q0 K0 H
            delete []b2;

    , d4 g$ ^# m  ~7 R" u+ ~- H
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    : Y0 M: X9 ?3 _) D
    : W; O. `4 h6 Z$ c, B你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    2 _5 H' F/ q+ r* x( p
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    6 X6 G; q$ o2 e9 A" l7 J瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    1 @2 W# l' U$ y1 Z5 ^( s. `& Q- Y1 W' j7 M( K
    你第二个试验里面的j在循环里面又重新定义 ...

    3 w* Z" C0 b& N; A% s3 Y内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    . }" H- P; g7 J( H9 H3 h4 M  }% y$ Q9 s; V2 R5 |
    不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:162 T- P4 U8 B2 V  M: A
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    5 B% g7 I5 V/ U' ~4 p7 ?' u* i3 y5 p% V& L9 i* ]+ K/ {9 e( G
    不和它 ...
    4 K3 j( e6 }& b
    & \. `; d0 z: Y: N1 }
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    . ], Z- Y* }# e+ ?' X/ Z后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:544 h( I* {1 U9 i
    void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) z" i) V+ ?. p$ A$ \1 Q6 T
    {! {6 N: S2 `! l- c; d# |) {
            comp temp, xtimesy;

    8 x8 O$ q& H0 n# b5 x$ ~: H这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。/ k  M) N6 Q$ E6 w3 j
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?2 [, A$ R4 w" K5 Y# M
    VS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2024-6-15 10:14 , Processed in 0.047290 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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