设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?
    ! Q/ j) h# o  s! _9 f0 S" r. k, n& h8 A8 w; [
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    6 `. c$ A8 M# Z$ c4 ~
    7 T& T9 \# b7 L' G. l速度优化问题真的很有意思啊。
    ' R- Z3 Z$ s, R: ?* x0 ]; ~8 S0 K3 i$ L2 q
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    ) h$ h) v7 o/ D7 h/ w8 ^把代码贴上来看看?% @2 F2 \! K+ c7 x) m! }

    " S9 Y1 R. }. U0 c' }难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    板凳
    发表于 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-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 % t. U$ I. e3 u, A
    数值分析 发表于 2022-9-24 23:04) T5 l" L* D4 X  d# h
    拉下来?拉多少?
    9 P1 v% j% f# q; D" S! b把代码贴上来看看?

    " u; N7 Z! y3 M
    ; O! b6 A2 ]$ _# R/ d' _void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    ! D: b0 H) k7 ]' a: ^& f{
    2 c1 U3 R; Z% n0 x. y  A& |' o" U/ b        comp temp, xtimesy;8 x. @9 ~( P. ^
            xtimesy.re = 0;  c  o2 n3 u, n$ w  H0 u8 U) P
            xtimesy.im = 0;
    4 o8 T. Y6 s/ R6 l1 m        int j0 = lenB - 1;: e9 p- b6 C: }% Q: D: A
            int    i, j, i1, reali;" B; M- t0 m! t
            if (lenA % 2 == 1)8 X' n6 |8 r2 j4 c6 J, p* D
                    reali = lenA + 1;& h1 M+ W8 S0 B. ^7 o% T5 R
            else
    8 E) m% F0 I8 }0 b! D* l/ W                reali = lenA;
    2 r1 f$ Q2 y2 a% C, A, w* C4 |        reali /= 2;+ l. w- ]* w! Z1 @5 I
    0 B# I! m7 H. U2 o  V
            int nconv = reali + lenB;! t1 z  t! g' M
            //#pragma omp parallel for1 v( a$ \, }, I( O9 `  |9 Y' c3 t
            for (i = reali; i < nconv; i++)+ w& T" `: i9 m- s
            {
      o# B4 K& U/ Y5 M( H" p                temp.re = 0;
    8 U( r. V9 ~& K+ a" [                temp.im = 0;
      X+ Q  Z1 Q/ ]5 L                i1 = i;
    2 r! s* n' |, k3 K" ^" E                for (j = j0; j >= 0; j--)
    3 O+ k" C6 ~' {" T& B3 g9 t                {3 i" V6 }' d3 }( U
                            /* floating date operation */
    , M3 e* a9 g: s( w" p3 k                }
    * @1 B8 Z8 A9 L
            }. h8 f' y2 g3 t# Z: P; A& K
    }
    6 R( g: h% Z7 f$ r
      G  C0 U5 l$ I' h6 Txcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样: W$ M( R$ l$ C  C/ n" M$ N
    ' F$ f1 d3 j% _
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    8 E% ^& ^& `2 k现在call xcorr 100次,耗时78s.
    9 o. B7 a' L/ a* F  ^/ j4 \1 @2 L
    * N- O+ G/ p) U* {如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s.
    . B# E5 [4 W8 q/ t) I
    ( \8 V3 `# q9 p5 p! H
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
      A. J, e' \* D* G& rMaybe Debug mode?

    1 M3 s" ~5 X& L2 P0 |" ~- `0 ^! K2 Q( g6 V' d. H; M% R
    不应该,看我上面的回复。
    # x3 O7 y- `" m2 C$ c7 P$ M  X9 n4 u+ G4 {8 R
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    7 {$ j0 l7 N: C% j- b! o# ]
    雷达 发表于 2022-9-24 23:54
    / X0 b( l! G  U. I; N. zvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ N1 C" `1 p9 p9 X; x6 p& K
    {
    1 }; ?3 T, S# X7 M- }9 ?  ^        comp temp, xtimesy;
    % s% t0 ]4 [8 b+ G8 w9 M
    # y3 y( ]% d7 x8 b
    这个不是这么比的吧。。。# V4 U1 O# L) Z( E. R, ?

    . ]8 N1 c+ a( V! R) a; S您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    # H5 U$ M" G0 i: E  O# y4 R2 O' [! b) A" y2 |6 L* J0 s. p; P
    而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    ' A& h3 K& @5 Q0 Y) X. p
    数值分析 发表于 2022-9-25 00:20
    ; @5 ~0 l' o9 W2 n这个不是这么比的吧。。。
    . R9 ?* Z; P  O2 Z
    8 l+ l( `0 m# G0 d您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    : q5 G8 v, \2 S3 |4 Y4 R

    * U: s) r3 E* \7 q有道理。1 R- R4 V! @# i) o
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    ! Y/ |( _0 }- W5 E% n, ]  b
    8 t1 F9 F7 |" ~$ j: l4 e: t/ m* I我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46# J9 _+ y1 G% i9 n/ Z& m
    有道理。
    3 \5 c# N* M. ^" M7 o9 S, P所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    / `% l+ w5 h/ U) n6 v4 t
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    : K0 _" x2 d' k0 T9 q0 [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
    5 P. ?! J9 U! N+ n/ w9 b这个不是这么比的吧。。。
    / a6 t: O4 V$ f& ~: d7 E* a. U, d' m; c3 n+ I( B1 b
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    1 u, ~$ X7 E2 J+ |
    ) v  K, L* F7 `; F4 v! H
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果循环这样跑,花不了多少时间。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑
    4 p! f; k9 D) T  c% p
    沉宝 发表于 2022-9-25 01:48
    * o2 @) K9 e: Q现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
    . @% o. v0 [5 [
    7 t1 b( J- H) E0 `
    是的,兄台说的对。6 a& m" w. T% s5 U; X; ~

    + K* Y* S' \% c/ R; J) W其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
      Q6 b! M8 I/ R3 o( \5 W, y5 g
    0 {- Q% f" c; O  S9 \雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。
    , D( d# y' k6 a9 N" \, W% J8 [0 _& P; E9 g; V% j
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。
    . n: X3 V- T; k/ h* \2 J  V! d! E( m- M- R, V& z3 i0 Z/ l
    当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    / p" g1 a* {2 u) g8 n: w; o+ J9 x
    沉宝 发表于 2022-9-25 01:273 h7 \5 t5 o  @- k6 z+ C* b7 k9 \0 I
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...

    ' I7 c/ I! i9 h8 U  L+ k
    * \* k( s: u5 _; ~3 ?又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    : K7 y& V' G% r3 c2 s) }3 U2 F# c- Q
    我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47
    8 `4 |0 v; S, l8 h" \7 I% w5 J4 ^又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    3 z0 i# ]# c3 u6 e时间差一倍的结果可以接受。
      ^  a* k; [- I0 `1 S& e% e; e, n' Z. D$ ~& X! L5 D: p) K4 k" W' d6 w  \
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑
    , q2 K  h# Q, b, A
    雷达 发表于 2022-9-25 04:475 g( `, q0 N# U
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    + C# @0 H/ w, H: a
    + A3 O) R0 e% k- u+ }8 w: O" o5 c
    1 q7 s1 X- J* P& F0 ]' ?

    . I( z$ K/ t" n5 }. v4 Q能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    & {  \5 W1 d6 B5 Q
    数值分析 发表于 2022-9-25 14:58
    ) D7 x1 v9 p4 X( D$ t3 D0 [+ A能不能把这个也贴上来,看看和上一个有什么不同?
    / G' k5 V' P% y% i: i0 T) z% J
    理了理思路,重新做了一个测试。& L1 h& g* `! {0 f
    做了两个 vector 和 两个 float *, 都长 100000. Z2 P9 n, p# W3 @' i3 R- r
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    # k, ?2 z/ L+ c. U: P2 U
    9 ^# Y8 @' t5 L6 b内循环试了4种方法,
    / M, J: B4 b. V+ p  s; T1. 直接调用 vector inner_product 247s 4 e4 I& K1 z6 T4 t5 E5 L* C, @$ X
    2. vector 循环点乘累加 237s3 H, p$ J6 i. ]6 z" ~/ ?. {+ `, z+ ~
    3. float * 循环点乘累加 204s
    * M5 e( c' F$ J' b& o4. 空循环 100000 次 202s
      B7 g6 b! q1 t1 U2 |4 S; G2 _' I4 w/ ?& d' e- u+ c; O' d. O: m
    不做内循环 200s
    0 ~& B4 g/ ?# V" T- q! k& G, J  C$ P- L4 _
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。% t; W9 [3 }$ q# p
    另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。& O+ J! }" Q0 U

    8 ^+ v7 X9 d) ~" ~/ P/ E8 W9 H至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( g- {* x; l4 B, {4 {

    - ?# e' H$ y" B# g# l(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ( {- i, ^; i& ?. k9 B* k  a4 ]' F; Z0 |
            std::vector < float > vec1(N);
    ! r4 W5 k  ]! R+ v        std::vector < float > vec2(N);
    2 A' c2 k$ b$ D) u) E4 M: u        float* b1 = new float[N];' I! x( D: H, r9 N/ l' S
            float* b2 = new float[N];6 z4 i) t* S9 Y/ A3 P% F5 u, I" c
    % E2 l8 E* V$ t; L
            for (int j = 0; j < 6000; j++)5 w! b8 I% h: G2 y
            {% n7 N$ v6 \9 r1 R, G/ u9 b* f
                    std::generate(vec1.begin(), vec1.end(), []() {
    ( y  E- F1 A$ ~) G                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, Z' |# [! t3 ]: C" L7 y' t
                            });
    ' J* v' U6 E) l6 K5 a) E7 a$ v% T9 u; v% ~: o/ Q* Y) @* ?
                    std::generate(vec2.begin(), vec2.end(), []() {
    2 [& \0 p% b& b4 t/ A                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, z* O; z8 N! j
                            });
    7 N4 }& D# }+ o% T
    ) X, S) J7 F: a( Q6 p" U" i5 Y                for (size_t jj = 0; jj < vec1.size(); jj++)* l$ F3 E; }) {' n# T( }6 b2 N( b
                    {2 }* J' I. h/ {5 Z" a. F# [. k
                            b1[jj] = vec1[jj];
    ! u8 \8 E) L% I. ~7 u; `                }
    1 u+ q6 d1 q' c' ^/ A
    * I% ~, j8 ~4 v& ?                for (size_t jj = 0; jj < vec2.size(); jj++)
    9 q+ q7 \* c9 G2 ]& _' @                {
    - R- H  ]4 u  U) i' s" f                        b2[jj] = vec2[jj];
    0 s: S& I6 a) I/ F                }
    + H9 p1 O3 V% o! I4 N! h8 a7 G& L
                    //Method - 1  N=100000 247s  - y; N1 P+ C* g. \3 D6 n8 P
                    //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);( r% `/ ^5 g: `: j4 j% D) M
                                    ! X- y# A& J+ }  t. o
                    //Method - 2  N=100000  237s
    $ p. y% H0 v: f, }6 C% [, n8 `                /*
    & ~6 d9 ~. r: u0 B                for (int jj = 0; jj < N ; jj++)- |) s9 w$ H/ T+ |" k& R6 g! ~
                    {% ~$ s, a  l; |% @
                            fresult += vec1[jj] * vec2[jj];
    0 |6 ^/ a" n& k7 W2 [; T6 ]/ i                }* ~" X" R" s; m
                    */
    0 G# {% f& {  ~- Q* M3 D5 @                                
    9 X  _7 J" m4 P. ~1 k                //Method - 3  N=100000 204s. ~9 |: T" a* S: q8 k
                    /*
    2 C8 G+ o% k& v8 ?/ j4 e                for (int jj = 0; jj < N; jj++)# k4 t9 G3 a7 _8 ~
                    {; U& o- n3 T. H* o  ^
                            fresult += b1[jj] * b2[jj];- E3 K3 M9 ^% W6 [
                    }
    8 f  u! k4 [8 C" {& e0 I5 B, X                */  R, I1 \6 I3 l6 P4 c; X
    % m2 ?' S4 V; J: ?! A4 c$ t, L
                    //Method - 4   202s
    ( x2 h- w- M0 `  f/ I# i                /*
    * i  Z$ C0 d- j+ P/ X, \                for (int jj = 0; jj < N; jj++)
    3 e) f- `, O7 i7 ]                {
    2 [, F! X1 T) Q                        3 g& ^# C: [( @) T  f/ V' r+ e/ w
                    }
    ( C: B9 K/ b- z2 @7 o2 D                */* t3 r- D* M# m; b9 |
                    //comment out all methods, N=100000  202s               
    3 [, }2 |3 f1 H0 h! l        }
    % X, s- C, Z/ a  \, y' P% J- U" G4 ~" E& D( L
            delete []b1;3 t6 G" S" {. d8 G
            delete []b2;
    $ {3 u3 i. x6 O
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    ! L7 U$ c7 v6 ~8 G8 F" h7 ?" l  e4 g, e% Y
    你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?
    6 k" Q5 V4 _1 _  q5 H4 s( I' n
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-12-25 23:22
  • 签到天数: 1182 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15" ~- Q% A0 a1 @9 E/ J' e! t2 R
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?1 V) `2 E8 r0 e1 D

    4 X, u  ]1 Y, J# v4 A4 X你第二个试验里面的j在循环里面又重新定义 ...

    ' X! E1 b  A, [, _: l内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    9 P# M; F/ V( S4 ^
    $ a  a9 `1 e* x# k不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16, W% u7 R7 D; w9 s* `
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL) z# T& G% z) u' d
    $ m" \0 D2 i+ F8 |5 }, G: u
    不和它 ...
    - ]' a4 ]4 s2 I7 j

    ; I9 y6 S  j# g4 u0 a/ U! s; J5 R; N  n不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    & S: |* p( I" B9 R# Z9 Y后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    ' t& k& M. S6 R/ z' v8 w0 ?void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
    % f# N, M  R( c/ N{% u* C7 G, s  i/ R. U0 @7 h: D* e
            comp temp, xtimesy;
    # ?0 A, v6 Q9 q
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。# Q6 R5 n6 O" p  B( X: N. `# g
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    0 p* i) X) k$ j& C4 pVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-1-28 10:09 , Processed in 0.066734 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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