设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2022-9-24 22:54:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    C++ 比 Octave 慢好多,怎么破?2 z8 n9 ^' N/ t! y# ^* s
    % v1 P# h7 ^. O
    自相关两层循环,内层循环涉及浮点数计算,试验了一下把内层循环内部全都 comment out 只留个壳子,  但空的内层循环本身就把速度拉下来了,看来问题并不在浮点计算。
    0 w1 U6 z. P' m4 c5 S7 j5 G8 [1 r
    , `4 t0 ?. @( x- F' ]3 R: C0 I; U/ w速度优化问题真的很有意思啊。1 f7 |0 T/ N; o) o! N% \
    . ~% m3 i5 f( P% e0 v
    欢迎大家继续讨论

    评分

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

    查看全部评分

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

    [LV.Master]无

    沙发
    发表于 2022-9-24 23:04:16 | 只看该作者
    拉下来?拉多少?
    - i1 B2 o; M. C/ }( X把代码贴上来看看?
    2 u! t  [+ W$ @" P# _* D, M& X
    5 \  p+ R' H5 Q/ W! y3 I8 X难道分支预测不准破坏流水线执行?不该啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

  • TA的每日心情
    开心
    2025-6-14 10:13
  • 签到天数: 124 天

    [LV.7]分神

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

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2022-9-24 23:54:10 | 只看该作者
    本帖最后由 雷达 于 2022-9-24 23:57 编辑 8 v' a  D7 E% L3 F2 E* [, c) c
    数值分析 发表于 2022-9-24 23:04
    ( F. w2 M# K& S( u. z: `; ?) d拉下来?拉多少?0 X" I5 I3 |) P7 c+ A+ U
    把代码贴上来看看?
    9 P% o4 m9 d) R8 m

    + {# K& g$ u* \) X+ S# vvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)) Q) X6 f/ `1 p) j6 }/ a
    {
    - U2 z) g- A/ Q% Y        comp temp, xtimesy;
    2 _2 X9 G6 k) x% E        xtimesy.re = 0;
    ( Y& {" ~5 S  g& J$ Y; W        xtimesy.im = 0;& d) O0 b2 r; U+ \8 [. D3 G
            int j0 = lenB - 1;2 ^: b2 _' [% [! s( ?) E/ i
            int    i, j, i1, reali;7 P' c5 S% f0 E  W
            if (lenA % 2 == 1)
      _+ h# |" H" n+ u/ h$ N                reali = lenA + 1;
    4 z. u9 G" M+ i& G2 h# e        else/ P3 f; i2 f2 j' O* ^, v
                    reali = lenA;
    * u5 J" g  b  m        reali /= 2;- {2 N0 P$ x) P  X8 R$ f' T
    ' E7 I2 y9 G! I( h8 C5 b" p1 y
            int nconv = reali + lenB;
    $ m% h1 F, w0 r        //#pragma omp parallel for& T* z' Y$ \3 U1 ?% \0 D" U7 L
            for (i = reali; i < nconv; i++); Y' Z, t" T8 l1 Z; L1 D
            {' o9 }; r, t8 L/ m0 Z
                    temp.re = 0;
    ; d6 i8 ?) ?/ }: u5 N                temp.im = 0;! X8 D$ k6 {# Z; `
                    i1 = i;: W) r2 k  `& ]1 a0 F
                    for (j = j0; j >= 0; j--)6 ~" M! E5 H; e# b1 g" B
                    {
    1 U! g# u1 H& W+ C3 Y, Z. S                        /* floating date operation */" e$ F: N8 C2 H' n  w2 E
                    }
    * A8 D) {! P) A  E' z4 W1 g6 h( A) G
            }
    : m! J' T" O1 S}8 u3 H/ P$ W! P- n
    : p8 n( {6 E% U7 [
    xcorr函数代码如上,comp是复数struct, 做过长度为11、19两个矢量的测试,和octave结果完全一样
    * x$ c( h3 k' |' A8 P1 t2 z5 i2 S, m9 R5 o" B
    红色部分是内循环,现在其内部操作都comment out 了, j0大概是 6000。
    8 k) Y3 {, T% t0 r7 [+ H现在call xcorr 100次,耗时78s.. o: k' U) I2 g& p; H

    2 s' D% q& _: j- H3 f如果把红色部分内循环本身完全comment out, call xcorr 1000次,耗时 <1s. * p; o; X# P( M7 G* j

    " I5 i2 _3 B' A# s3 f! Z
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    6#
     楼主| 发表于 2022-9-25 00:17:17 | 只看该作者
    风雨无阻 发表于 2022-9-24 23:33
    $ k% t; t$ }% Z  E! A( {Maybe Debug mode?
    " Z$ n$ B7 @* }6 ^5 w: j5 b
    ! H: x2 x! Z# D9 }- U
    不应该,看我上面的回复。$ ~' _  F( a# D4 |' m0 X* h) i
    $ n; b8 O" M4 \- A+ V1 l- z
    我更怀疑是 VS 社区版的问题
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    7#
    发表于 2022-9-25 00:20:10 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 00:24 编辑
    % j* |. G, |5 p+ s& G, T
    雷达 发表于 2022-9-24 23:54
    ) x6 Q0 z# {0 Evoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 m* p8 N  E* r2 a/ D$ j2 \5 F5 G" j
    {
    8 E3 d9 ~8 Y0 b; Z        comp temp, xtimesy;
    0 j( N, {( X, O" K+ E4 k$ V) e

    # }: N3 f9 n3 L( {4 {( z这个不是这么比的吧。。。
    2 J7 K1 Z! F- ~6 }: J; i; K% r5 _' ?7 y* Z. y' t# T  _9 x- m7 y" J' x
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。5 W9 D8 ]  V: _" x8 L

      T. C9 X6 l# {5 R; o6 v而加上内循环,光jmp和dec指令就至少多执行了6000个,慢个几十倍不是正常的么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    8#
     楼主| 发表于 2022-9-25 00:46:56 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 01:09 编辑
    : D' Q8 u0 Q: K
    数值分析 发表于 2022-9-25 00:20# K8 u. c/ {# q: Y, V" G
    这个不是这么比的吧。。。
    5 F# \. y8 w2 c' J: L/ v0 G; t0 f0 V9 e( c! G# L* N
    您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    6 R  g) N4 e3 I5 E" ?
    & o. d, B" k5 }7 W+ U
    有道理。  Z! z; q/ M) R( z; Y, L
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,记得 numeric 库里有算向量内积的,我回头试试。
    2 W" F! ?  e  W% X; r. m' S: E9 `: v) W6 f4 c
    我先尝试尽量用标准库,一个小程序,不想搞得太复杂。多谢了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2022-9-25 01:27:53 | 只看该作者
    雷达 发表于 2022-9-25 00:46
    9 H7 X- H) z# d' @有道理。' H2 \' N# Z, J% b2 Z2 T$ O
    所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
    . E( b/ ]# J* {' }% ?, s
    你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子,把循环本身翻译成机器指令loop或dec/jnz,两者速度上会差很多
    & @8 R' p. U- [5 rWhy is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2022-9-25 01:48:51 | 只看该作者
    数值分析 发表于 2022-9-25 00:20+ f4 m" y1 C* M, I7 h! k
    这个不是这么比的吧。。。
    $ b& P, H! O& K# I, v9 a6 p
    + e- O3 T" j* u' p9 D8 t3 @您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
    而加上内循环,光jmp和dec指令就至少多执行了6000个
    ! d6 J5 `3 V' {9 j

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

    使用道具 举报

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

    [LV.Master]无

    11#
    发表于 2022-9-25 02:06:44 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 02:16 编辑 9 F& R* q( I4 w" r
    沉宝 发表于 2022-9-25 01:48; H+ m  U) ~  z2 _+ e/ W5 r% Z
    现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...

    * f: q! M2 W  [4 x+ v8 k
    6 x' S/ P1 V6 t; E是的,兄台说的对。$ J0 g+ Z0 H) |

    : D0 I8 @* n; S$ f9 F% @其实我想说的是 真正数值计算部分和代码中其他不直接计算的overhead的比值这个事儿。
    * s. y7 P4 C8 h6 o, B" R1 S: U0 |1 X& W8 a
    雷达兄构造测试用例的时候,屏蔽掉了所有计算的部分,使得剩下的都是overhead,这样run time比较的结果就显得好像不合理了。如果把计算加回去,计算部分的run time会dominate,结果就不那么离谱了。因为不好说,所以用指令数对比的方式试图直观地说明这一点。! O/ f3 d/ |8 f: E9 h0 F: o% E& H
    6 ^& k3 y% D- y' l  n0 _5 f5 S# a, B
    比如说,如果有计算,那么跑六千个循环相对于计算应该用不了多少时间。但是如果一边是什么都不做,另一边是六千个循环,那六千个循环比什么都不做慢几十倍了,就不是那么不合理了。; u# G, k7 J: _2 `9 i* C: @

    4 X- n' \" Y  E6 o当然也有可能像兄台说的,是优化参数的问题,但我觉得更多地是测试用例设计的不合理。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    12#
     楼主| 发表于 2022-9-25 04:47:43 | 只看该作者
    本帖最后由 雷达 于 2022-9-25 04:49 编辑
    7 c5 Q8 M5 J% U# X4 B# E
    沉宝 发表于 2022-9-25 01:27
    - [4 H2 I# |% u你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
      ~- N/ W$ b' a* n) }% r7 D/ }9 y

    1 d2 X: b& Y- K# N1 h, n又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差一倍,我上面这个差的太多了。
    " L9 d; d2 S% D# u4 i' Q# S
    1 r* o! L) E+ P) _! a- q我已经完全懵了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2022-9-25 05:51:23 | 只看该作者
    雷达 发表于 2022-9-25 04:47" `( R4 y& r% Q" N- P" j
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
    - @0 w% `: k3 H# @% e* D# q
    时间差一倍的结果可以接受。
    3 t( f0 P+ m/ s4 u4 j' Q4 |4 J* r) f/ {) A2 Q
    你还是用profile工具看看吧。现在大家都主观瞎猜。
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]无

    14#
    发表于 2022-9-25 14:58:59 | 只看该作者
    本帖最后由 数值分析 于 2022-9-25 15:38 编辑 7 U% t4 S$ n7 p1 I9 y- N
    雷达 发表于 2022-9-25 04:47+ n* h" a" s0 v- g7 }9 d
    又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...

    % v3 ]$ ]* p4 o  D4 e
    8 j2 X# |5 N1 J
    ' b/ q: t, P* H, a2 W$ Z4 c$ V  k: `8 Q3 t
    能不能把这个也贴上来,看看和上一个有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    15#
     楼主| 发表于 2022-9-26 01:30:03 | 只看该作者
    本帖最后由 雷达 于 2022-9-27 01:17 编辑
    & z! D) H3 y4 z! g& ~) n
    数值分析 发表于 2022-9-25 14:58/ X; |1 I  h8 B
    能不能把这个也贴上来,看看和上一个有什么不同?

    % P& C( Q$ {& Y- L4 b+ Q6 F5 I理了理思路,重新做了一个测试。
    8 \% U: |6 p; L5 @' ?4 n: H, m做了两个 vector 和 两个 float *, 都长 100000' s# W7 }1 [/ P7 Q; v1 q. D$ E
    外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
    4 G* l8 f/ d1 `2 a7 K4 [" H, J9 p) j; F, v8 ^
    内循环试了4种方法,. y' E- l4 y, R" I& G6 f" U
    1. 直接调用 vector inner_product 247s & }. }4 W2 v  W  C
    2. vector 循环点乘累加 237s! X  _9 G9 f" v# E
    3. float * 循环点乘累加 204s( w; J: ~, X; l! Y8 A# s4 Q
    4. 空循环 100000 次 202s
    ' k. f  e' q" b2 l  r( q
    & |# u0 I8 |/ h" e2 K, Z6 Y0 {4 ~不做内循环 200s. B& w/ D( |0 o# R
    3 P9 m% _# ~4 m/ H0 X
    你昨天说的对,内循环本身占比是很小的,大头在其他处理。
    : ?" ^$ ^9 o/ r8 u4 _另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。' q3 g: ^1 k4 U; U8 l( a

    ' I. J- o& Q+ N9 a, Q) j" O至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)  Y) O- q! G/ v, D# @, z' e& d. e7 w2 W

    $ e9 N: Q9 D3 k0 V* D. s! B(为什么下面我贴的  b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成  jj 好了,原来 方括号里的 i 是斜体标志  LOL)
    ! [% x/ ^6 F0 b9 N
    $ W- `) x3 x7 I5 F. {% ]
            std::vector < float > vec1(N);5 I+ ?1 F2 L' u- \2 i) f
            std::vector < float > vec2(N);$ O! W7 r" Q/ E/ j
            float* b1 = new float[N];
    9 |& p( T$ G3 b( [! V0 p        float* b2 = new float[N];7 L% ~' F- H: R+ b

    / d: G2 h; t, y5 b        for (int j = 0; j < 6000; j++)
    & ]" I5 H& z* s: ^( b* x5 j        {8 t" E; ^- U0 l8 H- V% p2 u
                    std::generate(vec1.begin(), vec1.end(), []() {
    7 Y& a/ j  M# |! ~5 R2 J' ?; t! s% V9 L                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
    ! L$ v5 G' }! C+ U4 i- l5 o                        });) W; W9 |, J, e" s

    % u- {; ^  R6 \0 _- U                std::generate(vec2.begin(), vec2.end(), []() {
    ( T) \# V7 K% }                        return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 V; D9 G) {6 v  B* J7 T( ~
                            });9 d) |+ `, g& f

    5 M# A5 a* Y; I: r2 f2 W! ?5 s                for (size_t jj = 0; jj < vec1.size(); jj++)
    6 h5 Y6 @* A. o# s  ]1 `8 [* K) A                {8 C- p& r: a9 Y2 U7 i$ D
                            b1[jj] = vec1[jj];2 _% Y3 ~7 ?( }  \9 V' Y, K
                    }/ N3 Y0 S" l9 F! `2 e2 i& @

    0 M7 j. l" T; X+ b9 d% X                for (size_t jj = 0; jj < vec2.size(); jj++): _: f% N! N' w$ ]& D& J
                    {: s1 M/ o* J" h! b
                            b2[jj] = vec2[jj];
    3 x- k/ h3 K. J# F9 Z                }
    % M$ n% m$ ?2 u9 z( ]2 }- u8 ^, [5 |* D+ H; k
                    //Method - 1  N=100000 247s  
    + U  I9 C+ B; }% G- H# G2 Q1 `                //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 m& v! B3 {- @4 A. Z
                                    " E2 G3 E1 [. ]' i
                    //Method - 2  N=100000  237s# L$ p7 O# |7 _: ^+ F, m; |! I; c
                    /*
    , n+ }) i6 e+ R0 D3 S+ }, c                for (int jj = 0; jj < N ; jj++)
    4 b* s# G! i5 w1 F, e) G                {5 V8 G; H6 p6 g. P
                            fresult += vec1[jj] * vec2[jj];) m7 _; z( q; w  w
                    }
    3 x% V/ B+ q; w- Z& K( {                */
    : n8 d" i3 f0 @& y) U. w/ `5 D                                , L% e5 Q" S+ S* q, A  `- ?8 B- S
                    //Method - 3  N=100000 204s& ?* _9 V4 v, c8 \+ F
                    /*! O! Z, d  G# Z
                    for (int jj = 0; jj < N; jj++)
    . E' r' i/ ^0 @1 ]                {/ a& J/ I# S0 _6 i$ g' c( V
                            fresult += b1[jj] * b2[jj];* q- ?$ Q$ X& M7 I, F) i
                    }; x0 R4 Z( q+ D& s9 I/ f8 [! K/ s
                    */  S9 y6 {8 v( r. M3 e

    $ H; x/ R3 J* N0 j                //Method - 4   202s
      _4 r3 ]9 @9 ~+ p2 I% w                /*" @( c5 h9 O- R& k
                    for (int jj = 0; jj < N; jj++)$ g8 O, Y6 v. z2 a4 r5 j
                    {
    ; o8 \! F$ n% U- c3 l% L                        ; ^6 b9 ?! G, t$ Q% k
                    }
    9 j& W6 j) f) o/ ^- z, C( ~                */2 E/ g8 Q8 U8 Y5 n: _* u2 y3 C0 C
                    //comment out all methods, N=100000  202s               
    # g3 W. b( o: k" h) F" r' V        }
    : v5 [. s  `# _; K, v/ ?
    8 Y. _) M, T- G5 t        delete []b1;
    , ^9 C, a" _: u8 T: h( `        delete []b2;
    6 u2 K/ V& J. J
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    16#
    发表于 2022-9-27 00:15:38 | 只看该作者
    瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
    . a3 M; M, s$ q  A/ }5 |) P' F
    / l% L2 J3 o: C: w: u0 J% U" p4 `你第二个试验里面的j在循环里面又重新定义了啊,你确定真的跑了6000次?8 K. n1 Q% s$ ]5 @7 P" F8 X# C
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    17#
     楼主| 发表于 2022-9-27 01:16:03 | 只看该作者
    机器猫 发表于 2022-9-27 00:15
    7 t: `9 w( T2 e& Q瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?# l, k* o6 Q" t' T. N0 j

    - w/ N9 S) ]2 B  s5 [8 s+ r* n你第二个试验里面的j在循环里面又重新定义 ...
    , w, ?0 w2 N+ P( ~
    内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    - p9 c4 ~. }/ b* f8 p3 C
    9 x! d* K0 F9 \不和它较劲了,瞎耽误工夫,我已经转到 ubuntu, 也准备顺便试试 avx2 向量化。
    回复 支持 反对

    使用道具 举报

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

    [LV.1]炼气

    18#
    发表于 2022-9-27 02:06:58 | 只看该作者
    雷达 发表于 2022-9-27 01:16
    : [. T0 L4 t8 a内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
    % Z# T1 K0 W' I+ I$ X9 d( o' g
    # b; T2 b. Q6 b. g  q不和它 ...
    / o6 v7 N7 P5 f+ M
    . s& v  ~8 M& {" c8 E$ P9 P
    不过可以试试我说的register变量。前一个试验j是混在一堆其它变量里一起定义的,很有可能是在stack上,这样内存读写会更多,要是再碰上每次都需要加载cache就更慢了。
    9 c0 J5 V6 R  U7 ?9 t后面一个是在循环那里定义的,说不定编译器就把它优化成register变量了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    20#
    发表于 2022-9-27 20:29:50 | 只看该作者
    雷达 发表于 2022-9-24 23:54
    0 V. {2 u7 i3 h7 `; }! Qvoid xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB): _$ X2 N) V7 S- z  m% H
    {
    0 v. J3 G) t% R7 S, f" b1 Z8 Q        comp temp, xtimesy;
    3 V/ U! T* w6 j! k
    这个code里面如果Openmp没有被注释掉的话,那么temp那个变量应该是定义在循环里面,否则线程之间会存在争夺写入那个temp的风险。" z/ S6 K; z' e4 F# }
    内层for循环如果没有内部操作的话,编译时应该被优化掉了,和你完全注册掉整个循环是一回事。可能你的编译设置没有打开优化?
    9 h' ~8 w2 x( jVS社区版没有问题,我工作用的就是社区版,设置正常的话不会比商业版差。以前游说头头用Intel Compiler,他说不想花钱,而且差不了多少,就一直用到现在。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-10-20 06:03 , Processed in 0.041236 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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